Snake - poruszanie się

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:

Kopiuj
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:

Kopiuj
  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ć:

Kopiuj
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 :(

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

Jakie są objawy niepoprawnego odczytywania klawiszy?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
XI
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 3 lata
  • Postów:19
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ę:

Kopiuj
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.

edytowany 2x, ostatnio: xiviali
X0
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:24
2
Kopiuj
If GetKeyState(VK_LEFT) < 0 then Direction := 0;
edytowany 1x, ostatnio: flowCRANE
flowCRANE
Kod wrzucaj w znaczniki &lt;code=delphi&gt;&lt;/code&gt;
XI
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 3 lata
  • Postów:19
0
Kopiuj
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 :/

X0
kod wrzuć do Timera
X0
pewnie coś pochrzaniłeś u mnie zawsze działa. może zmieniasz wartość direction w innym miejscu kodu
X0
jeśli to dasz w OnKeyDown formy i na niej masz jakiś obiekt który ma aktualnie Focusa - to normalne że forma nie obsłuży komunikatu OnKeyDown tylko ten obiekt - dlatego nie działa
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
1

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
XI
wartość direction jest zmieniana tylko w procedurze ReadInput, a xcoord i ycoord są używane w procedurze Update. Podsumowując: procedura z pierwszego postu wcale nie zmienia kierunku (nie przypisuje nic do zmiennej key), a z mojego drugiego i trzeciego działają, ale trzeba mieć wciśnięty ten klawisz, aż delay minie i po prostu wąż skręci, da się temu jakoś zapobiec?
_13th_Dragon
to szukaj gdzie jeszcze używasz al_readkey()
XI
tylko w procedurze ReadInput, ale problem rozwiązałem :) Po prostu podzieliłem delay(300) na mniejsze porcje i częściej sprawdza czy klawisz nie został wciśnięty.
babubabu
  • Rejestracja:około 13 lat
  • Ostatnio:2 miesiące
  • Lokalizacja:Łódź
  • Postów:648
4
Kopiuj
  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ę.

Zobacz pozostały 1 komentarz
_13th_Dragon
to al_readkey - to coś innego.
ŁF
if/else nie jest szybszy od case'a, za to case jest dużo bardziej czytelny. Dodam też, że używanie magicznych numerów to bardzo zła praktyka. Zastąp te numery stałymi, kod stanie się czytelniejszy, a za rok czy dwa będzie łatwiej przypomnieć sobie o co chodziło.
flowCRANE
@ŁF, @babubabu - dodanie else przede wszystkim wykluczy konieczność sprawdzenia wszystkich warunków, a teraz wszystkie są sprawdzane, nawet jeśli pierwszy będzie prawidłowy (i także przyspieszy działanie); No i w obecnym przypadku case będzie najlepszym rozwiązaniem, bo każdy warunek sprawdza wartość tej samej zmiennej; I słuszna uwaga - numerki precz, trzeba zadeklarować stałe;
Patryk27
Tutaj w ogóle nie trzeba żadnych ifów czy kejsów, tylko dwie tablice i po sprawie...
ŁF
@furious programming zauważ, że napisałem "if/else", chociaż niewiele brakowało, żebym przegapił brak else-ów w podanym kodzie.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)