Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

SFML 2.0 problem z funkcją setPosition()

Ostatnio zmodyfikowano 2013-01-26 18:46
Autor Wiadomość
czosnek17
Temat założony przez niniejszego użytkownika
SFML 2.0 problem z funkcją setPosition()
» 2013-01-25 21:04:15
Aby kod nie było toporny chcę napisać funkcję, której podaję sprita i pozycję na której ma być, a ona wyświetli go tam i automatycznie ustawi dla niego kolizje (tego ostatniego jeszcze nie zrobiłem i nie do końca jasno wiem jak to ma wyglądać).
Mam problem z ustawianiem sprita w tej funkcji. Wyświetla się, ale w rogu okna i nie przesuwa się na podane współrzędne.
Jeżeli ustawiam sprita po funkcji go wyświetlającej to działa. Kod:
C/C++
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

class poz
{
public:
    float x, y, w, h;
    void wstaw_zkol( sf::Sprite obws, int x, int y, int rozmiar, sf::RenderWindow & oknoAplikacji );
   
};

void poz::wstaw_zkol( sf::Sprite obws, int x, int y, int rozmiar, sf::RenderWindow & oknoAplikacji )
{
    poz obwsx;
   
    oknoAplikacji.draw( obws );
    obws.setPosition( 340, 211 );
   
   
    obwsx.x = obws.getPosition().x;
    obwsx.y = obws.getPosition().y;
    obwsx.w = rozmiar;
    obwsx.h = rozmiar;
    cout << "scsx\n";
   
   
}


inline int los()
{
    return( rand() % 254 ) + 0;
}

bool CzyKolizja( poz * A, poz * B )
{
    if( A->x >=( B->x + B->w ) )
         return false;
   
    if(( A->x + A->w ) <= B->x )
         return false;
   
    if( A->y >=( B->y + B->h ) )
         return false;
   
    if(( A->y + A->h ) <= B->y )
         return false;
   
    return true;
}

