Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для мобильных телефонов > MidletPascal

Ответ
 
Опции темы
Старый 24.11.2008, 18:44   #1
oliwin
AnyKey`щик
 
Регистрация: 24.11.2008
Сообщений: 7
Написано 0 полезных сообщений
(для 0 пользователей)
Я буквально пару дней назад начал изучать midletPascal
И вот решил написать игру!
Возник вопрос-как ограничить поле игры,например у меня передвигается по экрану кубик в 4 разных направлениях,как сделать чтобы он не заходил за экран?
И еще как организовать цикл, чтобы кубик передвигался сам с заданным шагом до границ экрана?
Спасибо!

Все! С ограничением поля разобрался сам! И с передвижение кубика тоже! Возник другой вопрос

Вот кусок кода:
pw:=getWidth;
ph:=getHeight;
.....

Key:=keyToAction 
(getKeyClicked );
    
  begin
   setColor(255, 255, 255); 
fillRect(x, y, 5, 5); 
 repaint; 
 
  if (Key=GA_RIGHT) then 
     WHILE (x=(pw-5)) do
     
  repaint;

      drawImage(loadImage('/1.png'), x, y);    

 setColor(255, 255, 255); 
fillRect(x, y, 5, 5); 

   x:=x+1; 
  

 
   end;
Проблема такая: сразу как запускается эмулятор-начинает двигаться кубик!
И еще, как сделать, чтобы при нажатии на GA_RIGHT GA_LEFT GA_DOWN кубик двигался по тойже логике, что и выше в моем коде, причем мгновенно.
У меня так не получается: Делал проверку на нажатую кнопку и если нажата GA_DOWN, то кубик останавливается, и только по повторному нажатию, кубик двигается вниз!
Помогите решить проблему!
Кто-то есть живой на форуме??((

Последний раз редактировалось ViNT, 24.11.2008 в 22:10.
(Offline)
 
Ответить с цитированием
Старый 24.11.2008, 22:14   #2
ViNT
Модератор
 
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений
(для 817 пользователей)
Ответ: Как организовать цикл

Вообще, чтобы кубик не двигался сразу при запуске, нужно использовать GetKeyPressed вместо GetKeyClicked. Во-вторых, repaint в приведенном коде нужен только один в конце (перед x:=x+1). В-третьих, лучше загрузить изображение один раз и выводить его, чем каждый раз писать drawImage(loadImage('/1.png'), x, y);
(Offline)
 
Ответить с цитированием
Старый 24.11.2008, 22:26   #3
oliwin
AnyKey`щик
 
Регистрация: 24.11.2008
Сообщений: 7
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Как организовать цикл

Спасибо за понятные разъяснения! Буду пробовать!
(Offline)
 
Ответить с цитированием
Старый 24.11.2008, 22:35   #4
oliwin
AnyKey`щик
 
Регистрация: 24.11.2008
Сообщений: 7
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Как организовать цикл

Да, частично вопрос решен, а как быть, чтобы при нажатии на GA_RIGHT GA_LEFT GA_DOWN кубик двигался по тойже логике, что и выше в моем коде, причем мгновенно.
(Offline)
 
Ответить с цитированием
Старый 24.11.2008, 23:11   #5
ViNT
Модератор
 
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений
(для 817 пользователей)
Ответ: Как организовать цикл

Всетаки, логика работы не совсем понятна, я не внимательно прочитал:
if (Key=GA_RIGHT) then 
WHILE (x=(pw-5)) do
     
  repaint;
что делает этот код?
По идее, при нажатии кнопки получается что если до конца экрана 5 пикселей, то перерисовываем экран, иначе не делаем ничего. Как-то бессмыслено. Что всетаки должно получиться в итоге? Кубик должен при нажатии кнопки продвигаться на один пиксель или начинать двигаться до конца экрана?
(Offline)
 
Ответить с цитированием
Старый 24.11.2008, 23:16   #6
oliwin
AnyKey`щик
 
Регистрация: 24.11.2008
Сообщений: 7
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Как организовать цикл

Значит по одному нажатию кнопки GA_RIGHT кубик должен двигаться до конца экрана по оси x и если он заходит за границу экрана-вывести сообщение и остановить.
Также по логике для остальных кнопок!
(Offline)
 
Ответить с цитированием
Старый 24.11.2008, 23:34   #7
ViNT
Модератор
 
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений
(для 817 пользователей)
Ответ: Как организовать цикл

