Думаете это не возможно? А вот и нет! Для этого нужен MIDletPascal — прога, которая транслирует исходный текст на Паскале
в байт-код J2ME (даже не нужна установленная java машина). Таким образом, вам остается только написать на обычном, но
«слегка» урезанном паскале код и на выходе вы получите 2 файла: jar и .jad. Стоит отметить, что MIDletPascal после
установки весит менее 3 метров, но обо всем по порядку. 

MIDletPascal — это компилятор, так что для полноценной работы над было бы неплохо иметь еще и эмулятор, чтобы не проверять
каждое изменение на мобиле. После запуска мы видим перед собой поле, для написания кода, в котором уже будет простейший код:

program New; 
begin 
drawText('Hello world!', 0, 0); 
repaint; 
delay(2000); 
end.

Как вы наверное догадались, после выполнения такого кода на экране мобилки появится надпись «Hello world!». Сразу стоит
отметить отличие от паскаля, в котором мы бы просто написали write(‘Hellowrite!’). Здесь такое не прокатит. Связано это с
тем, что write печатает буквы на стандартное устройство вывода, т.е. консоль, но в теле ее нет, поэтому нам приходится не
печатать слова, а рисовать их. 

Я предлагаю написать простенькую игру — арканоид. У нас будут кирпичи вверху экрана, кубик, который будет летать и
разбивать их, а также доска, которой мы будет ловить кубик, чтобы он не упал вниз. Так же неплохо было бы
добавить при запуске игры какое либо приветствие и меню с выбором действия, например: играть, автор и выход.  

Создаем новый проект и пишем код процедуры, которая при запуске будет вы водить наше сообщение 

procedure on (st : string) ; 
begin 
setColor(255, 255, 255); 
fillRect(0, 0, GetWidth, GetHeight); 
setColor(255, 0, 0); 
setfont(FONT_FACE_SYSTEM , FONT_STYLE_BOLD, FONT_SIZE_LARGE); 
DrawText(st, (Getwidth) div 2, ((Getheight - 6) div 2) + 1); 
repaint; 
delay(1000); 
end; 

Все просто. Теперь нужно создать меню. 

procedure menu; 
begin 
ShowMenu('Выберите действие', CH_IMPLICIT); //
это
заголовок меню 

igrat := MenuAppendString('Играть'); //
это добавляются 3 пункта меню 
about := MenuAppendString('Автор'); 
vyhod := MenuAppendString('Выход'); 
play := CreateCommand('Выбрать', CM_SCREEN , 1); //
тут добавляются команды, для 2 кнопок сразу под экраном 
AddCommand(play); 
exit := CreateCommand('Выход', CM_EXIT, 1); 
AddCommand(exit); 
repeat //
запускаем цикл, пока игрок не нажал одну из 2 кнопок 
delay(100); 
clicked := getClickedCommand; 
until (clicked = play) or (clicked = exit); 
if clicked = exit then halt; //
если выбрали выход, то... 
showCanvas; // "убираем" меню 
if menuGetSelectedIndex = igrat then igra; //
смотрим, какой пункт выбрал игрок и в зависимости от этого вызываем нужную
процедуру 

if menuGetSelectedIndex = about then ab; 
if menuGetSelectedIndex = vyhod then halt; 
menu; //
опять вызываем меню 
end; 

Последний вызов меню нужен для того, чтобы после того как закончится «сеанс игры» опять вылезло меню, а не произошел выход
из программы. Таким образом всю подготовительную работу мы сделали, осталось только реализовать саму игру :). Пусть наши
кирпичики сверху будут квадратами 10х10. Доску снизу я сделал 30х5, а летающий кубик 10х10. Я решил, что самое удобное, это
разбить все поле на квадраты 10х10 (получается, что поле — это матрица), таким образом мы будем представлять его как массив
из записей вида 

type zp=record 
b : boolean; 
end; 

var a : array [0..20, 0..20] of zp; 

b — это видим или невидим кирпич. Пусть вас не смущает, что в записи всего одно поле. Это сделано с учетом того, что в
дальнейшем нам может пригодиться дополнительная информация о конкретном кирпиче (например его цвет), тогда ее будет легко
добавить. Местоположение летающего кирпича будем хранить в
переменных х1 и у1 (это координаты левого верхнего угла), а доски
снизу в х2 и у2. 

Реализуем перемещение кирпича. Для этого пригодятся 2 переменные: direction_x и direction_y, в которых будут храниться
направление движения по оси х и у 