int main()
{
    srand( time( NULL ) );
    int iz = 0;
    int iz2 = 0;
    int ispc = 0;
    sf::RenderWindow oknoAplikacji( sf::VideoMode( 800, 600, 32 ), "Kurs SFML 2.0 - http://cpp0x.pl" );
   
    sf::Texture obr;
    obr.loadFromFile( "obr.png" );
   
    sf::Sprite spr;
    spr.setTexture( obr );
   
    sf::Texture pu;
    pu.loadFromFile( "pd.png" );
   
    sf::Sprite pudlo;
    pudlo.setTexture( pu );
   
    sf::Font font;
    font.loadFromFile( "arial.ttf" );
   
    sf::Text text;
    text.setFont( font );
    text.setString( "Hello World!" );
   
   
   
    sf::Texture sci;
    sci.loadFromFile( "sci.png" );
    sf::Sprite scx[ 10 ];
    for( int i = 0; i != 9; i++ )
    {
        scx[ i ].setTexture( sci );
        cout << "X\n";
    }
   
    poz pud;
    poz kol;
    poz klsci;
   
   
    while( oknoAplikacji.isOpen() )
    {
       
       
        klsci.wstaw_zkol( scx[ 0 ], 300, 200, 70, oknoAplikacji );
       
        //scx[0].setPosition(250, 370);
        //tu działa
       
       
        oknoAplikacji.draw( spr );
       
       
        oknoAplikacji.draw( pudlo );
        pudlo.setPosition( 150, 200 );
        oknoAplikacji.draw( text );
       
       
       
        pud.x = pudlo.getPosition().x;
        pud.y = pudlo.getPosition().y;
        //pud.x = 150;
        //pud.y = 200;
        pud.w = 70;
        pud.h = 70;
       
        kol.x = spr.getPosition().x;
        kol.y = spr.getPosition().y;
        kol.w = 70;
        kol.h = 70;
       
       
        if( CzyKolizja( & pud, & kol ) )
        {
            cout << "Kolizja";
        }
       
        sf::Event zdarzenie;
        while( oknoAplikacji.pollEvent( zdarzenie ) )
        {
           
            if( zdarzenie.type == sf::Event::Closed )
                 oknoAplikacji.close();
           
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape )
                 oknoAplikacji.close();
           
           
           
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Right )
                 spr.move( 5, 0 );
           
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Left )
                 spr.move( - 5, 0 );
           
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Up )
                 spr.move( 0, - 5 );
           
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Down )
                 spr.move( 0, 5 );
           
            if(( sf::Keyboard::isKeyPressed( sf::Keyboard::Space ) ) )
            {
                spr.rotate( 45 );
                cout <<++ispc << endl;
            }
           
           
           
           
            if( zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Middle )
                 oknoAplikacji.close();
           
            if( sf::Mouse::isButtonPressed( sf::Mouse::Left ) )
            {
                cout << "AAAAAAAAAA" << endl;
                oknoAplikacji.clear( sf::Color( los(), los(), los(), 6 ) );
               
            }
        }
        oknoAplikacji.display();
        oknoAplikacji.clear( sf::Color( 144, 222, 111 ) );
    }
    return 0;
}
PS: właśnie przypomniałem sobie o STL (czy jakoś tak). Dobre by to było do układania klocków z automatycznym ustawianiem kolizji? Kiedyś do czegoś tego używałem i dobrze nie pamiętam.
P-75005
DejaVu
» 2013-01-25 21:12:31
C/C++
oknoAplikacji.draw( obws ); //rysujesz
obws.setPosition( 340, 211 ); //zmieniasz pozycję
Przemyśl czy kolejność wspomnianych linijek jest aby na pewno prawidłowa :)
P-75006
czosnek17
Temat założony przez niniejszego użytkownika
» 2013-01-25 21:30:35
Już działa, dzięki :)
Jeszcze na chwilę otworzę, mam następny problem:
Ustawiam 3 kwadraty w różnych miejscach na ekranie i robię dla nich kolizje. Ale program zachowuje się tak, jakby tek kwadraty siedziały w lewym górnym rogu - kolizja się wykrywa dla tamtego obszaru, a tam gdzie rzeczywiście są te kwadraty - nie. Wypisałem pozycje tych kwadratów funkcją getPosition() i wszędzie jest zero. Nie wiem z jakiej racji, przecież ustawiam je w różnych miejscach funkcją wstaw_zkol() i na ekranie widać że są w tych miejscach, ale program dziwnie się zachowuje...

C/C++
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

class poz
{
public:
    float x, y, w, h;
    void wstaw_zkol( sf::Sprite obws, int xp, int yp, int rozmiar, sf::RenderWindow & oknoAplikacji );
   
};

void poz::wstaw_zkol( sf::Sprite obws, int xp, int yp, int rozmiar, sf::RenderWindow & oknoAplikacji )
{
    poz obwsx;
   
    obws.setPosition( xp, yp ); // to nie działa
    oknoAplikacji.draw( obws );
   
   
   
    obwsx.x = obws.getPosition().x;
    obwsx.y = obws.getPosition().y;
    obwsx.w = rozmiar;
    obwsx.h = rozmiar;
    cout << "scsx\n";
   
   
}


inline int los()
{
    return( rand() % 254 ) + 0;
}

bool CzyKolizja( poz * A, poz * B )
{
    if( A->x >=( B->x + B->w ) )
         return false;
   
    if(( A->x + A->w ) <= B->x )
         return false;
   
    if( A->y >=( B->y + B->h ) )
         return false;
   
    if(( A->y + A->h ) <= B->y )
         return false;
   
    return true;
}

