mrand's blog
ABAP Minesweeper
Wed Apr 01, 2009 1:28 am
01.04.2009 На сапфоруме иногда упоминается контрол CL_GUI_HTML_VIEWER, про который известно, что с ним можно преодолеть все юзер-интерфейсные ограничения абапа, и что на практике делать этого не следует, так как получится нестандартно, да ещё и пользователей разбалуешь.
И есть одна область, где такие недостатки являются достоинствами, это абап-игры. Зачем вообще браться за игры, каждый решает сам, но если уж делать, то делать хорошо. В общем, я сделал абап-игрушку на CL_GUI_HTML_VIEWER. (Судя по гуглу, впервые в sap-сообществе?)
ABAP Minesweeper
Исходный код: здесь
Аналоги: раз, два
Итак, игра с HTML-интерфейсом. HTML-оформление сильно выигрывает у ABAP-List. Причём связка HTML и JavaScript сама по себе настолько достаточна для игры, что ABAP там уже и не особо нужен. Но ABAP - это наше всё по определению, поэтому вся логика в Minesweeper сделана именно в ABAP, а в HTML вынесено только представление. Для иллюстрации такого устройства программы, в игре есть 2 режима отображения: и новомодный HTML, и через старые добрые WRITE-ы. В ходе игры доступно «горячее» переключение между двумя режимами.
Спрайты. GIF-изображения хранятся прямо в ABAP-коде. Это хорошо, так как не потребуется инсталляция картинок на сервер/клиент. И это плохо, потому что нетекстовые данные в коде программы вызывают настороженность.
Взаимодействие ABAP и HTML. Каждая клетка поля имеет свой ID. Клик мышкой на клетке посылает из HTML в ABAP событие SAPEVENT со значением ID. ABAP-обработчик формирует в ответ массив «что надо перекрасить» из пар {ID, новое_значение}, и отправляет его в HTML на отрисовку.
Новые возможности HTML ввода/вывода по сравнению с ABAP-List:
1. клавиатура – все клавиши (в ABAP - только F1-F12),
2. мышь - все кнопки (в ABAP - только дабл-клик левой кнопкой).
3. скорость - частота обновления экрана ограничена лишь скоростью сети между сервером и клиентом (в ABAP обновление экрана – не чаще чем 1 раз в секунду).
И ещё, не весь какое усовершенствование, но у других не видел: представление игрового поля в программе для простых board-based games,
вместо использования itab-ов со столбцами {X,Y,Value}, я нахожу более удобным использовать просто непрерывную область памяти, и немного поиграться c адресной арифметикой. Казалось бы, манипулировать такими данным будет непросто? Посмотрим:
На рисунке показано игровое поле размером 8 на 8, имеющее дополнительный бортик снаружи, который можно не показывать пользователю. В клетки бортика записано значение, не встречающееся на поле игры, что позволяет не делать унылые проверки границ вида IF (x LT 0) OR (x GT cols) OR (y LT 0) OR (y GT rows).
Игра 8*8 удобна при отладке, так как клетка в строке 5 столбец 2 имеет индекс 52 (ID = индекс).
Пример 1: Печать поля без бортика
ofs = min. DO rows TIMES. NEW-LINE. DO cols TIMES. WRITE board+ofs(1). ofs = ofs + 1. ENDDO. ofs = ofs + 2. ENDDO.
Пример 2: Закраска непрерывной области одного цвета
"eight_directions = [-11, -10, -09, -1, 1, 09, 10, 11] FORM cell_floodfill USING start_ofs TYPE i color1 TYPE c color2 TYPE c.
DATA: floodfill TYPE TABLE OF i.
board+star_ofst(1) = color2. APPEND start_ofs TO floodfill.
LOOP AT floodfill INTO ofs. LOOP AT eight_directions INTO dir. i = ofs + dir. if board+i(1) = color1. board+i(1) = color2. APPEND i TO floodfill. ENDIF. ENDLOOP. ENDLOOP. ENDFORM.
Возможна быстрая и наглядная обработка всего поля операторами SEARCH, REPLACE, TRANSLATE.
The Trackback URL for this entry is:
http://www.sapnet.ru/trackback.php?e=41
Author |
Message |
Armann Модератор
Joined: 01 Jan 2008 Posts: 422 Location: Moscow View Blog
|
Posted: Wed Apr 01, 2009 8:36 am Post subject: |
|
красота |
Back to top |
|
|
John Doe Модератор
Joined: 05 Nov 2007 Posts: 725 Location: КраснАдар View Blog
|
Posted: Wed Apr 01, 2009 8:50 am Post subject: |
|
И лепота |
Back to top |
|
|
admin Администратор
Joined: 01 Sep 2007 Posts: 1640
|
Posted: Wed Apr 01, 2009 7:55 pm Post subject: |
|
Даже не ожидал, что в этом блоге так красиво можно оформить. Зачёт! |
Back to top |
|
|
|
Russian ABAP Developer's Club Forum Index
-> Blogs
-> mrand's blog
-> ABAP Minesweeper
|