SFML - kolizja(problem z algorytmem)

Odpowiedz Nowy wątek
2015-01-25 09:29
0

Witam
Mam taką oto zagwozdkę.

W mojej grze chce dodac kolizje. Kolizje dzialaja lecz nie moge zrobic czegos takiego ze jak wystapi kolizja to wyswietla sie na ekranie Game Over.

W obecnym kodzie mam metode GameDraw() kora odpowiada za rysowanie wszystkiego oraz GameOver() ktora odpowiada za wyswietlenie napisu Game Over.

Czy ktos moglby mi powiedziec jak to napisac aby GameDraw przerwalo wykonanie po wystapieniu kolizji bo nie moge z tym sie uporac i mam takie cos jak wystapi kolizja ekran czarny + gracz, a gdy wyjde za obszar kolizji to znowu rysuje mape. A chce zeby po wystapieniu kolizji nie moglem sie juz poruszac tylko wczytac od nowa gre.

Prosze o pomoc

Oto kod:

#include "Game.h"

sf::Vector2f velocity(sf::Vector2f(0, 0));
Game::Game(void)
{

    sf::Vector2i source(1, Down);

    if (textureBackground.loadFromFile("background.png"))
    {
        spriteBackground.setTexture(textureBackground);
    }

    window.create(sf::VideoMode(1366,768), "Runner");

    //wczytanie tekstur
    for (int i = 1; i<Level::LAVA; i++)
    {
        tekstura[i].loadFromFile("Leveltexture.png", sf::IntRect((i - 1)*level.tile_width, 0, level.tile_width, level.tile_height));
    }

    //ustawienie kafli
    level.loadFromFile("map.txt");
    Game::LoadColMap("colMap.txt");
    for (int i = 0; i<level.height; i++)
    {
        for (int j = 0; j<level.width; j++)
        {
            if (level.poziom[i][j].type != Level::NONE)
            {
                spritemap[i][j].setTexture(tekstura[level.poziom[i][j].type]);
                spritemap[i][j].setPosition(j*level.tile_width, i*level.tile_height);
            }
        }
    }

    Game::PlayerTexture();

}

void Game::PlayerTexture()
{

    if (texturePlayer.loadFromFile("player.png"))
    {
        spritePlayer.setTexture(texturePlayer);
    }
    spritePlayer.setPosition(0, groundHeight);
}

void Game::Movement()
{

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
    {
        source.y = Right;
        velocity.x = movespeed;

    }

    else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
    {
        source.y = Left;
        velocity.x = -movespeed;
    }
    else
        velocity.x = 0;

    //source.y = Right;
    //spritePlayer.move(0.5, 0);

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
    {

        velocity.y = -jumpspeed;
    }

    spritePlayer.move(velocity.x, velocity.y);  

    if (spritePlayer.getPosition().y + 32 < groundHeight || velocity.y <0)
    {

            velocity.y += gravity;
    }
    else 
    {
        spritePlayer.setPosition(spritePlayer.getPosition().x, groundHeight   );
        velocity.y = 0;
    }

}

void Game::GameStart()
{

    while (window.isOpen())
    {

        while (window.pollEvent(event))
        {

            if (event.type == sf::Event::Closed || sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Escape))
                window.close();
        }

        Movement();

        Aktualizacja();

        spritePlayer.setTextureRect(sf::IntRect(source.x * 32, source.y * 32, 32, 32));
        //rysowanie mapy
        for (int i = 0; i < level.height; i++)
            for (int j = 0; j < level.width; j++)
                if (level.poziom[i][j].type != Level::LAVA)
                    window.draw(spritemap[i][j]);

        for (int i = 0; i < colMap.size(); i++)
        {
            for (int j = 0; j < colMap[i].size(); j++)
            {
                if (colMap[i][j] == 1)
                {

                    bottom = i * 32 + 32;
                    top = i * 32;
                    right = j * 32 + 32;
                    left = j * 32;

                    if (spriteright<left || spriteleft>right ||
                        spritetop > bottom || spritebottom < top)
                    {
                        gameov = false;
                    }

                    else
                        gameov = true;
                    break;

                }

            }

        }
        if (gameov != true)
        {
            GameDraw();
        }
        else
            GameOver();

    }

}
void Game::Aktualizacja()
{
    spritebottom = spritePlayer.getPosition().y + 32;
    spriteleft = spritePlayer.getPosition().x;
    spriteright = spritePlayer.getPosition().x + 32;
    spritetop = spritePlayer.getPosition().y;
}

void Game::LoadColMap(std::string filename)
{
    std::ifstream openfile(filename);
    std::vector<int> tempMap;
    colMap.clear();

    if (openfile.is_open())
    {
        while (!openfile.eof())
        {
            std::string str, value;
            std::getline(openfile, str);
            std::stringstream stream(str);

            while (std::getline(stream, value, ' '))
            {
                if (value.length() > 0)
                {

                    int a = atoi(value.c_str());
                    tempMap.push_back(a);
                }
            }

            colMap.push_back(tempMap);
            tempMap.clear();

        }
    }
}

void Game::GameOver()
{
    window.clear();
    sf::Text tekst;

        tekst.setCharacterSize(70);

        tekst.setString("GAME OVER");
        tekst.setPosition(1920 / 2 - tekst.getGlobalBounds().width / 2, 250  * 120);

        window.draw(tekst);
    }

void Game::GameDraw()
{
    window.draw(spritePlayer);
    view.setCenter(spritePlayer.getPosition().x, spritePlayer.getPosition().y);
    window.setView(view);

    window.display();
    window.clear();
}

Pozostało 580 znaków

2015-01-25 13:56
0

nikt nie pomoze :(

Pozostało 580 znaków

2015-01-25 17:34
0

Powinieneś wykorzystać maszynę stanów. Tutaj masz przydatne info jak to może wyglądać:
http://gamedevgeek.com/tutorials/managing-game-states-in-c/


int main( int, char** ) try { throw std::logic_error( myCode() ); }
catch( const std::exception& e ) { puts( e.what() ); } ///:~

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0