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: #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 ) { 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; } } } 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 ) { if( A->x >=( B->x + B->w ) ) return false; if(( A->x + A->w ) <= B->x ) return false; if( A->y >=( B->y + B->h ) ) return false; 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ź. #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; };
|
|
DejaVu |
» 2015-02-01 21:24:05 Przeanalizuj sens tego kodu: 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. |
|
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. |
|
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: 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: void Game::move( int kratka ) { for( int i = tab.size(); i > 0; i-- ) { tab[ i ] = tab[ i - 1 ]; } }
A ciało dodaje w taki sposób: 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. |
|
« 1 » |