• 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
420 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ź 151 wizyt
pytanie zadane 23 kwietnia 2016 w JavaScript przez TakIoKoder Bywalec (2,560 p.)
0 głosów
1 odpowiedź 677 wizyt
0 głosów
3 odpowiedzi 284 wizyt
pytanie zadane 9 marca 2019 w C i C++ przez Ender_ Początkujący (370 p.)

92,454 zapytań

141,262 odpowiedzi

319,090 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...