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

[SFML] Kolizje ze ścianą

Ostatnio zmodyfikowano 2016-06-25 20:50
Autor Wiadomość
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:
C/C++
#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 ) ) // czy wciśnięto strzałkę w lewo
        {
            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 /*Mario zajmuje 1.5 bloczka tutaj wypelniam do 200px*/ == 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 /*Mario zajmuje 1.5 bloczka tutaj wypelniam do 200px*/ == 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 ) ) // czy wciśnięto strzałkę w lewo
        {
            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();
       
    }
}
P-149449
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ć.
P-149453
« 1 »
  Strona 1 z 1