[SFML] Kolizje ze ścianą
Ostatnio zmodyfikowano 2016-06-25 20:50
abdel123 Temat założony przez niniejszego użytkownika |
[SFML] Kolizje ze ścianą » 2016-06-25 17:12:30 Witam, napisałem funkcję odpowiadającą za poruszanie się w grze 2D. Mam natomiast problem z tym, że ściany blokują postać tylko wtedy kiedy ich pozycja x = pozycji x przeszkody. Daje cały kod gry: #include <SFML/Graphics.hpp> #include <iostream> #include <fstream> #include <string> sf::Event zdarzenie; sf::ContextSettings settings; sf::RenderWindow okno( sf::VideoMode( 1920, 1080, 32 ), "SFML", sf::Style::Fullscreen, settings ); const int x_kafli = 19; const int y_kafli = 17; int posx = 0; int posy = 450; sf::Clock zegar;
class Mapa { public: char type[ x_kafli ][ y_kafli ]; bool isWall[ x_kafli ][ y_kafli ]; sf::Sprite kafelek[ x_kafli ][ y_kafli ]; const int tile_width = 100; const int tile_height = 100; sf::Texture sky; sf::Texture grass; sf::Texture sun; sf::Texture wall; public: void load() { grass.loadFromFile( "img/0.jpg" ); sky.loadFromFile( "img/1.jpg" ); sun.loadFromFile( "img/2.jpg" ); wall.loadFromFile( "img/3.jpg" ); std::fstream file; file.open( "mapa.txt", std::ios::in ); if( file.good() == false ) { std::cout << "Blad wczytywania mapy!"; okno.close(); } else { for( int y = 0; y <= y_kafli - 1; y++ ) { for( int x = 0; x <= x_kafli - 1; x++ ) { file.get( type[ x ][ y ] ); std::cout << type[ x ][ y ]; if( type[ x ][ y ] == '0' ) { kafelek[ x ][ y ].setPosition( x * tile_width, y * tile_height ); kafelek[ x ][ y ].setTexture( sky ); } else if( type[ x ][ y ] == '#' ) { kafelek[ x ][ y ].setPosition( x * tile_width, y * tile_height ); kafelek[ x ][ y ].setTexture( grass ); isWall[ x ][ y ] = 1; } else if( type[ x ][ y ] == 'S' ) { kafelek[ x ][ y ].setPosition( x * tile_width, y * tile_height ); kafelek[ x ][ y ].setTexture( sun ); } else if( type[ x ][ y ] == 'W' ) { kafelek[ x ][ y ].setPosition( x * tile_width, y * tile_height ); kafelek[ x ][ y ].setTexture( wall ); isWall[ x ][ y ] = 1; } } } } } void draw() { for( int y = 0; y < y_kafli - 1; y++ ) { for( int x = 0; x < x_kafli - 1; x++ ) { okno.draw( kafelek[ x ][ y ] ); } } } }; class Mario { public: sf::Sprite mario1; sf::Texture mariotexture; int speed = 10.f; int jump = 20.f; bool start = true; void loadtexture() { mariotexture.loadFromFile( "img/mario.png" ); mario1.setTexture( mariotexture ); } void draw() { if( start == true ) { mario1.setPosition( posx, posy ); start = false; } okno.draw( mario1 ); } void ruch_i_kolizja( Mapa mapa ) { sf::Vector2f velocity( 2.f, 5.f ); const float maxY = 50.f; const sf::Vector2f gravity( 5.f, 5.f ); bool once = true; bool kolizja = false; if( sf::Keyboard::isKeyPressed( sf::Keyboard::D ) ) { for( int y = 0; y <= y_kafli - 1; y++ ) { for( int x = 0; x <= x_kafli - 1; x++ ) { if( mario1.getPosition().x + mapa.tile_width == mapa.kafelek[ x ][ y ].getPosition().x && mario1.getPosition().y + 50 == mapa.kafelek[ x ][ y ].getPosition().y && mapa.isWall[ x ][ y ] == 1 ) kolizja = true; } } if( kolizja != true ) { posx += speed; mario1.setPosition( posx, posy ); } } if( sf::Keyboard::isKeyPressed( sf::Keyboard::A ) ) / { for( int y = 0; y <= y_kafli - 1; y++ ) { for( int x = 0; x <= x_kafli - 1; x++ ) { if( mario1.getPosition().x - mapa.tile_width == mapa.kafelek[ x ][ y ].getPosition().x && mario1.getPosition().y + 50 == mapa.kafelek[ x ][ y ].getPosition().y && mapa.isWall[ x ][ y ] == 1 ) kolizja = true; } } if( kolizja != true ) { posx -= speed; mario1.setPosition( posx, posy ); } } if( sf::Keyboard::isKeyPressed( sf::Keyboard::W ) ) { posy -= 5; mario1.setPosition( posx, posy ); } if( sf::Keyboard::isKeyPressed( sf::Keyboard::S ) ) { posy += 5; mario1.setPosition( posx, posy ); } } }; int main() { Mapa mapa; mapa.load(); Mario mario; mario.loadtexture(); sf::Time time; while( okno.isOpen() ) { mapa.draw(); mario.draw(); while( zegar.getElapsedTime().asMilliseconds() > 20.f ) { okno.display(); zegar.restart(); mario.ruch_i_kolizja( mapa ); while( okno.pollEvent( zdarzenie ) ) { if( zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Middle ) { okno.close(); } if(( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::R ) ) mapa.load(); } } if( zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Middle ) okno.close(); } }
|
|
marcolo2307 |
» 2016-06-25 20:50:34 Nie analizowałem całości, ale x zmieniasz chyba tylko wtedy, gdy kolizja==false, więc jak już w coś uderzysz, to nie możesz się ruszyć. |
|
« 1 » |