Wpis z mikrobloga

Mirki,

Ma może ktoś pojęcie dlaczego tak się dzieje jak na filmiku?

Zacząłem się uczyć VCL i piszę prostą grę ala tank na pegasus.

Chciałbym, żeby czołg zmieniał orientację przy zmianie kierunku jazdy.

W tej funkcji odczytuję ostatnio wciśnięty przycisk:

void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key,

TShiftState Shift)

{

ostatni = Key;

if(Key == VKUP) ruchWgore->Enabled = false;

if(Key == VK
DOWN) ruchWdol->Enabled = false;

}

w tej zaś ustawiam, aby wykonał się Flip() po odpowiednim ifie:

void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,

TShiftState Shift)

{

if(Key == VKUP)

{

if(ostatni==VK
DOWN)

{

Flip(czolgPion);

}

ruchWgore->Enabled = true;

}

if(Key == VKDOWN)

{

if(ostatni==VK
UP)

{

Flip(czolgPion);

}

ruchWdol->Enabled = true;

}

}

W momencie, kiedy raz przycisnę strzałkę w górę bądź w dół i zrobię malutką przerwę w następnym naciśnięciu przycisku wszystko działa tak jak powinno, co widać w pierwszej części filmiku. Kiedy jednak wcisnę strzałkę i trzymam ją bez przerwy, to po jakimś czasie czołg wariuje i zmienia orientację ciągle, co widać na drugiej części filmiku.

Ma ktoś jakieś rady apropo tego?

#programowanie
xmaniox - Mirki,



Ma może ktoś pojęcie dlaczego tak się dzieje jak na filmiku? 

Za...
  • 22
  • Odpowiedz
@dfdrdedwdsdxdcdv: No ale w funkcji, która odpowiada za zwolnienie przycisku zapisywany jest właśnie ostatni przycisk. Potem w funkcji do naciskania przycisku sprawdzam, który przycisk był ostatnio wciśnięty. Na podstawie tego obracam lub nie. No i dlaczego działa, jak wcisnę przycisk dwa razy z krótkim odstępem czasu a już nie działa jak ciągle trzymam?
  • Odpowiedz
@xmaniox: nie wiem jak ma byc tylko mysle gdzie jest blad.

Skoro ostatni jest zapamietywany tylko przy keyup a ty trzymasz caly czas wcisniety, to ostatni nie jest zapamietany/nie jest zapamietany poprawnie. To jak to ma dzialac?

Naokolo pierwszy pomysl: nie zapamietuj ostatniego tylko, ale cos jak statechanged t/f i obsluguj wszystko na keypress albo keydown... Zgaduje bo mi sie myslec nie chce, szukam pracy.
  • Odpowiedz
@xmaniox: prawdopodobnie dlatego, że przy pojedynczym trzymaniu masz na okrętkę wywoływane FormKeyDown, w którym nie nadpisujesz wartości "ostatni". Przy każdym wywołaniu trzymając VKUP funkcja widzi w polu "ostatni" wartość VKDOWN i na odwrót. Z tego powodu przy każdym wywołaniu leci wywołanie funkcji "flip". Dodaj na końcu FormKeyDown ostatni = Key; i powinno pomóc.
  • Odpowiedz
@taju: Tak, właśnie do tego doszedłem. Hmm.. Czyli chciałbym zrobić tak, żeby w funkcji Down znana była wartość ostatni z poprzedniej funkcji Up.
  • Odpowiedz
@xmaniox: Może zamiast ruchWdol, ruchWgore itp dodaj do klasy czołgu pole odpowiadające za kąt w stopniach (angle) określający jego zwrot (przyjmij, że 0 to góra, 90 prawo, 180 dół, 270 lewo) oraz pole speed określające prędkość. Dzięki temu twój czołg nie będzie mógł próbować ustawić się w kilku kierunkach jednocześnie. W zdarzeniach klawiszy zmieniaj tylko wartość angle i speed (np. wciśnięcie VKDOWN to angle = 180, speed 100, puszczenie
  • Odpowiedz