Witam
Mam dość nietypowy problem, właściwie pytam bardziej w celu zrozumienia co tu się dzieje, bo jest to dość dziwne i niesymetryczne.
Mianowicie piszę w builderze prostego arkanoida i po przegranej są dwa sposoby na zresetowanie planszy: kliknięcie na napis "game over" (gameoverMouseUp) oraz naciśnięcie dowolnego klawisza (FormKeyDown).
Każdy z tych sposobów po prostu uruchamia funkcję restart() która w obu przypadkach wykonuje się tak samo aż do paru ostatnich linii kodu w których zawarta jest pętla ustawiająca Visible wszystkich bloków na true.
W przypadku gdy naciskamy myszką na "game over" wszystko się wykonuje poprawnie, zaś gdy naciskamy klawisz to wszystko (albo większość, nie sprawdzałem każdej linijki, jednak np paletka i piłka wracają na pozycję startową, co dowodzi że funkcja faktycznie została uruchomiona) oprócz tej ostatniej pętli działa.
Nie rozumiem co ma na to wpływ, funkcja jest wywoływana jako pierwsza w zdarzeniu, nawet nie ma żadnych argumentów a jedyne czym się te sytuacje różnią to event który ją uruchamia.
void restart()
{
hor_unit=HOR_UNIT;
ver_unit=VER_UNIT;
Form1->paddleMoveLeft->Interval=PADDLE_FREQ;
Form1->paddleMoveRight->Interval=PADDLE_FREQ;
Form1->ballMove->Interval=BALL_FREQ;
int pleft=Form1->ClientWidth/2-Form1->paddle->Width/2;
int ptop=Form1->ClientHeight*27/32;
Form1->paddle->Left=pleft;
Form1->paddle->Top=ptop;
Form1->ball->Top=ptop-Form1->ball->Height*2;
Form1->ball->Left=pleft+Form1->paddle->Width/2-Form1->ball->Width/2;
Form1->gameover->Visible=false;
Form1->ball->Visible=true;
Form1->ballMove->Enabled=true;
TImage * bricks[NUM_BLOCKS]={Form1->brick1,Form1->brick2,Form1->brick3,Form1->brick4,Form1->brick5,Form1->brick6,Form1->brick7,Form1->brick8,Form1->brick9,Form1->brick10,Form1->brick11,Form1->brick12};
for(int i;i<NUM_BLOCKS;i++) //NUM_BLOCKS zostało zdefiniowane na samym początku pliku .h (tuż po includach)
{
bricks[i]->Visible=true;
Form1->Button1->Visible=true; //tą linię dodałem aby sprawdzić kiedy pętla się wykona, a kiedy nie. Wedle przypuszczeń button pojawiał się tylko przy kliknięciu myszką
}
//gdy linię z buttonem dodałem tuż przed oraz tuż po pętli, przycisk pojawiał się w każdym przypadku
}
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(gameover->Visible==true&&Key!=VK_LEFT&&Key!=VK_RIGHT)restart(); // nawet gdy warunek uprościłem do if(gameover->Visible==true)restart(); nic się nie zmieniło
if(Key == VK_LEFT)paddleMoveLeft->Enabled=true; //próbowałem także przenieść do innego eventu: OnKeyUp oraz OnKeyPress, jednak nic się nie zmieniło
if(Key == VK_RIGHT)paddleMoveRight->Enabled=true;
}
void __fastcall TForm1::gameoverMouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
restart(); //a tu jakoś wszystko zawsze działa
}