C++ [Pong] Kula wbija się w paletkę podczas jej ruchu

0

Witam
Tak jak w temacie mam problem z grą typu "ping-pong", mianowicie detekcja zderzeń działa jak należy - kulka odbija się od paletki zarówno od jej wszystkich krawędzi jak i rogów, jednakże pojawia się problem przy zderzeniu kulki z górną oraz dolną częścią paletki (wliczając też w sumie rogi) w trakcie jej ruchu (paletka porusza się w górę oraz w dół po przyciśnięciu odpowiednich klawiszy).
Kulka tak jakby wbija się w paletkę (gdzie też prawdopodobnie odbija się w niej ileś tam razy) i dopiero po pewnym czasie "odbija się" od niej.

Próbowałem tworzyć instrukcje warunkowe, gdzie np. przy ruchu paletki w górę dodawałem po odbiciu kulki od górnej części paletki wartość wektora prędkości paletki (0,-1) do wektora prędkości kulki vy i po czym odwracałem ten wektor (na zasadzie kąt padania = kąt odbicia). Oto fragment kodu dla detekcji zderzenia kulki z górną częścią paletki i jej obsługi.

y,vy,r - to pozycja y w osi kulki, jej prędkość wektora vy i promień
arg2 - to wartość y paletki
arg1 - wartość x paletki (dodam, że te dane aktualizują się)
p_y - zmienna pomocnicza, jeżeli naciskamy np. W (czyli poruszamy paletką w górę), to wynosi ona -1, jako, że y paletki maleje, a więc paletka jest w ruchu (tj. wektor predkosci paletki)

if(y+vy+r>=arg2+p_y && y<arg2+p_y && x>=arg1 && x<=arg1+20){ //GORA
/* sprawdzamy czy, kulka znajduje sie w obszarze nie wiekszym niz gorny brzeg paletki i tez mniejszym
    jak rowniez sprawdzamy czy kulka znajduje sie miedzy lewa a prawa krawedzia paletki
    staralem sie dodawac p_y zeby przy kolejnej klatce moc lepiej wykryc kolizje */       
       
                       if(dir==4){ // vx rosnie i vy rosnie
                                  vy*=-1;
                                  play_sample(dzwiek_odbicia_od_sciany, 155,127,1000,0);
                                  }
                       else if(dir==3){ // vx maleje i vy rosnie
                            vy*=-1;
                            play_sample(dzwiek_odbicia_od_sciany, 155,127,1000,0);
                            }/*
                            if(p_y>0) vy+=1.0; //odtad wlasnie probowalem cos zdzialac, ale na marne (ten 1-szy warunek jest tez w sumie i
                                                      //nie potrzebny, bo pilka dobrze sie odbija od paletki jadacej w dol (pilka leci z gory)
                            else if(p_y<0) vy-=1.0; 
                            */

Pozdrawiam i mam nadzieję, że w miarę wytłumaczyłem na czym polega mój problem.

1

Po odbiciu piłki przestań sprawdzać kolizje paletek z piłką, aż piłka przeleci na drugą połowę planszy.

0

Niestety, ale nic to nie dało. Dodam może jeszcze, że mój program składa się na 1 paletkę znajdującą się w środku okienka oraz 2 kule odbijające się od ścian jak i od siebie (ich kolizje działają jak należy) - piłki nigdzie nie wylatują poza okno programu, tylko po prostu nieskończenie się odbijają.

Co do umieszczonego przeze mnie kodu to, próbowałem już sprawdzać czy kula porusza się na przeciwko paletki, jednakże nic to nie dawało, jak również odejmowałem/dodawałem wektor prędkości paletki od położenia paletki w osi Y co również się nie powiodło (innymi słowy próbowałem modyfikować warunek z powyższego fragmentu kodu na różne sposoby). Ograniczenie prędkości paletki nie wchodzi w grę - utrata na płynności programu (co mi z "wleczącej się" paletki ;) )

0
kornik1991 napisał(a):

Niestety, ale nic to nie dało.

Skoro to nic nie dało, to znaczy, że to źle zrobiłeś. Możesz po odbiciu na ułamek sekundy wyłączyć sprawdzanie kolizji i to musi działać. Piłka nie będzie się blokować i odbijać kilka razy, nie ma takiej możliwości.

kornik1991 napisał(a):

Ograniczenie prędkości paletki nie wchodzi w grę - utrata na płynności programu (co mi z "wleczącej się" paletki ;) )

Nie musisz uzależniać prędkości symulacji od prędkości wyświetlania (jeśli o to Ci chodzi). Jak chcesz bardzo dokładne kolizje, to:

  1. Używasz typu double do przechowywania pozycji obiektów i wektoraów przemieszczenia.
  2. Wykonujesz sprawdzanie kolizji kilka razy na wyświetlaną klatkę animacji, przesuwasz obiekty "kilka" razy w pętli o 1/"kilka" * wektor przemieszczenia, jednocześnie sprawdzając kolizje.
0

Ponieważ jak podejrzewam wartość vy jest większa niż 1 to pozwalasz na to by piłka przeleciała poza paletkę jedyne co robisz to zmieniasz wektor prędkości i za chwile wpadasz w ten sam warunek.
Powinieneś zrealizować to w następujący sposób:
f68c1410f8.png
Ewentualnie jak chcesz jedynie odwalić chałę to dodaj do warunku: && vy>0

0

Rozwiązałem dany problem w następujący sposób, mianowicie: skoro paletka porusza się w górę/dół, to jakby nie patrzeć osiąga ona pewien wektor prędkości (np. (0,1) //x,y), a więc należy ten wektor prędkości przekazać piłce odbitej od danej paletki, tym samym nie będzie sytuacji, że paletka będzie się cały czas wbijać w piłkę, albowiem ta otrzymując nową prędkość wektorową "ucieknie" jej. Dodam iż nie wiem czy jest to najlepsze rozwiązanie, ale wydaje mi się być mniej więcej logiczne.

@_13th_Dragon, tak, dodałem wcześniej już taki warunek.

0

Może najpierw sprawdź czy nastąpiła kolizja. Do tego nie jest Ci potrzebny wektor prędkosci tylko położenie obiektów w przestrzeni. Potem decyduj jak ma się zachować piłka i ewentualnie paletka.

1 użytkowników online, w tym zalogowanych: 0, gości: 1