Snake - poruszanie się

0

Witam. Piszę snake'a w pascalu (z dołączoną biblioteką allegro) i mam problem, nie wiem jak napisać zmianę kierunku, moja procedura wygląda tak:

procedure ReadInput;
begin
  if al_keypressed() then
  begin
    key := al_readkey();
    case key of
      al_key_up:
        direction := 0;
      al_key_right:
        direction := 1;
      al_key_down:
        direction := 2;
      al_key_left:
        direction := 3;
      else
        Exit;
    end;
  end;
end; 

i później w procedurze update jest:

  if direction = 0 then
    tmpy := player[0].ycoord - 1;
  if direction = 1 then
    tmpx := player[0].xcoord + 1;
  if direction = 2 then
    tmpy := player[0].ycoord + 1;
  if direction = 3 then
    tmpx := player[0].xcoord - 1;

cała gra zaś ma postać:

Repeat
	readInput;
	update;
	draw;
	delay(100);
Until al_key[al_KEY_ESC];   

Nie wiem jak zapisać tę pierwszą procedurę, aby odczytywała wciśnięty klawisz poprawnie :(

0

Jakie są objawy niepoprawnego odczytywania klawiszy?

0

wąż w ogóle nie reaguje na wczytywane klawisze, idzie po prostu do przodu, więc chyba nie przypisuje do key klawisza strzałki. A znowu jak mam tak napisaną tę procedurę:

procedure ReadInput;
begin
  if al_keypressed() then
  begin
    if (al_key[al_KEY_UP]) and (direction <> 2) then
      direction := 0;
    if (al_key[al_KEY_RIGHT]) and (direction <> 3) then
      direction := 1;
    if (al_key[al_KEY_DOWN]) and (direction <> 0) then
      direction := 2;
    if (al_key[al_KEY_LEFT]) and (direction <> 1) then
      direction := 3;
  end;
end;

to muszę trzymać klawisz strzałki, aż wąż skręci.

2
If GetKeyState(VK_LEFT) < 0 then Direction := 0;
0
procedure ReadInput;
begin
    if GetKeyState(VK_UP) < 0 then
      direction := 0;
    if GetKeyState(VK_RIGHT) < 0 then
      direction := 1;
    if GetKeyState(VK_DOWN) < 0 then
      direction := 2;
    if GetKeyState(VK_LEFT) < 0 then
      direction := 3;
end;   

zmieniłem to tak jak powyżej, ale nadal to samo... trzeba trzymać klawisz, aż wąż zmieni kierunek :/

1

To szukaj gdzie zmieniasz wartość: direction
Albo nie używasz player[0].xcoord,player[0].ycoord

4
  if direction = 0 then
    tmpy := player[0].ycoord - 1;
  if direction = 1 then
    tmpx := player[0].xcoord + 1;
  if direction = 2 then
    tmpy := player[0].ycoord + 1;
  if direction = 3 then
    tmpx := player[0].xcoord - 1;

To zamień na case albo dodaj else Przyspieszy to działanie kodu.

I z klawiszami strzałek jest taki problem że są dwubajtowe. I trzeba w przypadku konsoli pobierać je przy pomocy dwóch ReadKey, A w przypadku ZenGL przypisywać do zmiennej mogącej pomieścić dane większe od jednego bajta (np. Integer). Nie wiem jak jest z Allegro ale może pokombinuj w tę stronę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1