Midlet на Pascal направи си сам мобилен арканоид
Мислите, че не е възможно? Но не! За да направите това, имате нужда от MIDletPascal - програма, която превежда изходния код на Pascal в J2ME байт код (дори не се нуждаете от инсталирана Java машина). По този начин всичко, което трябва да направите, е да напишете кода в обичайния, но "леко" съкратен код на Pascal, а на изхода ще получите 2 файла: jar и .jad. Струва си да се отбележи, че MIDletPascal след инсталацията тежи по-малко от 3 метра, но всичко по начало.
MIDletPascal е компилатор, така че за пълноценна разработка би било добре да имате и емулатор, за да не проверявате всяка промяна на мобилния телефон. След като стартираме, виждаме поле пред нас за писане на код, в което вече ще има най-простият код:
програма Нова; begin drawText('Здравей свят!', 0, 0); пребоядисване; закъснение (2000); край.
Както вероятно се досещате, след изпълнение на такъв код, на екрана на мобилния телефон ще се появи надписът „Здравей свят!“ Веднага си струва да отбележим разликата от Pascal, в който бихме написали просто write('Hellowrite!'). Това тук няма да работи. Това се дължи на факта, че write отпечатва букви към стандартното изходно устройство, т.е. конзола, но не е в тялото, така че ние не вписваме думите, а ги рисуваме.
Създаваме нов проект и пишем кода за процедура, която ще показва нашето съобщение при стартиране.
процедура на (st : низ); започнете 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); пребоядисване; закъснение (1000); край;
Всичко е просто. Сега трябва да създадем менюто.
процедурно меню; begin ShowMenu('Изберете действие', CH_IMPLICIT); // Това заглавие на менюто igrat := MenuAppendString('Play'); // това добавя 3 елемента от менюто about := MenuAppendString('Author'); изход := MenuAppendString('Изход'); play := CreateCommand('Select', CM_SCREEN, 1); // тук се добавят команди, за 2 бутона точно под екрана AddCommand(play); изход := CreateCommand('Изход', CM_EXIT, 1); Добавяне на команда (изход); повтаряне // стартиране на цикъла, докато играчът не натисне един от 2-та бутона delay(100); кликнат := getClickedCommand; до (щракване = игра) или (щракване = изход); ако се щракне = изход и след това спиране; // ако е избран изход, тогава. showCanvas; // "премахване" на менюто if menuGetSelectedIndex = igrat then igra; // вижте кой елемент е избрал играчът и в зависимост от това извикайте необходимата процедура if menuGetSelectedIndex = about then ab; ако menuGetSelectedIndex = vyhod then halt; меню; // извикване на менюто отново край;
Последното извикване на менюто е необходимо, така че след като „сесията на играта“ приключи, менюто да изскочи отново и да излезе от програмата. Така свършихме цялата подготвителна работа, остава само да реализираме самата игра :). Нека нашите тухли отгоре са 10x10 квадратчета. Направих долната дъска 30х5, а летящото кубче 10х10. Реших, че най-удобно е да разделя цялото поле на квадрати 10x10 (оказва се, че полето е матрица), така че ще го представим като масив от записи във формата
тип zp=запис b : булево; край;
var a : масив [0..20, 0..20] от zp;
b е видимата или невидимата тухла. Не се отчайвайте от факта, че в записа има само едно поле. Това се прави, като се вземе предвид факта, че в по-нататък може да се нуждаем от допълнителна информация за определена тухла (например цвета й), тогава ще бъде лесно да добавим. място за летенетухлите ще се съхраняват в променливи x1 и y1 (това са координатите на горния ляв ъгъл), а дъските отдолу в x2 и y2.
Изпълняваме движението на тухлата. За това са полезни 2 променливи: direction_x и direction_y, които ще съхраняват посоката на движение по осите x и y
if direction_y = up then y1 := y1 - скорост; ако direction_y = надолу тогава y1 := y1 + скорост; ако direction_x = ляво тогава x1 := x1 - скорост; ако direction_x = надясно тогава x1 := x1 + скорост;
Тук, в зависимост от посоката на движение, координатите на тухлата се увеличават / намаляват с константата на скоростта. нагоре, надолу, наляво и надясно също са константи, въведени за яснота. Ето как се движи тухлата, но нейните движения трябва да бъдат ограничени от стени
if x1 = (GetW > if y1 =x2) and (x1 =y2) then direction_y := up; //това проверява дали има дъска по пътя if y1 >= (GetHeight-10) then b:=true; //ако тухлата е достигнала долната стена, тогава променливата b ще се промени на true и ние ще знаем как да спрем играта
Сега нека научим нашата дъска да се движи в зависимост от това кой бутон е натиснат.
ключ := GetKeyPressed; ако KeyToAction(ключ) = GA_UP тогава ако y2<>0 тогава y2 := y2 - 3; ако KeyToAction(ключ) = GA_DOWN тогава ако y2<>(GetHeight - 5) тогава y2 := y2 + 3; ако KeyToAction(ключ) = GA_LEFT тогава ако x2<>0 тогава x2 := x2 - 3; ако KeyToAction(ключ) = GA_RIGHT тогава ако x2<>(GetW >
GetKeyPressed - Връща кода на току-що натиснатия клавиш. А KeyToAction по кода на натиснатия клавиш връща "име на ключ". След като научихме кой бутон е натиснал играчът, можем да го обработим и да променим координатите на дъската. Незабавно приложен проверете дали дъската не излиза извън екрана. Сега нека добавим процедура за изчертаване на нашиягорни тухли
процедурен блок; променлива i,k : цяло число; започнете за i:=0 до (GetWidth div 10) - 1 направете за k:=0 до (GetHeight div 10) - 1 направете ако a[i,k].b тогава започнете SetColor(0, 0, 0); fillRect(i*10, k*10, 10, 10); Задаване на цвят(255, 255, 255); drawRect(i*10+2, k*10+2, 6, 6); край; край;
Тази процедура ще начертае видими тухли и когато играта започне, трябва да определим кои ще бъдат видими и кои не
за z:=0 до GetWidth div 10 направете за d:=0 до GetHeight div 10 направете if ( d 0 ) и ( z > 0 ) и ( z
Така всички тухли от 5 реда ще бъдат видими, с изключение на тези в 1-вата и последната колона. Сега всичко е готово, с изключение на проверката дали има статична тухла пред движещия се куб. Ами нека да го проверим
ако (a[ x1 div 10, y1 div 10].b) или (a[ (x1+10) div 10, y1 div 10].b) или (a[ x1 div 10, (y1+10) div 10].b) или (a[ (x1+10) div 10, (y1+10) div 10].b) тогава бе gin ако посока_ y = надолу след това посока_y := нагоре друго посока_y := надолу; ако direction_x = ляво тогава direction_x := дясно else direction_x := ляво; ако (a[ x1 div 10, y1 div 10].b) тогава a[ x1 div 10, y1 div 10].b:=false; ако (a[ (x1+10) div 10, y1 div 10].b) тогава a[ (x1+10) div 10, y1 div 10].b:=false; ако (a[ x1 div 10, (y1+10) div 10].b) тогава a[ x1 div 10, (y1+10) div 10].b:=false; ако (a[ (x1+10) div 10, (y1+10) div 10].b) тогава a[ (x1+10) div 10, (y1+10) div 10].b:=false; край;
Ако има сблъсък с тухла, тогава променяме посоката на движение и правим тухлата, с която сме се сблъскали, невидима.
Това е всичко… Изглежда, че е покрило всички аспекти на създаването на проста играчка за тялото, написана на Pascal!