if direction_y = up then y1 := y1 - speed; 
if direction_y = down then y1 := y1 + speed; 
if direction_x = left then x1 := x1 - speed; 
if direction_x = right then x1 := x1 + speed; 

Тут в зависимости от направления движения координаты кирпича увеличиваются/уменьшаются на константу speed. up, down, left
и right — это тоже константы, введенные для наглядности. Так кирпич у нас движется, но его перемещения надо ограничить
стенками 

if x1 <= 0 then direction_x := right; 
if x1 >= (GetWidth-10) then direction_x := left; 
if y1 <= 0 then direction_y := down; 
if ((x1+10)>=x2) and (x1<=(x2+30)) and (y1<=y2+5) and ((y1+10)>=y2) then direction_y := up; //это проверяется
наличие на пути доски 
if y1 >= (GetHeight-10) then b:=true; //если кирпич достиг нижней стенки, то переменная b сменится на true и мы будем
знать, что нужно прекратить игру 

Теперь научим нашу доску передвигаться в зависимости от того, какая кнопка нажата 

key := GetKeyPressed; 
if KeyToAction(key) = GA_UP then 
if y2<>0 then y2 := y2 - 3; 
if KeyToAction(key) = GA_DOWN then 
if y2<>(GetHeight - 5) then y2 := y2 + 3; 
if KeyToAction(key) = GA_LEFT then 
if x2<>0 then x2 := x2 - 3; 
if KeyToAction(key) = GA_RIGHT then 
if x2<>(GetWidth - 30) then x2 := x2 + 3; 

GetKeyPressed — возвращает код клавиши, которая была только что нажата. А KeyToAction по коду нажатой клавиши возвращает
«название клавиши». Узнав какую кнопку нажал игрок мы можем это обработать и изменить координаты доски. Тут же реализована
проверка на то, чтобы доска не вышла за пределы экрана. Теперь
добавим процедуру прорисовки наших верхних кирпичей 

procedure block; 
var i,k : integer; 
begin 
for i:=0 to (GetWidth div 10) - 1 do 
for k:=0 to (GetHeight div 10) - 1 do 
if a[i,k].b then 
begin 
SetColor(0, 0, 0); 
fillRect(i*10, k*10, 10, 10 ); 
SetColor(255, 255, 255); 
drawRect(i*10+2, k*10+2, 6, 6 ); 
end; 
end; 

Эта процедура будет прорисовывать видимые кирпичи, а при запуске игры мы должны определить какие будут видимы, а какие нет

for z:=0 to GetWidth div 10 do 
for d:=0 to GetHeight div 10 do 
if ( d < 5 ) and ( d > 0 ) and ( z > 0 ) and ( z < (GetWidth div 10) - 1) 
then a[z,d].b:=true else a[z,d].b:= false; 

Таким образом будут видимы все кирпичи из 5 строк, кроме тех, что находятся в 1 и последнем столбце. Теперь готово все, 
кроме проверки на то есть ли впереди перед движущимся кубиком статичный кирпич. Ну так проверим же это 

if (a[ x1 div 10, y1 div 10].b) or (a[ (x1+10) div 10, y1 div 10].b) or 
(a[ x1 div 10, (y1+10) div 10].b) or (a[ (x1+10) div 10, (y1+10) div 10].b) 
then 
begin 
if direction_y = down then direction_y := up else direction_y := down; 
if direction_x = left then direction_x := right else direction_x := left; 
if (a[ x1 div 10, y1 div 10].b) then 
a[ x1 div 10, y1 div 10].b:=false; 
if (a[ (x1+10) div 10, y1 div 10].b) then 
a[ (x1+10) div 10, y1 div 10].b:=false; 
if (a[ x1 div 10, (y1+10) div 10].b) then 
a[ x1 div 10, (y1+10) div 10].b:=false; 
if (a[ (x1+10) div 10, (y1+10) div 10].b) then 
a[ (x1+10) div 10, (y1+10) div 10].b:=false; 
end; 

Если есть столкновение с кирпичом, то меняем направление движения и делаем кирпич, с которым столкнулись, невидимым. 

Все… Вроде осветил все аспекты создания простой игрушки для тела, написанной на
Паскале!

Оставить мнение

Check Also

Алмазный фонд «Хакера». Самые крутые материалы по реверсингу и malware за три года

Иногда мы, редакторы и авторы «Хакера», сами читаем «Хакер». Нет, ну то есть мы постоянно …