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: #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 ); oknoAplikacji.draw( spr ); oknoAplikacji.draw( pudlo ); pudlo.setPosition( 150, 200 ); oknoAplikacji.draw( text ); pud.x = pudlo.getPosition().x; pud.y = pudlo.getPosition().y; 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. |
|
DejaVu |
» 2013-01-25 21:12:31 oknoAplikacji.draw( obws ); obws.setPosition( 340, 211 );
Przemyśl czy kolejność wspomnianych linijek jest aby na pewno prawidłowa :) |
|
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... #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 ); 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.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.y = scx[ 2 ].getPosition().y; sciana.w = 70; sciana.h = 70; cout << "Z1: " << scx[ 0 ].getPosition().x << endl; 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; }
|
|
waxx |
» 2013-01-26 08:58:24 Przekazuj referencję sf::Sprite do funkcji wstaw_zkol. |
|
czosnek17 Temat założony przez niniejszego użytkownika |
» 2013-01-26 18:46:14 Już działa, dzięki. |
|
« 1 » |