Kolizja - Sprite'y SFML

0

Mam otóż mały problem bo nie wiem za bardzo jak zrobić kolizje dwóch sprite'ów są jakieś tutoriale ale kompletnie z nich nic nie wywnioskowałem i jedyne co to udało mi się znaleźć taki kod i prosiłbym o pomoc w jego modyfikacji :)

O to kod:

 #include <SFML/Graphics.hpp>
#include <vector>
class cGracz {
   
    sf::RectangleShape kwadrat;
    float predkosc = 150.f;
    bool doGory, doDolu, wPrawo, wLewo;
public:
    cGracz( sf::Vector2f rozmiar )
    {
        kwadrat.setSize( rozmiar );
    }
   
    void zmienPozycje( sf::Vector2f pozycja )
    {
        kwadrat.setPosition( pozycja );
    }
   
    void aktualizuj()
    {
        doGory = false; doDolu = false;
        wLewo = false; wPrawo = false;
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) )
             doGory = true;
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) )
             doDolu = true;
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) )
             wLewo = true;
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) )
             wPrawo = true;
       
    }
   
    void ruch( sf::Vector2f v )
    {
        kwadrat.move( v );
    }
   
    sf::Vector2f ruch( sf::Time czas )
    {
        sf::Vector2f v( 0, 0 );
        if( doGory )
             v.y -= predkosc;
       
        if( doDolu )
             v.y += predkosc;
       
        if( wLewo )
             v.x -= predkosc;
       
        if( wPrawo )
             v.x += predkosc;
       
        return v * czas.asSeconds();
    }
   
    sf::FloatRect doKolizji()
    {
        return kwadrat.getGlobalBounds();
    }
   
    void rysuj( sf::RenderWindow & okno )
    {
        okno.draw( kwadrat );
    }
   
};

class Kolizje
{
public:
    static void czyKoliduje( cGracz & g1, std::vector < cGracz > V, sf::Vector2f ruch )
    {
        sf::FloatRect X = g1.doKolizji();
        sf::FloatRect Y = g1.doKolizji();
        X.left += ruch.x;
        Y.top += ruch.y;
        bool kolX = false; bool kolY = false;
       
        for( int i = 0; i < V.size(); i++ )
        if( X.intersects( V[ i ].doKolizji() ) )
             kolX = true;
        else if( Y.intersects( V[ i ].doKolizji() ) )
             kolY = true;
       
        if( !kolX )
             g1.ruch( sf::Vector2f( ruch.x, 0 ) );
       
        if( !kolY )
             g1.ruch( sf::Vector2f( 0, ruch.y ) );
       
    }
};

int main()
{
    sf::RenderWindow oknoAplikacji( sf::VideoMode( 800, 600 ), "Kolizje" );
   
    sf::Clock zegar;
    sf::Time CzasOdAktualizacji = sf::Time::Zero;
    const sf::Time KrokCzasowy = sf::seconds( 1.f / 160.f );
    cGracz gracz( sf::Vector2f( 50, 50 ) ); // <-- Tu chciałbym wstawić tego sprite'a
    cGracz on( sf::Vector2f( 50, 50 ) ); on.zmienPozycje( sf::Vector2f( 200, 200 ) );
    cGracz inny( sf::Vector2f( 50, 50 ) ); inny.zmienPozycje( sf::Vector2f( 300, 300 ) );
    cGracz inny2( sf::Vector2f( 50, 50 ) ); inny2.zmienPozycje( sf::Vector2f( 380, 180 ) );
    std::vector < cGracz > V;
    V.push_back( on );
    V.push_back( inny );
    V.push_back( inny2 );
    while( oknoAplikacji.isOpen() )
    {
        sf::Time Czas = zegar.restart();
        CzasOdAktualizacji += Czas;
        gracz.aktualizuj();
        while( CzasOdAktualizacji > KrokCzasowy )
        {
            CzasOdAktualizacji -= KrokCzasowy;
            sf::Event zdarzenie;
            while( oknoAplikacji.pollEvent( zdarzenie ) )
            {
                if( zdarzenie.type == sf::Event::Closed )
                     oknoAplikacji.close();
               
            }
            Kolizje::czyKoliduje( gracz, V, gracz.ruch( KrokCzasowy ) );
        }
        oknoAplikacji.clear();
        gracz.rysuj( oknoAplikacji );
        for( int i = 0; i < V.size(); i++ )
             V[ i ].rysuj( oknoAplikacji );
       
        oknoAplikacji.display();
       
    }
    return 0;
}

