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

[Snake]Wydluzanie ciala.

Ostatnio zmodyfikowano 2015-02-02 20:49
Autor Wiadomość
PCS
Temat założony przez niniejszego użytkownika
[Snake]Wydluzanie ciala.
» 2015-02-01 10:17:48
Witam, mam pewnie problem odnośnie tej gry. Nie potrafię wyświetlać(bądź też może źle zapisuje współrzędne do wektora, chodź wydaje mi się że nie) poszczególnych segmentów węża. Główy kod gry wygląda tak:
C/C++
#include "Game.h"
Game::Game( void )
{
    state = END;
    if( !czcionka.loadFromFile( "font.otf" ) )
    {
        MessageBox( NULL, "Font not found!", "ERROR", NULL );
        return;
    }
   
    state = MENU;
   
}

Game::~Game( void )
{
   
}

void Game::runGame( sf::RenderWindow & window )
{
    while( state != END )
    {
        switch( state )
        {
        case MENU:
            menu( window );
            break;
        case GAME:
            play( window );
           
        }
       
    }
   
}

void Game::menu( sf::RenderWindow & window )
{
    int selected = 0;
    const int ile = 2;
    sf::Text tekst[ ile ];
   
    std::string str[] = { "Play", "Exit" };
    for( int i = 0; i < ile; i++ )
    {
        tekst[ i ].setFont( czcionka );
        tekst[ i ].setCharacterSize( 50 );
        tekst[ i ].setString( str[ i ] );
        tekst[ i ].setPosition( 400 - tekst[ i ].getGlobalBounds().width / 2, 250 + i * 120 );
    }
   
    while( state == MENU )
    {
       
       
        while( window.pollEvent( event ) )
        {
           
           
            if( event.type == sf::Event::Closed || event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape )
            {
                state = END;
            }
           
            if( event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Up )
            {
                selected++;
               
            }
           
            if( event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Space )
            {
                switch( selected )
                {
                case 0:
                    state = GAME;
                    break;
                case 1:
                    state = END;
                }
               
            }
           
        }
       
        window.clear();
        for( int i = 0; i < ile; i++ )
             window.draw( tekst[ i ] );
       
        window.display();
       
    }
   
}

void Game::play( sf::RenderWindow & window )
{
    Snake snake;
    Jablko jablko;
    tab.push_back( pozw );
   
   
    while( state == GAME )
    {
        ////////////STEROWANIE////////////
        while( window.pollEvent( event ) )
        {
           
            if( event.type == sf::Event::Closed || event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape )
            {
                state = MENU;
            }
           
            if( event.type == sf::Event::KeyPressed )
            {
                switch( event.key.code )
                {
                case sf::Keyboard::Up:
                    snake.goUp( sprite );
                    break;
                   
                case sf::Keyboard::Down:
                    snake.goDown( sprite );
                    break;
                   
                case sf::Keyboard::Left:
                    snake.goLeft( sprite );
                    break;
                   
                case sf::Keyboard::Right:
                    snake.goRight( sprite );
                    break;
                   
                }
            }
        }
       
        /////////PARAMETRY SPRITE/////////////////
       
        pozycja1.x = sprite.getPosition().x;
        pozycja1.y = sprite.getPosition().y;
        pozycja1.w = 32;
        pozycja1.h = 32;
       
        pozycja.x = apple.getPosition().x;
        pozycja.y = apple.getPosition().y;
        pozycja.w = 32;
        pozycja.h = 32;
        ///////////////////////////////////////////////////
       
        for( int i = tab.size(); i >= 0; i-- )
        {
           
            if( i == 1 )
            {
                tab[ i ].x = pozycja1.x;
                tab[ i ].y = pozycja1.y;
            }
            else
            {
                tab[ i ].x = tab[ i - 1 ].x;
                tab[ i ].y = tab[ i - 1 ].y;
            }
           
        }
       
       
       
        if( CzyKolizja( & pozycja, & pozycja1 ) == true )
        {
            losJablka();
            addPart();
           
        }
       
        for( int i = 1; i <= tab.size(); i++ )
        {
            sprite.setPosition( tab[ i ].x, tab[ i ].y );
           
            window.draw( sprite );
        }
        window.draw( apple );
        window.display();
        window.clear();
       
    }
}

