wojownik266 Temat założony przez niniejszego użytkownika |
[SFML] Błędne działanie kolizji » 2012-11-12 16:00:28 Wiem ze ten temat pojawiał się już wielokrotnie ale nie mam innego wyjścia... Dlatego proszę o wyrozumiałość i odpowiedzenie na pytanie dotyczące kolizji. Pytanie jest następujące: Dlaczego kolizja w tym programie nie działa, co jest źle? Proszę o wskazówki dotyczące rozwiązania tego problemu. Dziękuję! #include <SFML\Graphics.hpp> #include "Gracz.h" #include <iostream> struct Poz { float x, y; float w, h; }; bool Kolizja( 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() { sf::RenderWindow App( sf::VideoMode( SZER_EKR, WYSO_EKR, 32 ), "AnimScroll" ); sf::Texture back, back1, anim, lancuch, lancuch1, statek; back.loadFromFile( "Grafika/Background.png" ); back1.loadFromFile( "Grafika/Background.png" ); anim.loadFromFile( "Grafika/Animacja_1.png" ); lancuch.loadFromFile( "Grafika/lancuch.png" ); lancuch1.loadFromFile( "Grafika/lancuch.png" ); statek.loadFromFile( "Grafika/statek.png" ); sf::Sprite Back( back ), Anim( anim ); sf::Sprite Back1( back1 ); sf::Sprite Lancuch( lancuch ); sf::Sprite Lancuch1( lancuch1 ); sf::Sprite Statek( statek ); float x = 0, y = 0, x1 = 0; float bx = 0, by = 0, bx1 = 0, by1 =- WYSO_EKR; float lancx = 185, lancy = 450; float lancx1 = 610, lancy1 = 450; float statx = 400, staty = 520; Poz lan, statek_1; lan.x = 610; lan.y = 450; lan.w = 128; lan.h = 60; statek_1.x = 400; statek_1.y = 520; statek_1.w = 60; statek_1.h = 60; while( App.isOpen() ) { App.clear(); sf::Event Event; while( App.pollEvent( Event ) ) { if(( Event.type == sf::Event::Closed ) || sf::Keyboard::isKeyPressed( sf::Keyboard::Escape ) ) { App.close(); } if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) ) { statek_1.x -= 15.0; } if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) ) { statek_1.x += 15.0; } if( sf::Keyboard::isKeyPressed( sf::Keyboard::Space ) ) { } } Gracz gra; gra.back_scrolowanie_y( Back, Back1, bx, by, bx1, by1 ); gra.anim_scrollowanie( Anim, x, y, x1 ); if( Kolizja( lan, statek_1 ) ) { std::cout << "Kolizja" << std::endl; statek_1.y = 0; } Lancuch.rotate( 0.05 ); Lancuch1.rotate( 0.05 ); Lancuch.setPosition( lancx, lancy ); Lancuch1.setPosition( lan.x, lan.y ); Statek.setPosition( statek_1.x, statek_1.y ); App.draw( Back ); App.draw( Back1 ); App.draw( Anim ); App.draw( Lancuch ); App.draw( Lancuch1 ); App.draw( Statek ); App.display(); } return EXIT_SUCCESS; }
|
|
Mrovqa |
» 2012-11-12 20:43:03 Gracz gra; gra.back_scrolowanie_y( Back, Back1, bx, by, bx1, by1 ); gra.anim_scrollowanie( Anim, x, y, x1 );
Tworzysz grę w głównej pętli. Nie lepszym rozwiązaniem byłoby stworzyć go raz, przed główną pętlą? Co do kolizji - spróbuj przedebuggować kod. |
|
wojownik266 Temat założony przez niniejszego użytkownika |
» 2012-11-12 20:56:16 Co do tworzenia kodu w głównej pętli masz zupełną rację a ja kolejny problem który nie wiem jak rozwiązać! Mógłbyś napisać o tym tworzeniu nieco obszerniej? Byłbym Ci bardzo wdzięczny! |
|
Mrovqa |
» 2012-11-12 22:13:17 Nie znam kodu Twojej klasy, ale samo przeniesienie Gracz gra; przed główną pętle while( App.isOpen() ) powinno przyspieszyć działanie aplikacji, ale w każdym razie nie zaszkodzi :) |
|
wojownik266 Temat założony przez niniejszego użytkownika |
» 2012-11-13 10:14:27 Wygrzebałem w internecie kod kolizji który ku memu zdziwieniu działa jak na razie wyśmienicie. Tak że temat kolizji częściowo - rozwiązany. Jak by co to dam znać:) Kolizja ma sie tak: bool kolizja( float x, float y, float x2, float y2 ) { if( abs( x2 - x ) > 20 || abs( y2 - y ) > 20 ) return false; else return true; }
|
|
kubawal |
» 2012-11-13 15:11:19 Ciekawy algorytm. Skąd go wziąłeś? |
|
wojownik266 Temat założony przez niniejszego użytkownika |
» 2012-11-13 15:38:33 |
|
« 1 » |