|
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, время: 17:30.
|