Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.06.2012, 18:03
Аватар для SmoceR
SmoceR SmoceR вне форума
Прохожий
 
Регистрация: 23.06.2012
Сообщения: 3
Репутация: 10
По умолчанию Пишу "змейку", не могу сделать управление

Как начинающий программист решил попробовать написать "змейку". Мне нужно сделать так, чтобы прямоугольник-змейка (пока что) просто изменял направление своего движения при нажатии на одну из кнопок-стрелок (тех, что рядом с 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  
Старый 23.06.2012, 22:57
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

нажатия не происходит, фокус на кнопках
Ответить с цитированием
  #3  
Старый 23.06.2012, 23:08
Аватар для SmoceR
SmoceR SmoceR вне форума
Прохожий
 
Регистрация: 23.06.2012
Сообщения: 3
Репутация: 10
По умолчанию

в смысле? другие коды кнопок должны быть?
Вы не могли бы подсказать, что конкретно надо исправить?
Ответить с цитированием
  #4  
Старый 23.06.2012, 23:10
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

да нет, если кнопки убрать и поставить брекпоинт то видно что срабатывает, а так фокус на кнопках двух они ловят клики
Ответить с цитированием
  #5  
Старый 23.06.2012, 23:18
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Может фигню посоветую но вот так у меня заработало, через горячие клавиши, да и у таймера надо тогда по умолчанию поставить 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  
Старый 23.06.2012, 23:45
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

чтоб не заморачиваться с горячими клавишами, я помню использовал для управления стрелками TActionList и там создавал новое действие,и устанавливал в качесвте горячих кнопок кнопки стрелок.для каждой кнопки свое событие.
ну впринципе это тоже хоткеи но не надо париться регистрировать их.
если интересно пример приаттачил
Вложения
Тип файла: zip keynavigate.zip (209.4 Кбайт, 4 просмотров)
Ответить с цитированием
  #7  
Старый 24.06.2012, 00:11
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Цитата:
Сообщение от Snake22
чтоб не заморачиваться с горячими клавишами, я помню использовал для управления стрелками TActionList и там создавал новое действие,и устанавливал в качесвте горячих кнопок кнопки стрелок.для каждой кнопки свое событие.
ну впринципе это тоже хоткеи но не надо париться регистрировать их.
если интересно пример приаттачил
ну регистрировать то чуток строчек добавить, я думал есть решение не через хоткеи, а с фокусом например мутить что
Ответить с цитированием
  #8  
Старый 24.06.2012, 01:46
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Можно использовать GetKeyState(...).
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #9  
Старый 24.06.2012, 08:06
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

накидал змейку с классами, строчек примерно столько же, но умеет больше
(управление решил через Form.keypreview)
Вложения
Тип файла: zip zmey.zip (2.0 Кбайт, 8 просмотров)
Ответить с цитированием
  #10  
Старый 24.06.2012, 10:09
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Цитата:
Сообщение от Pyro
накидал змейку с классами, строчек примерно столько же, но умеет больше
(управление решил через Form.keypreview)
прикольно, ну тк кнопок нет же вот и нет проблем
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:18.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025