Движение прямоугольников нажатием клавиш

Toybike

Нужно чтобы два прямоугольника двигались двумя игроками независимо друг от друга. При нажатии клавиш W,S первым игроком или UP,DOWN вторым игроком ничего не происходит, хотя прямоугольники должны двигаться, что я не так написал? Используются ABCObjects, GraphABC Такое ощущение, что переменным kUpKey,kDownKey и т.д не присваиваются значения тру и фолс
/// Событие - обработчик нажатия клавиатуры
procedure KeyDown(Key: integer);
begin
   case Key of
      VK_Up:     kUpKey := True; 
      VK_Down:   kDownKey := True; 
      VK_W:      kUpKey2 := True; 
      VK_S:      kDownKey2 := True; 
   end;
end;
 
/// Событие - обработчик отжатия клавиатуры
procedure KeyUp(Key: integer);
begin
   case Key of
      VK_Up:    kUpKey := False;
      VK_Down:  kDownKey := False;
      VK_W:     kUpKey2 := False;
      VK_S:     kDownKey2 := False;
   end;
end;
 
///начало игры
procedure StartGame1;
begin
  window.Clear(clblack);
  startbutton.Destroy;
  player1 := new RectangleABC(50,250,15,100,clwhite);
  player2 := new RectangleABC(750,250,15,100,clwhite);
  OnKeyDown:=KeyDown;
  OnKeyUp:=KeyUp;
 
 if (kUpKey) then player1.MoveOn(0,-15);
 if (kUpKey2) then player2.MoveOn(0,-15);
 if (kDownKey) then player1.MoveOn(0,15);
 if (kDownKey2) then player2.MoveOn(0,15);
 
end;
5 ответов

Toybike

Жаль не видно весь код, такое чувство, что нужен ещё модуль Events


Toybike

Паскаль не ругается на onkeydown и ******* дело не в events, я думаю


Toybike

По кускам кода очень сложно разбираться. Нужен код полностью.


Toybike

вот полный код этого юнита:
Кликните здесь для просмотра всего текста
unit StartGame;
 
interface
 
uses
  ABCObjects, GraphABC, ABCButtons,events; //Добавление events ничего не изменило
 
procedure beforestart;
procedure StartGame1;
procedure KeyDown(Key: integer);
procedure KeyUp(Key: integer);
 
var startbutton:ButtonABC;
    player1:rectangleABC;
    player2:rectangleABC;
    kUpKey, kDownKey,kUpKey2,kDownKey2:boolean; 
    
implementation
 
///стартовый экран
procedure beforestart;
begin
  window.Title := 'Ping Pong';
  window.SetSize(800, 600);
  window.IsFixedSize := true;
  centerwindow;
  SetSmoothingOn;
  window.Clear(clblack);
  brush.color := color.Empty;
  font.Size := 25;
  font.Color := clwhite;
  textout(290, 230, 'Ping Pong v0.1');
  startbutton := new ButtonABC(325, 275, 150, 50, 'START', clwhite);
  startbutton.OnClick := StartGame1;
end;
 
/// Событие - обработчик нажатия клавиатуры
procedure KeyDown(Key: integer);
begin
   case Key of
      VK_Up:     kUpKey := True;
      VK_Down:   kDownKey := True; 
      VK_W:      kUpKey2 := True; 
      VK_S:      kDownKey2 := True; 
   end;
end;
 
/// Событие - обработчик отжатия клавиатуры
procedure KeyUp(Key: integer);
begin
   case Key of
      VK_Up:    kUpKey := False;
      VK_Down:  kDownKey := False;
      VK_W:     kUpKey2 := False;
      VK_S:     kDownKey2 := False;
   end;
end;
 
///начало игры
procedure StartGame1;
begin
  window.Clear(clblack);
  startbutton.Destroy;
  player1 := new RectangleABC(50,250,15,100,clwhite);
  player2 := new RectangleABC(750,250,15,100,clwhite);
  OnKeyDown:=KeyDown;
  OnKeyUp:=KeyUp;
 
 if (kUpKey) then  player1.MoveOn(0,-15);
 if (kUpKey2) then player2.MoveOn(0,-15);
 if (kDownKey) then player1.MoveOn(0,15);
 if (kDownKey2) then player2.MoveOn(0,15);
end;
 
///если использовать эту процедуру, то платформы двигаются, но конфликт клавиш возникает(один игрок мешает другому)
{procedure KeyDown(Key: integer);
begin
   case Key of
  VK_W: if player1.Position.Y>0 then player1.MoveOn(0,-15);
  VK_S: if player1.Position.Y<500 then player1.MoveOn(0,15);
  VK_UP: if player2.Position.Y>0 then player2.MoveOn(0,-15);
  VK_DOWN: if player2.Position.Y<500 then player2.MoveOn(0,15);
     end;
end;}
 
end.
а вот основного юнита
Кликните здесь для просмотра всего текста
//Ping pong
 
uses
  ABCObjects,
  GraphABC,
  ABCButtons,
  StartGame;
 
begin
  beforestart();
  
end.


Toybike

volvo Это код ABC.NET