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

SFML Arkanoid kolizja piłki z wieloma cegiełkami

Object Storage Arubacloud
0 głosów
394 wizyt
pytanie zadane 19 maja 2015 w C i C++ przez figorin Bywalec (2,040 p.)
edycja 19 maja 2015 przez figorin
Cześć,

piszę grę Arkanoid i jestem już prawie ją skończyłem,jedank męczy mnie jeden problem.Moje cegiełki są ustawione jedna obok drugiej i gdy moja piłka dotyka dwie. lub trzy cegiełki naraz,dochodzi do znisczenia wszystkich cegiełek.Chcę sprawić,aby piłka mogła za jednym razem zniszczyć tylko jedną cegiełkę, o to kod kolizji z przykładową cegiełką:

void Engine::collisions(RectangleShape &rec, CircleShape &ball, RectangleShape brick[], int &toWin, sf::Vector2f &pos, Sprite &won)
{

    sf::FloatRect box1(rec.getGlobalBounds());
    sf::FloatRect box2(ball.getGlobalBounds());

    sf::FloatRect box3(brick[0].getGlobalBounds());
    sf::FloatRect box4(brick[1].getGlobalBounds());
    sf::FloatRect box5(brick[2].getGlobalBounds());
    sf::FloatRect box6(brick[3].getGlobalBounds());
    sf::FloatRect box7(brick[4].getGlobalBounds());
    sf::FloatRect box8(brick[5].getGlobalBounds());
    sf::FloatRect box9(brick[6].getGlobalBounds());
    sf::FloatRect box10(brick[7].getGlobalBounds());

    sf::FloatRect box11(brick[8].getGlobalBounds());
    sf::FloatRect box12(brick[9].getGlobalBounds());
    sf::FloatRect box13(brick[10].getGlobalBounds());
    sf::FloatRect box14(brick[11].getGlobalBounds());
    sf::FloatRect box15(brick[12].getGlobalBounds());
    sf::FloatRect box16(brick[13].getGlobalBounds());

    sf::FloatRect box17(brick[14].getGlobalBounds());
    sf::FloatRect box18(brick[15].getGlobalBounds());
    sf::FloatRect box19(brick[16].getGlobalBounds());
    sf::FloatRect box20(brick[17].getGlobalBounds());
    ball.move(pos.x, pos.y);
    //paddle collision
    if (box1.intersects(box2))
    {
        //pos.x = -pos.x;
        ball.setPosition(ball.getPosition().x - 1, ball.getPosition().y - 2);
        pos.y = -pos.y;

    }
    //left side collision
    else if (ball.getPosition().x <= 0)
    {
        pos.x = -pos.x;
        //pos.y = -pos.y;
    }
    //right side collision
    else if (ball.getPosition().x >= 960)
    {
        pos.x = -pos.x;
        //pos.y = -pos.y;
    }
    //top side colliosn
    else if (ball.getPosition().y <= 0)
    {
        //pos.x = -pos.x;
        pos.y = -pos.y;
    }
    //bricks collision

    else if (box3.intersects(box2) && canDestroy==true)
    {
        canDestroy = false;
        pos.x = -pos.x;
        pos.y = -pos.y;
        ball.setPosition(ball.getPosition().x - 1, ball.getPosition().y + 1);
        brick[0].setPosition(1000, 1000); toWin++;
        canDestroy = true; sound.play();
    }
    else if (box4.intersects(box2) && canDestroy == true)
    {
        canDestroy = false;
        pos.x = -pos.x;
        pos.y = -pos.y;
        ball.setPosition(ball.getPosition().x - 1, ball.getPosition().y + 1);
        brick[1].setPosition(1000, 1000); toWin++;
        canDestroy = true; sound.play();
    }
    else if (box5.intersects(box2) && canDestroy == true)
    {
        canDestroy = false;
        pos.x = -pos.x;
        pos.y = -pos.y;
        ball.setPosition(ball.getPosition().x - 1, ball.getPosition().y + 1);
        brick[2].setPosition(1000, 1000); toWin++;
        canDestroy = true; sound.play();
    }
    else if (box6.intersects(box2) && canDestroy == true)
    {
        canDestroy = false;
        pos.x = -pos.x;
        pos.y = -pos.y;
        ball.setPosition(ball.getPosition().x - 1, ball.getPosition().y + 1);
        brick[3].setPosition(1000, 1000); toWin++;
        canDestroy = true; sound.play();
    }
    else if (box7.intersects(box2) && canDestroy == true)
    {
        canDestroy = false;
        pos.x = -pos.x;
        pos.y = -pos.y;
        ball.setPosition(ball.getPosition().x - 1, ball.getPosition().y + 1);
        brick[4].setPosition(1000, 1000); toWin++;
        canDestroy = true; sound.play();
    }
    else if (box8.intersects(box2) && canDestroy == true)
    {
        canDestroy = false;
        pos.x = -pos.x;
        pos.y = -pos.y;
        ball.setPosition(ball.getPosition().x - 1, ball.getPosition().y + 1);
        brick[5].setPosition(1000, 1000); toWin++;
        canDestroy = true; sound.play();
    }
    else if (box9.intersects(box2) && canDestroy == true)
    {
        canDestroy = false;
        pos.x = -pos.x;
        pos.y = -pos.y;
        ball.setPosition(ball.getPosition().x - 1, ball.getPosition().y + 1);
        brick[6].setPosition(1000, 1000); toWin++;
        canDestroy = true; sound.play();
    }
    else if (box10.intersects(box2) && canDestroy == true)
    {
        canDestroy = false;
        pos.x = -pos.x;
        pos.y = -pos.y;
        ball.setPosition(ball.getPosition().x - 1, ball.getPosition().y + 1);
        brick[7].setPosition(1000, 1000); toWin++;
        canDestroy = true; sound.play();
    }
    else if (box11.intersects(box2) && canDestroy == true)
    {
        canDestroy = false;
        pos.x = -pos.x;
        pos.y = -pos.y;
        ball.setPosition(ball.getPosition().x - 1, ball.getPosition().y + 1);
        brick[8].setPosition(1000, 1000); toWin++;
        canDestroy = true; sound.play();
    }
    else if (box12.intersects(box2) && canDestroy == true)
    {
        canDestroy = false;
        pos.x = -pos.x;
        pos.y = -pos.y;
        ball.setPosition(ball.getPosition().x - 1, ball.getPosition().y + 1);
        brick[9].setPosition(1000, 1000); toWin++;
        canDestroy = true; sound.play();
    }
    else if (box13.intersects(box2) && canDestroy == true)
    {
        canDestroy = false;
        pos.x = -pos.x;
        pos.y = -pos.y;
        ball.setPosition(ball.getPosition().x - 1, ball.getPosition().y + 1);
        brick[10].setPosition(1000, 1000); toWin++;
        canDestroy = true; sound.play();
    }
    else if (box14.intersects(box2) && canDestroy == true)
    {
        canDestroy = false;
        pos.x = -pos.x;
        pos.y = -pos.y;
        ball.setPosition(ball.getPosition().x - 1, ball.getPosition().y + 1);
        brick[11].setPosition(1000, 1000); toWin++;
        canDestroy = true; sound.play();
    }
    else if (box15.intersects(box2) && canDestroy == true)
    {
        canDestroy = false;
        pos.x = -pos.x;
        pos.y = -pos.y;
        ball.setPosition(ball.getPosition().x - 1, ball.getPosition().y + 1);
        brick[12].setPosition(1000, 1000); toWin++;
        canDestroy = true; sound.play();
    }
    else if (box16.intersects(box2) && canDestroy == true)
    {
        canDestroy = false;
        pos.x = -pos.x;
        pos.y = -pos.y;
        ball.setPosition(ball.getPosition().x - 1, ball.getPosition().y + 1);
        brick[13].setPosition(1000, 1000); toWin++;
        canDestroy = true; sound.play();
    }
    else if (box17.intersects(box2) && canDestroy == true)
    {
        canDestroy = false;
        pos.x = -pos.x;
        pos.y = -pos.y;
        ball.setPosition(ball.getPosition().x - 1, ball.getPosition().y + 1);
        brick[14].setPosition(1000, 1000); toWin++;
        canDestroy = true; sound.play();
    }
    else if (box18.intersects(box2) && canDestroy == true)
    {
        canDestroy = false;
        pos.x = -pos.x;
        pos.y = -pos.y;
        ball.setPosition(ball.getPosition().x - 1, ball.getPosition().y + 1);
        brick[15].setPosition(1000, 1000); toWin++;
        canDestroy = true; sound.play();
    }
    else if (box19.intersects(box2) && canDestroy == true)
    {
        canDestroy = false;
        pos.x = -pos.x;
        pos.y = -pos.y;
        ball.setPosition(ball.getPosition().x - 1, ball.getPosition().y + 1);
        brick[16].setPosition(1000, 1000); toWin++;
        canDestroy = true; sound.play();
    }
    else if (box20.intersects(box2) && canDestroy == true)
    {
        canDestroy = false;
        pos.x = -pos.x;
        pos.y = -pos.y;
        ball.setPosition(ball.getPosition().x - 1, ball.getPosition().y + 1);
        brick[17].setPosition(1000, 1000); toWin++;
        canDestroy = true; sound.play();
    }
    
}

