• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ Builder, arkanoid problem z warunkiem kolizji

VPS Starter Arubacloud
0 głosów
479 wizyt
pytanie zadane 12 kwietnia 2016 w C i C++ przez DaaJay Początkujący (280 p.)

Witam. :) Piszę może z troszkę głupim pytaniem ale mam problem z mechanizmem kolizji z odcinka: https://www.youtube.com/watch?v=I_vW4KQ99Yk Otóż piłka nie wiem czemu potrafi zbić za jednym uderzeniem nawet pół planszy klocków. Wygląda to trochę jakby bool nie wykrywał kolizji z drugiej jednak strony to niemożliwe gdyż klocki znikają. Myślę że problem leży po stronie tego że może zbić więcej niż jeden klocek w poziomej linii tyle że piłka potrafi zbić 1, a następnie 2 i nawet 3 linie cegieł. Nie wiem jednak co dopisać i tu proszę o pomoc. Mam nadzieję że dobrze to wytłumaczyłem. :)

Oto bool kolizji(jest to w timerze):

bool collision(TImage * ball,  TImage * brick)
{
          if(ball->Left >= brick->Left-ball->Width &&
             ball->Left <= brick->Left+brick->Width &&
             ball->Top >= brick->Top-ball->Height &&
             ball->Top <= brick->Top+brick->Height)
             { return true; }else return false;
}

A to ify dla każdej z cegieł: 

//brick1 collision
    if(collision(b, brick1) && brick1->Visible==true)
    { x=-x; y=-y; to_win--; brick1->Visible=false; }

    //brick2 collision
    if(collision(b, brick2) && brick2->Visible==true)
    { x=-x; y=-y; to_win--; brick2->Visible=false; }

    //brick3 collision
    if(collision(b, brick3) && brick3->Visible==true)
    { x=-x; y=-y; to_win--; brick3->Visible=false; }

    //brick4 collision
    if(collision(b, brick4) && brick4->Visible==true)
    { x=-x; y=-y; to_win--; brick4->Visible=false; }

    //brick5 collision
    if(collision(b, brick5) && brick5->Visible==true)
    { x=-x; y=-y; to_win--; brick5->Visible=false; }

    //brick6 collision
    if(collision(b, brick6) && brick6->Visible==true)
    { x=-x; y=-y; to_win--; brick6->Visible=false; }

    //brick7 collision
    if(collision(b, brick7) && brick7->Visible==true)
    { x=-x; y=-y; to_win--; brick7->Visible=false; }

    //brick8 collision
    if(collision(b, brick8) && brick8->Visible==true)
    { x=-x; y=-y; to_win--; brick8->Visible=false; }

    //brick9 collision
    if(collision(b, brick9) && brick9->Visible==true)
    { x=-x; y=-y; to_win--; brick9->Visible=false; }

    //brick10 collision
    if(collision(b, brick10) && brick10->Visible==true)
    { x=-x; y=-y; to_win--; brick10->Visible=false; }

    //brick11 collision
    if(collision(b, brick11) && brick11->Visible==true)
    { x=-x; y=-y; to_win--; brick11->Visible=false; }

    //brick12 collision
    if(collision(b, brick12) && brick12->Visible==true)
    { x=-x; y=-y; to_win--; brick12->Visible=false; }

    //brick13 collision
    if(collision(b, brick13) && brick13->Visible==true)
    { x=-x; y=-y; to_win--; brick13->Visible=false; }

    //brick14 collision
    if(collision(b, brick14) && brick14->Visible==true)
    { x=-x; y=-y; to_win--; brick14->Visible=false; }

    //brick15 collision
    if(collision(b, brick15) && brick15->Visible==true)
    { x=-x; y=-y; to_win--; brick15->Visible=false; }

    //brick16 collision
    if(collision(b, brick16) && brick16->Visible==true)
    { x=-x; y=-y; to_win--; brick16->Visible=false; }

    //brick17 collision
    if(collision(b, brick17) && brick17->Visible==true)
    { x=-x; y=-y; to_win--; brick17->Visible=false; }

    //brick18 collision
    if(collision(b, brick18) && brick18->Visible==true)
    { x=-x; y=-y; to_win--; brick18->Visible=false; }

    //brick19 collision
    if(collision(b, brick19) && brick19->Visible==true)
    { x=-x; y=-y; to_win--; brick19->Visible=false; }

    //brick20 collision
    if(collision(b, brick20) && brick20->Visible==true)
    { x=-x; y=-y; to_win--; brick20->Visible=false; }