a tu sprite który chce tam umieścić :

sf::Texture tekstura; ///deklaracja tekstury
tekstura.loadFromFile( "sprite do wykorzystania2.png" );

sf::Sprite obrazek;
obrazek.setTexture( tekstura ); 

A i Od razu podaje wymiary obrazka : 60x137

0
  1. Parę dni temu tłumaczyłem na tym forum, jak działa najprostsza forma kolizji.
  2. Czytaj dokumentację. sf::Sprite posiada sf::FloatRect, który jest jego boundsami. sf::FloatRect ma metody intersects() i contains(). http://www.sfml-dev.org/documentation/2.3.2/classsf_1_1Rect.php
  3. Nie używaj polskiego nazewnictwa.
0

@up Ok, zrobiłem tak jak mówiłeś ale czy mógłbyś mi pomóc z tym kodem ? :

#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <vector>

int main()
{


 sf::RenderWindow oknoAplikacji( sf::VideoMode( 640, 480, 32 ), "MWPG" );


sf::Texture tekstura;                                      ///deklaracja tekstury
tekstura.loadFromFile("sprite do wykorzystania2.png" sf::IntRect(60, 137)); ///nazwa sprite do wczytania wraz z sciezka

sf::Texture tekstura2;
tekstura2.loadFromFile("KAMIEN.jpg" , sf::IntRect(50, 50, 640, 75));

sf::Texture tekstura3;
tekstura3.loadFromFile("KAMIEN.jpg" , sf::IntRect(50, 50, 640, 300));

sf::Texture tekstura4;
tekstura4.loadFromFile("Lewy profil.png" , sf::IntRect(60, 137, 60, 137));

sf::Sprite obrazek( tekstura ),obrazek2( tekstura2 ),obrazek3( tekstura3 ),obrazek4( tekstura4 ); /// << bez tej funkcji sf::Sprite funkcja draw nie będzie działać !!!

obrazek.setPosition( 250, 210 ); ///pozycja pierwsza to x druga to y

obrazek2.setPosition( 0,0 );

obrazek3.setPosition( 0,345 );

obrazek4.setScale( 0.5, 0.65 );
obrazek4.setPosition( 250, 210 );

sf::FloatRect robrazek;
sf::FloatRect robrazek2;
sf::FloatRect robrazek3;

float ballspeed = 400.f;
float ballx = 0;
float bally = 100;
int x = 3;

robrazek.top = obrazek.getPosition().y;
	    robrazek.left = obrazek.getPosition().x;
	    robrazek.bottom = robrazek.top + obrazek.getSize().y;
	    robrazek.right = robrazek.left + obrazek.getSize().x;
  robrazek2.top = obrazek2.getPosition().y;
  robrazek2.left = obrazek2.getPosition().x;
  robrazek2.bottom = robrazek2.top + obrazek2.getSize().y;
  robrazek2.right = robrazek2.top + obrazek2.getSize().x;
  robrazek3.top = obrazek3.getPosition().y;
  robrazek3.left = obrazek3.getPosition().x;
  robrazek3.bottom = robrazek3.top + obrazek3.getSize().y;
  robrazek3.right = robrazek3.top + obrazek3.getSize().x;
  obrazek.move(ballx * gElapsedTime, bally * gElapsedTime);
  if (robrazek.intersects(robrazek3))
  {
   ballx = -ballx;
   bally = -bally;
  }
  if (robrazek.intersects(robrazek2))
  {
   ballx = -ballx;
   bally = -bally;
  }
  float ElapsedTime = App.GetFrameTime();







sf::Music music;
if (!music.openFromFile("muza.ogg"))
    return -1; // error



music.setLoop(true);
music.play();

    while( oknoAplikacji.isOpen() )
    {
        sf::Event zdarzenie;
        while( oknoAplikacji.pollEvent( zdarzenie ) )
        {
           if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Right ) ///gdy nacisniemy strzalke w prawo to postac idzie w prawo
                obrazek.move( + 2 , 0 );

            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Left ) ///gdy nacisniemy strzalke w prawo to postac idzie w lewo
                obrazek.move( - 2 , 0 );

            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Up ) ///gdy nacisniemy strzalke w gore to postac idzie w gore
                obrazek.move( 0 , - 2 );

            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Down ) ///gdy nacisniemy strzalke w dol to postac idzie w dol
                obrazek.move( 0 , + 2 );

            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Space ) ///gdy nacisniemy spacje to postac idzie piec pikseli do gory
                obrazek.move( 0 , - 15 );

            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::I )
                obrazek.rotate( 180 );

            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::K )
                obrazek.rotate( - 180 );
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Tab ) ///gdy nacisniemy spacje to postac idzie piec pikseli do gory
                music.pause();
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Return ) ///gdy nacisniemy spacje to postac idzie piec pikseli do gory
                music.play();

            if( zdarzenie.type == sf::Event::Closed ) ///Gdy wyłączymy klikajac na "czerowny krzyzyk"
                 oknoAplikacji.close();

            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape ) ///gdy nacisniemy ESC
                 oknoAplikacji.close();

            if( zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Middle ) ///gdy nacisniemy środ.przycisk myszki
                 oknoAplikacji.close();

        }
        oknoAplikacji.clear( sf::Color::Red ); ///Wazne!!!! Nazwy kolorow z Duzej litery!!!!
        oknoAplikacji.draw( obrazek ); ///narysowanie sprite'a na ekranie
        oknoAplikacji.draw( obrazek2 );
        oknoAplikacji.draw( obrazek3 );
        oknoAplikacji.display();
    }

    return 0;
}
 

