• 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

0 głosów
134 wizyt
pytanie zadane 12 kwietnia 2016 w C i C++ przez DaaJay Początkujący (300 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 (300 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 (300 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ź 54 wizyt
pytanie zadane 23 kwietnia 2016 w JavaScript, jQuery, AJAX przez TakIoKoder Obywatel (1,840 p.)
0 głosów
1 odpowiedź 93 wizyt
0 głosów
1 odpowiedź 78 wizyt
pytanie zadane 11 grudnia 2017 w C i C++ przez seba360pl Nowicjusz (240 p.)
Porady nie od parady
Możesz zmodyfikować, zamknąć lub ukryć swoje pytanie, za pomocą przycisków znajdujących się pod nim. Nie krępuj się poprawić pochopnie opublikowanego pytania czy zamknąć go po uzyskaniu satysfakcjonującej odpowiedzi. Umożliwi to zachowanie porządku na forum.
Ciekawy innych porad? Odwiedź tę stronę!

45,647 zapytań

86,006 odpowiedzi

171,760 komentarzy

22,136 pasjonatów

Przeglądających: 157
Pasjonatów: 2 Gości: 155

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...