Z góry dziękuję za pomoc. To moje początki z tego typu programami, a bardzo chciałbym zrozumieć czemu to nie działa jak należy.

1 odpowiedź

+3 głosów
odpowiedź 12 kwietnia 2016 przez maciekak Obywatel (1,300 p.)
edycja 12 kwietnia 2016 przez maciekak
Witam,

Miałem kiedyś dokładnie taki sam problem z tym, w grze wyglądało to tak, że leci sobie super piłka, która niszczy na swojej drodze wszystko i nic nie jest w stanie jej zatrzymać :)

Problem najprawdopodobniej polega na tym, że jak piłka zderza się jednocześnie z dwoma klockami, to zachodzi podwójna zmiana kierunku (dla fizyków zwrotu :D) piłki, czyli na przykład na początku współrzędne prędkości piłki wynoszą x=5 i y=5, po pierwszym zmieniają się na przeciwne czyli x=-5 i y=-5, a jednocześnie następuje zderzenie z jeszcze jednym klockiem i współrzędne znowu zmieniają się na przeciwne co w konsekwencji powoduje to, że wracają do początkowych wartości x=5 i y=5

Nie pamiętam dokładnie jak ten problem rozwiązałem, ale z tego co na tę chwilę mi się kojarzy, to dodałem nową zmienną bool na początku przypisałem jej wartość false, a w każdym warunku, jeśli zachodziło zderzenie to zmieniałem jej wartość na true, a dopiero po wszystkich zderzeniach i usunięciu klocków zmieniałem kierunek piłki, a wartość zmiennej ustawiałem znowu na false.

I to by było na tyle, mam nadzieję, że pomogłem :)
komentarz 13 kwietnia 2016 przez DaaJay Początkujący (280 p.)

Troszkę rozjaśniłeś jednak mam pewien problem nadal. Nie wiem w jaki sposób wykryć te zderzenia/usunięcie klocków. Chciałbyś to zrobić w ifie kolizji dla każdej z cegieł? Myślisz o czymś na ten wzorzec(ten nowy bool to "marker"): 

//cegla 1 kolizja
if(collision(b, brick1) && brick1->Visible==true)
    {  to_win--; brick1->Visible=false; marker = true;}


//Tu ten tajemniczy kod wykrycia :D
{ x = -x; y=-y; marker=false;}

 

komentarz 13 kwietnia 2016 przez maciekak Obywatel (1,300 p.)

Po prostu na sam koniec tej listy ifów dodajesz kolejnego:

if(marker)
{ x = -x; y=-y; marker = false;}

PS. Chciało Ci się 20 razy pisać to samo? :P

komentarz 14 kwietnia 2016 przez DaaJay Początkujący (280 p.)
Wygląda na to że działa. :) Wielkie dzięki za pomoc, a co do pisania to po prostu kopiowałem kod tak jak na odcinku ale masz racje, przydałoby się tym zająć.

Podobne pytania

0 głosów
1 odpowiedź 197 wizyt
pytanie zadane 23 kwietnia 2016 w JavaScript przez TakIoKoder Bywalec (2,560 p.)
0 głosów
1 odpowiedź 923 wizyt
0 głosów
3 odpowiedzi 411 wizyt
pytanie zadane 9 marca 2019 w C i C++ przez Ender_ Początkujący (370 p.)

92,957 zapytań

141,916 odpowiedzi

321,147 komentarzy

62,287 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...