IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> Использование кравиатуры в PascalABC, Использование клавиатуры для смены направления движения объекта
looogle
сообщение 17.05.2011 23:13
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской

Репутация: -  0  +


Всем доброго времени суток!

Такая проблема:

я использую цикл для смены координат объекта, то есть за один проход цикла перерисовываю круг с помощью DrawCircle на новое место с изменившейся координатой. Запускается цикл нажатием клавиши, соответствующей направлению движения. Вот кусок кода:



procedure KeyDown(Key: integer);
begin

if Key = VK_Enter then start //провека Enter

else begin

LockDrawing;

repeat
Window.Clear;

case Key of
VK_Left: x := x - 1; //влево
VK_Right: x := x + 1; //вправо
VK_Up: y := y + 1; //вверх
VK_Down: y := y - 1; //вниз
VK_Space: break;
end;

DrawCircle(x, y, r);
Redraw;
Sleep(1);
until key = VK_Space; //здесь не уверен, что писать в условии
end;
end;

begin

y := 100; //y
x := 100; //x
r := 10; //радиус


TextOut(250, 200, 'Pess enter to start');

OnKeyDown := KeyDown;
end.



Программы выполняется так: Открывается окно, я нажимаю Enter, потом стрелку (вправо, влево, вверх или вниз) и круг (объект) начинает плавно перерисовываться или двигаться в одну (заданную мно стрелками) сторону.

Проблема в том, что при повторном нажатии направление движение не меняется. Я понимаю, что впринципе так и должно быть. Но вот как сделать чтобы напраление менялось я не знаю.

Пожалуйста, помогите. blush.gif

Сообщение отредактировано: looogle - 17.05.2011 23:14
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 18.05.2011 1:25
Сообщение #2


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Цитата
Но вот как сделать чтобы напраление менялось я не знаю.
Вот так:
uses graphabc;

var
x, y, r : integer;
dx, dy :integer;
stop : boolean := true;

procedure Start;
begin
stop := false;
LockDrawing;
repeat
Window.Clear;
x := x + dx; y := y +dy;
DrawCircle(x, y, r);
Redraw;
Sleep(1);
until stop;
Halt;
end;

procedure KeyDown(Key: integer);
begin
case Key of
VK_Enter : stop := false;
VK_Left : begin dx := -1; dy := 0; end; // влево
VK_Right : begin dx := 1; dy := 0; end; // вправо
VK_Up : begin dx := 0; dy := -1; end; // вверх
VK_Down : begin dx := 0; dy := 1; end; // вниз
VK_Space : stop := true; // стоп
end;
end;

begin
y := 100; //y
x := 100; //x
r := 10; //радиус

TextOut(250, 200, 'Press enter to start');
OnKeyDown := KeyDown;

repeat Sleep(1) until not stop; // Ждем нажатия на Enter
Start;
end.


У тебя тут событийное программирование. Отрисовка не должна происходить в обработчике KeyDown. Этот обработчик вызывается каждый раз, когда происходит событие: нажата какая-то кнопка. Вот в момент нажатия ты должен установить какой-то признак, какую-то переменную, чтоб потом в основном цикле с ней работать.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
looogle
сообщение 18.05.2011 15:05
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской

Репутация: -  0  +


Спасибо огромное! Понял свою ошибку.

good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Гость
сообщение 26.04.2015 18:45
Сообщение #4


Гость






А как выйти из обработчика? Ну, то есть, он отработал, но после этого надо выполнить код, который находиться после точки вызова обработчика. Что только не пробовал, ничего не помогло.
 К началу страницы 
+ Ответить 
looogle
сообщение 28.04.2015 15:43
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской

Репутация: -  0  +


Цитата(Гость @ 26.04.2015 18:45) *

А как выйти из обработчика? Ну, то есть, он отработал, но после этого надо выполнить код, который находиться после точки вызова обработчика. Что только не пробовал, ничего не помогло.

Уберите
Halt;
в процедуре
Start;
выполнение вернётся в обратно
main;


Сообщение отредактировано: looogle - 28.04.2015 15:44
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 28.03.2024 19:17
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"