Мідлет на Pascal мобільний арканоїд своїми руками

Думаєте це неможливо? А ось і ні! Для цього потрібен 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) або (clicked = exit); if clicked = exit then halt; // Якщо вибрали вихід, то. showCanvas; // "прибираємо" меню if menuGetSelectedIndex = igrat then igra; // дивимося, який пункт вибрав гравець і залежно від цього викликаємо потрібну процедуру if menuGetSelectedIndex = about then ab; якщо menuGetSelectedIndex = щастить; 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 = (GetW & gt; if y1 = x2) and (x1 = 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<>(GetW >

GetKeyPressed - повертає код клавіші, яка була щойно натиснута. А KeyToAction за кодом натиснутої кнопки повертає «назва кнопки». Дізнавшись яку кнопку натиснув гравець ми можемо це обробити та змінити координати дошки. Тут же реалізована перевірка на те, щоб дошка не вийшла за межі екрана. Тепер додамо процедуру промальовування нашихверхньої цегли

procedure block; var i,k: integer; begin для i:=0 to (GetWidth div 10) - 1 do for k:=0 to (GetHeight div 10) - 1 do іf 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 0 ) and ( z > 0 ) and ( z

Таким чином буде видно всю цеглу з 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) або (a[ (x1+10) div 10, (y1+10) div 10].b) then begin якщо 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; іf (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; іf (a[(x1+10) div 10, (y1+10) div 10].b) then a[ (x1+10) div 10, (y1+10) div 10].b) := false; end;

Якщо є зіткнення з цеглою, то міняємо напрямок руху і робимо цеглу, з якою зіткнулися, невидимою.

Все… Начебто висвітлив усі аспекти створення простої іграшки для тіла, написаної на Паскалі!