forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   MidletPascal (http://forum.boolean.name/forumdisplay.php?f=46)
-   -   Как организовать цикл (http://forum.boolean.name/showthread.php?t=7370)

oliwin 24.11.2008 18:44

Я буквально пару дней назад начал изучать midletPascal
И вот решил написать игру!:rolleyes:
Возник вопрос-как ограничить поле игры,например у меня передвигается по экрану кубик в 4 разных направлениях,как сделать чтобы он не заходил за экран?
И еще как организовать цикл, чтобы кубик передвигался сам с заданным шагом до границ экрана?:dontknow:
Спасибо!

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

Вот кусок кода:
Код:

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:14

Ответ: Как организовать цикл
 
Вообще, чтобы кубик не двигался сразу при запуске, нужно использовать GetKeyPressed вместо GetKeyClicked. Во-вторых, repaint в приведенном коде нужен только один в конце (перед x:=x+1). В-третьих, лучше загрузить изображение один раз и выводить его, чем каждый раз писать drawImage(loadImage('/1.png'), x, y);

oliwin 24.11.2008 22:26

Ответ: Как организовать цикл
 
Спасибо за понятные разъяснения! Буду пробовать!

oliwin 24.11.2008 22:35

Ответ: Как организовать цикл
 
Да, частично вопрос решен, а как быть, чтобы при нажатии на GA_RIGHT GA_LEFT GA_DOWN кубик двигался по тойже логике, что и выше в моем коде, причем мгновенно.

ViNT 24.11.2008 23:11

Ответ: Как организовать цикл
 
Всетаки, логика работы не совсем понятна, я не внимательно прочитал:
Код:

if (Key=GA_RIGHT) then
WHILE (x=(pw-5)) do
   
  repaint;

что делает этот код?
По идее, при нажатии кнопки получается что если до конца экрана 5 пикселей, то перерисовываем экран, иначе не делаем ничего. Как-то бессмыслено. Что всетаки должно получиться в итоге? Кубик должен при нажатии кнопки продвигаться на один пиксель или начинать двигаться до конца экрана?

oliwin 24.11.2008 23:16

Ответ: Как организовать цикл
 
Значит по одному нажатию кнопки GA_RIGHT кубик должен двигаться до конца экрана по оси x и если он заходит за границу экрана-вывести сообщение и остановить.
Также по логике для остальных кнопок!

ViNT 24.11.2008 23:34

Ответ: Как организовать цикл
 
Тогда примерно так(пишу с головы, не проверял):
PHP код:

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

По логике примерно так, хотя набирать не пробовал.

oliwin 25.11.2008 00:07

Ответ: Как организовать цикл
 
Что-то не работает. Запутался вообщем!
Может вы меня не так понимаете!
Мне надо сделать так, чтобы кубик никогда не останавливался и менял свое направления по нажатию GA_RIGHT и тд не оставляя за собой след, аесли заходит за границы поля,то высветить сообщение и остановить.

ViNT 25.11.2008 02:12

Ответ: Как организовать цикл
 
В общем, вот так. Код точно рабочий, проверено.
Изучайте :)
PHP код:

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



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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot