 |
24.11.2008, 18:44
|
#1
|
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
|
Модератор
Регистрация: 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
|
AnyKey`щик
Регистрация: 24.11.2008
Сообщений: 7
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Как организовать цикл
Спасибо за понятные разъяснения! Буду пробовать!
|
(Offline)
|
|
24.11.2008, 22:35
|
#4
|
AnyKey`щик
Регистрация: 24.11.2008
Сообщений: 7
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Как организовать цикл
Да, частично вопрос решен, а как быть, чтобы при нажатии на GA_RIGHT GA_LEFT GA_DOWN кубик двигался по тойже логике, что и выше в моем коде, причем мгновенно.
|
(Offline)
|
|
24.11.2008, 23:11
|
#5
|
Модератор
Регистрация: 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
|
AnyKey`щик
Регистрация: 24.11.2008
Сообщений: 7
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Как организовать цикл
Значит по одному нажатию кнопки GA_RIGHT кубик должен двигаться до конца экрана по оси x и если он заходит за границу экрана-вывести сообщение и остановить.
Также по логике для остальных кнопок!
|
(Offline)
|
|
24.11.2008, 23:34
|
#7
|
Модератор
Регистрация: 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
|
AnyKey`щик
Регистрация: 24.11.2008
Сообщений: 7
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Как организовать цикл
Что-то не работает. Запутался вообщем!
Может вы меня не так понимаете!
Мне надо сделать так, чтобы кубик никогда не останавливался и менял свое направления по нажатию GA_RIGHT и тд не оставляя за собой след, аесли заходит за границы поля,то высветить сообщение и остановить.
|
(Offline)
|
|
25.11.2008, 02:12
|
#9
|
Модератор
Регистрация: 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-5) then
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)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:38.
|