Думаете это не возможно? А вот и нет! Для этого нужен 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;
Если есть столкновение с кирпичом, то меняем направление движения и делаем кирпич, с которым столкнулись, невидимым.
Все... Вроде осветил все аспекты создания простой игрушки для тела, написанной на
Паскале!