bool Game::CzyKolizja( Poz * A, Poz * B )
{
    /* A1 i A3 */ /*   B2  i B4 */
    if( A->x >=( B->x + B->w ) )
         return false;
   
    /*  A2 i A4  */ /* B1 i B3 */
    if(( A->x + A->w ) <= B->x )
         return false;
   
    /* A1 i A2 */ /*  B3  i  B4 */
    if( A->y >=( B->y + B->h ) )
         return false;
   
    /* A3 i  A4 */ /*  B1 i  B2 */
    if(( A->y + A->h ) <= B->y )
         return false;
   
    return true;
}

void Game::addPart()
{
   
    tab.push_back( pozw );
}
Problem wygląda tak, że gdy wąż zje jabłko, zamiast ciała, Snake jest teleportowany na pozycję domyślną, czyli 0, 0. Niżej zamieszczam jeszcze Game.h. Dzięki z góry za odpowiedź.
C/C++
#pragma once
#include <iostream>
#include <SFML\Graphics.hpp>
#include <Windows.h>
#include <vector>
#include <string>
#include "Snake.h"
#include "Jablko.h"

class Game
    : public Snake
     , public Jablko
{
public:
   
    struct Poz
    {
        float x, y;
        float w, h;
       
    };
   
    struct PozW
    {
    public:
       
        float x;
        float y;
    };
    PozW pozw;
   
    std::vector < PozW > tab;
   
   
    Poz pozycja, pozycja1;
    bool CzyKolizja( Poz * A, Poz * B );
   
    Game( void );
    ~Game( void );
    sf::Event event;
    void addPart();
   
    void runGame( sf::RenderWindow & window );
    void menu( sf::RenderWindow & window );
    void play( sf::RenderWindow & window );
    sf::Clock zegar;
   
private:
    sf::Font czcionka;
   
    enum GameState { MENU, GAME, GAME_OVER, END };
    enum Movement { UP, DOWN, LEFT, RIGHT };
    Movement movement;
    GameState state;
};
P-125826
DejaVu
» 2015-02-01 21:24:05
Przeanalizuj sens tego kodu:
C/C++
void Game::addPart()
{
   
    tab.push_back( pozw );
}
oraz implementację funkcji/metody losJablka() czy przypadkiem nie wykonuje ona czegoś 'dziwnego' z położeniem węża. Jeżeli masz zaimplementowaną 'śmierć' to być może owa 'śmierć' węża powoduje, że on ginie bo jeżeli dobrze zrozumiałem przytoczone fragmenty kodu, to wstawiasz nowy element węża w tym samym miejscu w którym znajduje się jego głowa.
P-125851
PCS
Temat założony przez niniejszego użytkownika
» 2015-02-02 13:08:59
Dzięki za odpowiedź, zaraz jeszcze raz wszystko przeanalizuje i odpisze jak się z tym uporam, bądź jak nie dam rady.
P-125864
PCS
Temat założony przez niniejszego użytkownika
» 2015-02-02 20:49:34
Ok, poradziłem sobie z ciałem, podąża za wektorem[0], lecz od początku miałem problem zaś z wyjściem do menu (state == MENU). Nie wiem czemu, gdy wąż nie zje jabłka, tym samym nie wydłuży ciała to przyciskiem Escape mogę wyjść do menu. Zaś gdy wąż zje i tym samym wydłuży ciało wtedy nie możliwe jest wyjście do menu, aplikacja się wiesza.


W taki sposób rysuje dane wektory:
C/C++
for( int i = 0; i < tab.size(); i++ )
{
    sprite.setPosition( tab[ i ].x, tab[ i ].y );
    window.draw( sprite );
}

Tak zapisuje współrzędne poprzednika:
C/C++
void Game::move( int kratka )
{
   
    for( int i = tab.size(); i > 0; i-- )
    {
        tab[ i ] = tab[ i - 1 ];
    }
    //Na dole sterowanie tab[0].
}

A ciało dodaje w taki sposób:
C/C++
if( CzyKolizja( & pozycja, & pozycja1 ) == true )
{
    losJablka();
    tab.push_back( pozw );
}

//Edit:
Problem rozwiązany, poplątałem trochę w statusach gry i dlatego tak się działo.
P-125892
« 1 »
  Strona 1 z 1