Другие языки программирования и технологии

PascalABC.NET Графика, движение объекта после нажатия клавиши

Создаю программу, а надо так чтоб после нажатия на клавишу объект продолжал движение , а у мен я выходит так что нажал клавишу он сдвинулс я отпустил -остановился....USESCRT,ABCObjects, GraphABC ; var c:color; y,z,x,i: Integer; e: RectangleABC; w: char; procedure q; Begin SetWindowSize(900,600); {Размер окна} CenterWindow; {Окно в центре} c:=rgb(51,76,191); {Цвет - синий} ClearWindow(c); {Заливка окна} y:=100; i:=30; z:=15; x:=600; y:=300; x:=450; end; procedure w1; begin repeat e:= new RectangleABC(x,y,30,30,clred); Sleep(40); w := ReadKey; case w of 'w' : begin repeat y:=y-1; until 2<3 end; 's' : begin y:=y+1;end; 'a' : begin x:=x-1;end; 'd' : begin x:=x+1;end; end; e.Destroy; until (y<=0) or (y>=600) or (x<=0) or(x>=900); end; begin q;w1; End. Вот чатсь программы - сильно не сокращал. но проверил -запускается....-управление. незнаю почему но для того чтоб объект стал двигаться надо сменить раскладку клавиатуры один или несколько раз... клавиши -w -вперед, s-,назад a-влево,d-вправо,
Набросал тут примерчик - работает, проверено
Старайтесь не использовать CRT с Graph
speed - скорость перемещения в пикселях
Управление
ESC - выход
WASD и стрелки на нампаде - стандартные перемещения
QEZC и Home,PgUp,End,PgDn - диагонали
X и 5 на нампаде - стоп
Для простоты очищаю окно при стирании старого - это просто для примера,
лучше делать иначе, границы экрана не проверяются - сделаете сами.

uses GraphABC, Timers;

var
x,y: integer;
dx: integer;
dy: integer;
speed: integer;

procedure TimerProc;
begin
ClearWindow;
Inc(x, dx); Inc(y, dy);
Rectangle(x, y, x+30, y+30);
end;

procedure KeyDown(Key: integer);
begin
case Key of
VK_Escape: Halt;
VK_Left, VK_A: begin dx:=-speed; dy:=0; end;
VK_Right, VK_D: begin dx:=+speed; dy:=0; end;
VK_Up,VK_W: begin dy:=-speed; dx:=0; end;
VK_Down, VK_S: begin dy:=+speed; dx:=0; end;
VK_Home, VK_Q: begin dy:=-speed; dx:=-speed; end;
VK_End, VK_Z : begin dy:=+speed; dx:=-speed; end;
VK_PageUp, VK_E: begin dy:=-speed; dx:=+speed; end;
VK_PageDown, VK_C: begin dy:=+speed; dx:=+speed; end;
12, VK_X: begin dx:=0; dy:=0; end;
end;
end;

begin
SetWindowSize(900,600);
CenterWindow;
ClearWindow(rgb(51,76,191));
x:=600;
y:=300;
speed:= 4;

{Вешаем обработчик событий от кнопок}
OnKeyDown := KeyDown;
{Вешаем на таймер отрисовку}
var objTimer := new Timer(100, TimerProc);
objTimer.Start;

end.
Виктор Федосов
Виктор Федосов
84 764
Лучший ответ
Андрей Медведев а можешь дать код простой проги которая двигает круг влево-вправо кнопками G J ?
чтобы объект ПРОДОЛЖАЛ движение, надо НАУЧИТЬ его ПРОДОЛЖАТЬ ДВИЖЕНИЕ. Трение не? Не слышал?
Посиди подумай (минут 10), придумай сам, так лучше будет.
DK
Denis Kalugin
2 642
Как я понял, под нет пишешь.
Сделай таймер, который будет двигать объект и две клавиши
одна будет запускать другая останавливать.
А так выходит что у тебя действие один раз всего выполняется

------------------
Чтобы продолжал движение есть объект таймер http://msdn.microsoft.com/en-us/library/2x96zfy7.aspx#Y900