Logi:

main.cpp: In function ‘int main()’:
main.cpp54: error: expected ‘)’ before ‘sf’
tekstura.loadFromFile("sprite do wykorzystania2.png" sf::IntRect(60, 137)); ///
^
main.cpp15: error: ‘sf::FloatRect {aka class sf::Rect<float>}’ has no member named ‘bottom’
robrazek.bottom = robrazek.top + obrazek.getSize().y;
^
main.cpp47: error: ‘class sf::Sprite’ has no member named ‘getSize’
robrazek.bottom = robrazek.top + obrazek.getSize().y;
^
main.cpp15: error: ‘sf::FloatRect {aka class sf::Rect<float>}’ has no member named ‘right’
robrazek.right = robrazek.left + obrazek.getSize().x;
^
main.cpp47: error: ‘class sf::Sprite’ has no member named ‘getSize’
robrazek.right = robrazek.left + obrazek.getSize().x;
^
main.cpp13: error: ‘sf::FloatRect {aka class sf::Rect<float>}’ has no member named ‘bottom’
robrazek2.bottom = robrazek2.top + obrazek2.getSize().y;
^
main.cpp47: error: ‘class sf::Sprite’ has no member named ‘getSize’
robrazek2.bottom = robrazek2.top + obrazek2.getSize().y;
^
main.cpp13: error: ‘sf::FloatRect {aka class sf::Rect<float>}’ has no member named ‘right’
robrazek2.right = robrazek2.top + obrazek2.getSize().x;
^
main.cpp46: error: ‘class sf::Sprite’ has no member named ‘getSize’
robrazek2.right = robrazek2.top + obrazek2.getSize().x;
^
main.cpp13: error: ‘sf::FloatRect {aka class sf::Rect<float>}’ has no member named ‘bottom’
robrazek3.bottom = robrazek3.top + obrazek3.getSize().y;
^
main.cpp47: error: ‘class sf::Sprite’ has no member named ‘getSize’
robrazek3.bottom = robrazek3.top + obrazek3.getSize().y;
^
main.cpp13: error: ‘sf::FloatRect {aka class sf::Rect<float>}’ has no member named ‘right’
robrazek3.right = robrazek3.top + obrazek3.getSize().x;
^
main.cpp46: error: ‘class sf::Sprite’ has no member named ‘getSize’
robrazek3.right = robrazek3.top + obrazek3.getSize().x;
^
main.cpp24: error: ‘gElapsedTime’ was not declared in this scope
obrazek.move(ballx * gElapsedTime, bally * gElapsedTime);
^
main.cpp30: error: expected primary-expression before ‘.’ token
float ElapsedTime = clock_t.GetFrameTime();
^

P.S.A jeżeli nie chcesz mi pomóc w przypadku tego kodu ^ to chociaż podaj link do tematu z punktu pierwszego :)

Edit: Można zamknąć temat ponieważ sobie poradziłem z problemem dzięki tutorialowi z youtube'a
Podaje link jakby ktoś chciał :

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