Тогда примерно так(пишу с головы, не проверял):
var
 
cube:image;
 
key,oldkey:integer;
 
x:integer;
 
b:boolean;

begin
 cube
:=loadimage('/1.png');
 
repeat
  b
:=true;
  
key:=KeyToAction(GetKeyPressed);
  
oldkey:=key;
  
//--блок проверки клавиши
  
if (key=GA_LEFT)and b then
  
while (x<pw-5)and(key=oldkey) do
  
begin
   b
:=false;
   
DrawImage(cube,x,y);
   
repaint;
   
x:=x+1;
   
key:=KeyToAction(GetKeyPressed);
   
Delay(50);
  
end;
  
//--конец блока проверки клавиши

 //--блок проверки клавиши
 
if (key=GA_RIGHT)or b then
  
while (x>=5)and(key=oldkey) do
  
begin
   b
:=true;
   
DrawImage(cube,x,y);
   
repaint;
   
x:=x-1;
   
key:=KeyToAction(GetKeyPressed);
   
Delay(50);
  
end;
  
//--конец блока проверки клавиши

 //Аналогично [блок проверки клавиши] для GA_UP и GA_DOWN

  
Delay(50);
 
until false
По логике примерно так, хотя набирать не пробовал.
(Offline)
 
Ответить с цитированием
Старый 25.11.2008, 00:07   #8
oliwin
AnyKey`щик
 
Регистрация: 24.11.2008
Сообщений: 7
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Как организовать цикл

Что-то не работает. Запутался вообщем!
Может вы меня не так понимаете!
Мне надо сделать так, чтобы кубик никогда не останавливался и менял свое направления по нажатию GA_RIGHT и тд не оставляя за собой след, аесли заходит за границы поля,то высветить сообщение и остановить.
(Offline)
 
Ответить с цитированием
Старый 25.11.2008, 02:12   #9
ViNT
Модератор
 
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений
(для 817 пользователей)
Ответ: Как организовать цикл

В общем, вот так. Код точно рабочий, проверено.
Изучайте
program Tst;

const
 
dir_right=1;
 
dir_left=2;
 
dir_up=3;
 
dir_down=4;

var
 
key:integer;
 
x,y:integer;
 
dir:integer;
 
sw,sh:integer;
 
play:boolean;
 
obj:image;

procedure ParseKey;
begin
 key
:=KeyToAction(GetKeyClicked);
 if 
key=GA_LEFT then
  dir
:=dir_left
 
else
 if 
key=GA_RIGHT then
  dir
:=dir_right
 
else
 if 
key=GA_UP then
  dir
:=dir_up
 
else
 if 
key=GA_DOWN then
  dir
:=dir_down;
end;

procedure Move;
begin
 
if dir=dir_left then
  x
:=x-1
 
else
 if 
dir=dir_right then
  x
:=x+1
 
else
 if 
dir=dir_up then
  y
:=y-1
 
else
 if 
dir=dir_down then
  y
:=y+1;
end;

procedure CheckBounds;
begin
 
if (x<=0)or(x>=sw-5)or(y<=0)or(y>=sh-5then
  play
:=false;
end;

procedure Draw;
begin
 FillRect
(0,0,sw,sh);
 
DrawImage(obj,x,y);
 
repaint;
end;
 
begin
 dir
:=0;
 
play:=true;
 
sw:=GetWidth;
 
sh:=GetHeight;
 
SetColor(255,255,255);
 
obj:=LoadImage('/icon.png');
 
x:=sw div 2;
 
y:=sh div 2;

 
repeat
  ParseKey
;
  
Move;
  
CheckBounds;
  
Draw;
  
Delay(100);
 
until not play;
 
FillRect(0,0,sw,sh);
 
Setcolor(0,0,0);
 
DrawText('Game Over',10,10);
 
repaint;
 
Delay(20000);
end
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перебор нескольких списков за цикл FrankH 3D-программирование 15 14.02.2008 13:58
Как это организовать? magpro 3D-программирование 9 09.09.2007 22:07
Как организовать HUD? Trilliput 3D-программирование 4 01.08.2006 20:27
Функции и Главный цикл ЛысыЙ_Чук-Иванчук 2D-программирование 6 25.07.2006 22:36


Часовой пояс GMT +4, время: 21:41.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com