int main()
{
    srand( time( NULL ) );
    int iz = 0;
    int iz2 = 0;
    int ispc = 0;
    sf::RenderWindow oknoAplikacji( sf::VideoMode( 800, 600, 32 ), "Kurs SFML 2.0 - http://cpp0x.pl" );
   
    sf::Texture obr;
    obr.loadFromFile( "obr.png" );
   
    sf::Sprite spr;
    spr.setTexture( obr );
   
    sf::Texture pu;
    pu.loadFromFile( "pd.png" );
   
    sf::Sprite pudlo;
    pudlo.setTexture( pu );
   
    sf::Font font;
    font.loadFromFile( "arial.ttf" );
   
    sf::Text text;
    text.setFont( font );
    text.setString( "Hello World!" );
   
   
   
    sf::Texture sci;
    sci.loadFromFile( "sci.png" );
    sf::Sprite scx[ 10 ];
    for( int i = 0; i != 9; i++ )
    {
        scx[ i ].setTexture( sci );
        cout << "X\n";
    }
   
    poz pud;
    poz kol;
    poz klsci;
    poz sciana;
   
   
    while( oknoAplikacji.isOpen() )
    {
       
       
        klsci.wstaw_zkol( scx[ 0 ], 100, 300, 70, oknoAplikacji );
        klsci.wstaw_zkol( scx[ 1 ], 300, 300, 70, oknoAplikacji );
        klsci.wstaw_zkol( scx[ 2 ], 300, 100, 70, oknoAplikacji );
       
       
        oknoAplikacji.draw( spr );
       
       
        oknoAplikacji.draw( pudlo );
        pudlo.setPosition( 150, 200 );
        oknoAplikacji.draw( text );
       
       
       
        pud.x = pudlo.getPosition().x;
        pud.y = pudlo.getPosition().y;
        //pud.x = 150;
        //pud.y = 200;
        pud.w = 70;
        pud.h = 70;
       
        kol.x = spr.getPosition().x;
        kol.y = spr.getPosition().y;
        kol.w = 70;
        kol.h = 70;
       
        sciana.x = scx[ 2 ].getPosition().x; //sciana
        sciana.y = scx[ 2 ].getPosition().y;
       
        sciana.w = 70;
        sciana.h = 70;
       
       
        cout << "Z1: " << scx[ 0 ].getPosition().x << endl; // tu wszedzie wypisuje zera
        cout << "Z2: " << scx[ 0 ].getPosition().y << endl;
        cout << "Z3: " << scx[ 1 ].getPosition().x << endl;
        cout << "Z4: " << scx[ 1 ].getPosition().y << endl;
        cout << "Z5: " << scx[ 2 ].getPosition().x << endl;
        cout << "Z6: " << scx[ 2 ].getPosition().y << endl;
       
       
        if( CzyKolizja( & pud, & kol ) )
        {
            cout << "Kolizja";
        }
       
        if( CzyKolizja( & sciana, & kol ) )
        {
            cout << "zKolizja";
        }
       
        sf::Event zdarzenie;
        while( oknoAplikacji.pollEvent( zdarzenie ) )
        {
           
            if( zdarzenie.type == sf::Event::Closed )
                 oknoAplikacji.close();
           
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape )
                 oknoAplikacji.close();
           
           
           
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Right )
                 spr.move( 5, 0 );
           
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Left )
                 spr.move( - 5, 0 );
           
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Up )
                 spr.move( 0, - 5 );
           
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Down )
                 spr.move( 0, 5 );
           
            if(( sf::Keyboard::isKeyPressed( sf::Keyboard::Space ) ) )
            {
                spr.rotate( 45 );
                cout <<++ispc << endl;
            }
           
           
            if( zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Middle )
                 oknoAplikacji.close();
           
            if( sf::Mouse::isButtonPressed( sf::Mouse::Left ) )
            {
                cout << "AAAAAAAAAA" << endl;
                oknoAplikacji.clear( sf::Color( los(), los(), los(), 6 ) );
               
            }
        }
        oknoAplikacji.display();
        oknoAplikacji.clear( sf::Color( 144, 222, 111 ) );
    }
    return 0;
}
P-75007
waxx
» 2013-01-26 08:58:24
Przekazuj referencję sf::Sprite do funkcji wstaw_zkol.
P-75038
czosnek17
Temat założony przez niniejszego użytkownika
» 2013-01-26 18:46:14
Już działa, dzięki.
P-75094
« 1 »
  Strona 1 z 1