![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Как начинающий программист решил попробовать написать "змейку". Мне нужно сделать так, чтобы прямоугольник-змейка (пока что) просто изменял направление своего движения при нажатии на одну из кнопок-стрелок (тех, что рядом с RCTRL).
Пробовал как через FormKeyDown, так и через FormKeyPress. Код: Код:
unit thesnake;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
GameBoard: TPaintBox;
Timer1: TTimer;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
len, wid, speed, bX, bY, frX, frY : integer;
SnakeDirR, SnakeDirD, SnakeDirL, SnakeDirU : boolean;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
wid := 10;
len := 90;
bX := 200;
bY := 50;
frX := bX + len;
frY := bY + wid;
speed := 2;
GameBoard.Canvas.Brush.Color := rgb(0,0,0);
GameBoard.Canvas.Rectangle(0,0,GameBoard.Width,GameBoard.Height);
GameBoard.Canvas.Brush.Color := rgb(0,255,8);
GameBoard.Canvas.Rectangle(bX,bY,frX,frY);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if Timer1.Enabled then Timer1.Enabled := false else Timer1.Enabled := true
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if SnakeDirR then
begin
GameBoard.Canvas.Brush.Color := rgb(0,0,0);
GameBoard.Canvas.Rectangle(0,0,GameBoard.Width,GameBoard.Height);
GameBoard.Canvas.Brush.Color := rgb(0,255,8);
GameBoard.Canvas.Rectangle(bX,bY,frX,frY);
GameBoard.Canvas.Rectangle(bX-1,bY,bX,frY);
bX := bX + speed;
frX := bX + len;
frY := bY + wid;
end;
if SnakeDirD then
begin
GameBoard.Canvas.Brush.Color := rgb(0,0,0);
GameBoard.Canvas.Rectangle(0,0,GameBoard.Width,GameBoard.Height);
GameBoard.Canvas.Brush.Color := rgb(0,255,8);
GameBoard.Canvas.Rectangle(bX,bY,frX,frY);
GameBoard.Canvas.Rectangle(bX-1,bY,bX,frY);
bY := bY + speed;
frX := bX + len;
frY := bY + wid;
end;
if SnakeDirL then
begin
GameBoard.Canvas.Brush.Color := rgb(0,0,0);
GameBoard.Canvas.Rectangle(0,0,GameBoard.Width,GameBoard.Height);
GameBoard.Canvas.Brush.Color := rgb(0,255,8);
GameBoard.Canvas.Rectangle(bX,bY,frX,frY);
GameBoard.Canvas.Rectangle(bX-1,bY,bX,frY);
bX := bX - speed;
frX := bX + len;
frY := bY + wid;
end;
if SnakeDirU then
begin
GameBoard.Canvas.Brush.Color := rgb(0,0,0);
GameBoard.Canvas.Rectangle(0,0,GameBoard.Width,GameBoard.Height);
GameBoard.Canvas.Brush.Color := rgb(0,255,8);
GameBoard.Canvas.Rectangle(bX,bY,frX,frY);
GameBoard.Canvas.Rectangle(bX-1,bY,bX,frY);
bY := bY - speed;
frX := bX + len;
frY := bY + wid;
end;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case key of
39 : begin SnakeDirR:=true; SnakeDirD:=false; SnakeDirL:=false; SnakeDirU:=false; end;
40 : begin SnakeDirD:=true; SnakeDirL:=false; SnakeDirU:=false; SnakeDirR:=false; end;
37 : begin SnakeDirL:=true; SnakeDirD:=false; SnakeDirR:=false; SnakeDirU:=false; end;
38 : begin SnakeDirU:=true; SnakeDirD:=false; SnakeDirL:=false; SnakeDirR:=false; end;
end;
end;
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
case key of
chr(39) : begin SnakeDirR:=true; SnakeDirD:=false; SnakeDirL:=false; SnakeDirU:=false; end;
chr(40) : begin SnakeDirD:=true; SnakeDirL:=false; SnakeDirU:=false; SnakeDirR:=false; end;
chr(37) : begin SnakeDirL:=true; SnakeDirD:=false; SnakeDirR:=false; SnakeDirU:=false; end;
chr(38) : begin SnakeDirU:=true; SnakeDirD:=false; SnakeDirL:=false; SnakeDirR:=false; end;
end;
end;
end. |
|
#2
|
||||
|
||||
|
нажатия не происходит, фокус на кнопках
|
|
#3
|
||||
|
||||
|
в смысле? другие коды кнопок должны быть?
Вы не могли бы подсказать, что конкретно надо исправить? |
|
#4
|
||||
|
||||
|
да нет, если кнопки убрать и поставить брекпоинт то видно что срабатывает, а так фокус на кнопках двух они ловят клики
|
|
#5
|
||||
|
||||
|
Может фигню посоветую но вот так у меня заработало, через горячие клавиши, да и у таймера надо тогда по умолчанию поставить Enabled:=False;
а то при запуске формы сразу он работает Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls,xpMan;
type
TForm1 = class(TForm)
Timer1: TTimer;
GameBoard: TPaintBox;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
procedure OnHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
len, wid, speed, bX, bY, frX, frY : integer;
SnakeDirR, SnakeDirD, SnakeDirL, SnakeDirU : boolean;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
wid := 10;
len := 90;
bX := 200;
bY := 50;
frX := bX + len;
frY := bY + wid;
speed := 10;
GameBoard.Canvas.Brush.Color := rgb(0,0,0);
GameBoard.Canvas.Rectangle(0,0,GameBoard.Width,GameBoard.Height);
GameBoard.Canvas.Brush.Color := rgb(0,255,8);
GameBoard.Canvas.Rectangle(bX,bY,frX,frY);
Form1.SetFocus;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if Timer1.Enabled then Timer1.Enabled := false else Timer1.Enabled := true;
Form1.SetFocus;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if SnakeDirR then
begin
GameBoard.Canvas.Brush.Color := rgb(0,0,0);
GameBoard.Canvas.Rectangle(0,0,GameBoard.Width,GameBoard.Height);
GameBoard.Canvas.Brush.Color := rgb(0,255,8);
GameBoard.Canvas.Rectangle(bX,bY,frX,frY);
GameBoard.Canvas.Rectangle(bX-1,bY,bX,frY);
bX := bX + speed;
frX := bX + len;
frY := bY + wid;
end;
if SnakeDirD then
begin
GameBoard.Canvas.Brush.Color := rgb(0,0,0);
GameBoard.Canvas.Rectangle(0,0,GameBoard.Width,GameBoard.Height);
GameBoard.Canvas.Brush.Color := rgb(0,255,8);
GameBoard.Canvas.Rectangle(bX,bY,frX,frY);
GameBoard.Canvas.Rectangle(bX-1,bY,bX,frY);
bY := bY + speed;
frX := bX + len;
frY := bY + wid;
end;
if SnakeDirL then
begin
GameBoard.Canvas.Brush.Color := rgb(0,0,0);
GameBoard.Canvas.Rectangle(0,0,GameBoard.Width,GameBoard.Height);
GameBoard.Canvas.Brush.Color := rgb(0,255,8);
GameBoard.Canvas.Rectangle(bX,bY,frX,frY);
GameBoard.Canvas.Rectangle(bX-1,bY,bX,frY);
bX := bX - speed;
frX := bX + len;
frY := bY + wid;
end;
if SnakeDirU then
begin
GameBoard.Canvas.Brush.Color := rgb(0,0,0);
GameBoard.Canvas.Rectangle(0,0,GameBoard.Width,GameBoard.Height);
GameBoard.Canvas.Brush.Color := rgb(0,255,8);
GameBoard.Canvas.Rectangle(bX,bY,frX,frY);
GameBoard.Canvas.Rectangle(bX-1,bY,bX,frY);
bY := bY - speed;
frX := bX + len;
frY := bY + wid;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterHotKey(Handle,39, 0,39);
RegisterHotKey(Handle,40, 0,40);
RegisterHotKey(Handle,37, 0,37);
RegisterHotKey(Handle,38, 0,38);
end;
procedure TForm1.OnHotKey(var Msg: TWMHotKey);
begin
case msg.HotKey of
39 : begin SnakeDirR:=true; SnakeDirD:=false; SnakeDirL:=false; SnakeDirU:=false; end;
40 : begin SnakeDirD:=true; SnakeDirL:=false; SnakeDirU:=false; SnakeDirR:=false; end;
37 : begin SnakeDirL:=true; SnakeDirD:=false; SnakeDirR:=false; SnakeDirU:=false; end;
38 : begin SnakeDirU:=true; SnakeDirD:=false; SnakeDirL:=false; SnakeDirR:=false; end;
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnregisterHotKey(Handle,37);
UnregisterHotKey(Handle,38);
UnregisterHotKey(Handle,39);
UnregisterHotKey(Handle,40);
end;
end.Последний раз редактировалось ALexandr555, 23.06.2012 в 23:21. |
|
#6
|
|||
|
|||
|
чтоб не заморачиваться с горячими клавишами, я помню использовал для управления стрелками TActionList и там создавал новое действие,и устанавливал в качесвте горячих кнопок кнопки стрелок.для каждой кнопки свое событие.
ну впринципе это тоже хоткеи но не надо париться регистрировать их. если интересно пример приаттачил |
|
#7
|
||||
|
||||
|
Цитата:
|
|
#8
|
||||
|
||||
|
Можно использовать GetKeyState(...).
|
|
#9
|
|||
|
|||
|
накидал змейку с классами, строчек примерно столько же, но умеет больше
(управление решил через Form.keypreview) |
|
#10
|
||||
|
||||
|
Цитата:
|