1 odpowiedź

+1 głos
odpowiedź 19 maja 2015 przez Bartek85 Mądrala (7,440 p.)
wybrane 19 maja 2015 przez figorin
 
Najlepsza
Wklej więcej kodu... a nie taki ogryzek.
komentarz 19 maja 2015 przez figorin Bywalec (2,040 p.)
dodałem kod całej funkcji.
komentarz 19 maja 2015 przez Bartek85 Mądrala (7,440 p.)
Jeżeli zmienna canDestroy służy do ozneczenia , czy można zniszczyć cegiełkę, to proponuje ją ustawiać na false w tych if'ach //bricks collision, kiedy już nastąpiła kolizja. Tam w tych ifak na końu zmieniasz z powrotem ta flage na true, to umożliwia niszcze kolejnych cegielek. Może się tak zdarzyć, że to będzie nie wystarczajace. Zdarzenie w którym będzie można zbić następną cegiełkę, to odbicie sie od jakies ściany. Czyli lewa/prawa/góra, w tych ifach wstaw canDestroy = true, w pozostałych if'ach //brick collision w doł, po wejsciu w if zmien flage na false do następnego zejścia w dół.

Mam nadzieję, że pomogłem.

P.S Twój kod jest... (uzyj tu słów, których nie chcesz użyć). To co napisałeś można zamknąć w o wiele czytelniejszy sposób w ~15 linijkach.
komentarz 19 maja 2015 przez figorin Bywalec (2,040 p.)

dzięki wielkie za obie rady,logika kolizji działa teraz prawidłowo.

Podobne pytania

0 głosów
1 odpowiedź 688 wizyt
pytanie zadane 11 grudnia 2017 w C i C++ przez seba360pl Początkujący (260 p.)
0 głosów
2 odpowiedzi 625 wizyt
pytanie zadane 13 maja 2015 w C i C++ przez figorin Bywalec (2,040 p.)
0 głosów
0 odpowiedzi 862 wizyt
pytanie zadane 10 listopada 2016 w Nasze projekty przez L33TT12 Gaduła (3,950 p.)

92,556 zapytań

141,404 odpowiedzi

319,561 komentarzy

61,942 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...