[SFML 2.0]Kolizja boxowa
Ostatnio zmodyfikowano 2015-03-18 14:44
GGG205 Temat założony przez niniejszego użytkownika |
[SFML 2.0]Kolizja boxowa » 2015-03-18 11:32:30 Cześć! Robię grę podobną do flappy birtha na kwadratach, aby obsłużyć błędy używam kolizji boxowej, ale nie działa postać dalej przechodzi przez bloki. Zastanawiam się czy obiekty mają złe wartości, ale gdy sprawdzałem nic takiego nie znalazłem. KOD generowaniu bloczku i obsługi kolizji: class Game { private: vector < Block > BlDown; vector < Block > BlUp; Block bl; Character kieryk; public: Game() : kieryk( 300, 300, "Glowa.png" ) { for( int i = 0; i < 3; i++ ) { BlDown.push_back( bl ); BlUp.push_back( bl ); BlDown[ i ].SetPos( 800 +( i * 300 ), 450 ); BlUp[ i ].SetPos( 800 +( i * 300 ),( rand() % 20 ) * 2 ); } } void start( RenderWindow & wnd ) { kieryk.update( wnd ); for( int i = 0; i < 3; i++ ) { BlDown[ i ].Move(); BlUp[ i ].Move(); if( BlDown[ i ].GetPos().x <= - 121 ) { BlDown[ i ].SetPos( 800, 450 ); } if( BlUp[ i ].GetPos().x <= - 121 ) { BlUp[ i ].SetPos( 800, 0 ); } if( kieryk.getPosition().x + 76 >= BlUp[ i ].GetPos().x && kieryk.getPosition().x <= BlUp[ i ].GetPos().x + 121 && kieryk.getPosition().y + 115 >= BlUp[ i ].GetPos().y && kieryk.getPosition().y <= BlUp[ i ].GetPos().y + 184 ) wnd.close(); BlDown[ i ].draw( wnd ); BlUp[ i ].draw( wnd ); } } };
Bloki poruszają się za pomocą tej funkcji: speed = 0.2f; void Move() { blok.move(( - 1 ) * speed, 0.0f ); pos.x = blok.getPosition().x; pos.y = blok.getPosition().y; }
Postać lata za pomocą tej funkcji: void Fly() { if( Keyboard::isKeyPressed( Keyboard::Space ) ) vector.y -= 0.006; FlyKieryk.move( 0, vector.y ); vector.y += 0.001; }
|
|
Brunon3 |
» 2015-03-18 14:44:02 Kiedyś napisałem taką kolizję, nie jest to jakieś dzieło sztuki (czy tam kodu), ale zawsze coś: void App::Player_Collision( int x, int y, int w, int h ) { if( world.isScreenScroll ) { if(( player.y <=(( y ) + h ) ) &&( player.y + player.h >=( y ) ) ) { if(( player.x <=( x + w ) ) &&( player.x >= x + w / 2 ) ) { player.camera.x += 1 - world.speed; } } if(( player.y <=(( y ) + h ) ) &&( player.y + player.h >=( y ) ) ) { if(( player.x + player.w ) >= x &&( player.x + player.w <= x + w / 2 ) ) { player.camera.x -= 1 - world.speed; } } if(( player.x <=( x + w ) &&( player.x + player.w >= x ) ) ) { if((( player.y + player.h ) >= y ) &&( player.y + player.h <= y + h / 2 ) ) { player.y -= 1 - world.speed; } } if(( player.x <=( x + w ) ) &&( player.x + player.w >= x ) ) { if( player.y <=( y + h ) && player.y >= y + h / 2 ) { player.y += 1 - world.speed; } } } }
Gdzie "x, y, w, h" to pozycje boxa, a "player.camera.x, itd." to pozycje kamery gracza (wszystkie grafiki są od tej zmiennej odejmowane). -BD. |
|
« 1 » |