colorgreen19 Temat założony przez niniejszego użytkownika |
Moduł gry( SFML 2.x) » 2014-01-15 16:41:57 Witam, zamierzam napisac prosta gre 2d w SFML 2.1, narazie tylko chodzie ludkiem po mapie no i menu oczywiscie. i tu sie pojawia problem, taki troche głębszy - chodzi o to jak pracuje sama gra. Znalazłem taki o poradnik( http://www.gamefromscratch.com/page/Game-From-Scratch-CPP-Edition-Part-3.aspx ), w kórym koles programuje ten modul gry na stanach - tzn tworzy glowny enum GameState { Uninitialized, ShowingSplash, Paused, ShowingMenu, Playing, Exiting }; . Potem tworzy funkcje ktora wywoluje po kolei stany az to petli glownej programu ( przynajmniej ja to tak rozumiem) tu fragment tego jego kodu: 1 void Game::GameLoop() 2 { 3 switch( _gameState ) 4 { 5 case Game::ShowingMenu: 6 { 7 ShowMenu(); 8 break; 9 } 10 case Game::ShowingSplash: 11 { 12 ShowSplashScreen(); 13 break; 14 } 15 case Game::Playing: 16 { 17 sf::Event currentEvent; 18 while( _mainWindow.GetEvent( currentEvent ) ) 19 { 20 _mainWindow.Clear( sf::Color( sf::Color( 0, 0, 0 ) ) ); 21 _mainWindow.Display(); 22 23 if( currentEvent.Type == sf::Event::Closed ) _gameState = 24 Game::Exiting; 25 26 if( currentEvent.Type == sf::Event::KeyPressed ) 27 { 28 if( currentEvent.Key.Code == sf::Key::Escape ) ShowMenu(); 29 } 30 } 31 break; 32 } 33 } 34 }
I chcialem sie zapytac czy wlasnie tak sie tworzy gry. Czy takie podejscie jest dobre ze sie stanami wywoluje inne funkcje gry? |
|
SeaMonster131 |
» 2014-01-15 17:25:15 Ja w podobny sposób robię i jestem zadowolony. |
|
pekfos |
» 2014-01-15 17:37:53 I chcialem sie zapytac czy wlasnie tak sie tworzy gry. |
Tworzy się tak, by działały.. |
|
kubawal |
» 2014-01-15 18:01:58 Ja tworzę gry na schemacie bool running = true; while( running ) { if( ) running = false; }
|
|
Rafi |
» 2014-01-15 21:03:16 Ja również polecam stany - w każdym momencie możesz dodać następny i rozbudowywać program coraz bardziej |
|
pekfos |
» 2014-01-15 21:35:42 Ja też polecam. Nie w formie enuma i jednej zmiennej, ale polecam! |
|
colorgreen19 Temat założony przez niniejszego użytkownika |
» 2014-01-16 16:42:08 dobra, zrozumialem juz w miare jak gry na stanach działają, i napisalem takie cos: main.cpp #include <SFML/Graphics.hpp> #include <SFML/Window.hpp> #include <SFML/Network.hpp> #include <iostream> #include <cmath> #include <sstream> #include <cstring> #include "menu.h"
using namespace sf; using namespace std;
RenderWindow okno; enum GameStan { Niezainicjowana, EkranStartowy, Paused, InMenu, Playing, Exiting }; GameStan gamestan;
void menu();
int main() { enum Kierunek { Down, Left, Right, Up }; Vector2i source( 1, Down ); float frameCounter = 0, switchFrame = 100, frameSpeed = 500; RenderWindow okno( VideoMode( 1280, 720, 32 ), "Okno aplikacji v.1" ); okno.setKeyRepeatEnabled( false ); View camera; camera.setSize( 1280, 720 ); Texture playerTexture; Sprite playerImage; Clock clock; if( !playerTexture.loadFromFile( "player.png" ) ) { cout << "Nie udalo sie zaladowac textury postaci" << endl; }; cout << "Textrua postaci zaladowana" << endl; playerImage.setTexture( playerTexture ); playerImage.setPosition( 640, 380 ); Font font; if( !font.loadFromFile( "czcionka.ttf" ) ) { cout << "Nie udalo sie zaladowac czcionki" << endl; }; cout << "Czcionka zaladowana" << endl; Text text; text.setCharacterSize( 50 ); text.setFont( font ); int rozmX = 200, rozmY = 300; RectangleShape ksztalt( Vector2f( rozmX, rozmY ) ); ksztalt.setPosition( 0, 00 ); ksztalt.setFillColor( Color( 250, 50, 0 ) ); Texture tlo; if( !tlo.loadFromFile( "bg.jpg" ) ) { cout << "Nie udalo sie zaladowac tla" << endl; }; cout << "Tlo zaladowane" << endl; Sprite tlo2; tlo2.setTexture( tlo ); while( gamestan != Exiting ) { gamestan = InMenu; switch( gamestan ) { case Exiting: okno.close(); break; case InMenu: cout << "GameStan=InMenu" << endl; gamestan = InMenu; menu(); break; case Playing: cout << "GameStan=Playing" << endl; Event zdarzenie; while( okno.pollEvent( zdarzenie ) ) { if( zdarzenie.type == Event::Closed ||( zdarzenie.type == Event::KeyPressed && zdarzenie.key.code == Keyboard::Escape ) ) { gamestan = Exiting; }; }; if( Keyboard::isKeyPressed( Keyboard::W ) ) { source.y = Up; playerImage.move( 0, - 0.02 ); } else if( Keyboard::isKeyPressed( Keyboard::S ) ) { source.y = Down; playerImage.move( 0, 0.02 ); } else if( Keyboard::isKeyPressed( Keyboard::D ) ) { source.y = Right; playerImage.move( 0.02, 0 ); } else if( Keyboard::isKeyPressed( Keyboard::A ) ) { source.y = Left; playerImage.move( - 0.02, 0 ); }; frameCounter += frameSpeed * clock.restart().asSeconds(); if( frameCounter >= switchFrame ) { frameCounter = 0; source.x++; if( source.x * 32 >= playerTexture.getSize().x ) { source.x = 0; }; }; okno.setView( camera ); camera.setCenter( playerImage.getPosition() ); playerImage.setTextureRect( sf::IntRect( source.x * 32, source.y * 32, 32, 32 ) ); okno.draw( tlo2 ); okno.draw( ksztalt ); okno.draw( playerImage ); okno.display(); okno.clear(); break; }; } return 0; }
void menu() { cout << "Menu odpalone" << endl; Menu menu; Menu::menuStan menustan; menu.Show(); switch( menustan ) { case Menu::Play: gamestan = Playing; break; case Menu::Exit: gamestan = Exiting; break; }; cout << "Menu przeszlo petle" << endl; };
menu.h #ifndef MENU_H_INCLUDED #define MENU_H_INCLUDED #include <list>
using namespace sf;
extern RenderWindow okno;
class Menu { public: enum menuStan { Nothing, Exit, Play }; void Show(); };
#endif
menu.cpp #include <SFML/Graphics.hpp> #include <SFML/Window.hpp> #include <SFML/Network.hpp> #include <iostream> #include <cmath> #include <sstream> #include <cstring> #include "menu.h"
using namespace sf; using namespace std; extern RenderWindow okno;
void Menu::Show() { okno.clear(); Texture textura; if( !textura.loadFromFile( "menu.png" ) ) { cout << "Nie udalo sie zaladowac textury menu" << endl; }; cout << "Textura menu zaladowana" << endl; Sprite sprite; sprite.setTexture( textura ); sprite.setPosition( 20, 20 ); okno.draw( sprite ); okno.display(); Event event; while( okno.pollEvent( event ) ) { if( event.type == Event::Closed ||( event.type == Event::KeyPressed && event.key.code == Keyboard::Escape ) ) { okno.close(); }; } }
Teoretycznie powinno mi sie wyswietlic same menu, mianowicie jakas textura. A tym czasem "gra" ma bialy ekran i sie crashuje, jak to sie dzieje gdy stworzymy sama petla główna. Kiedy zamienie w main.cpp w petli linie 70 gamestan = InMenu na gamestan = Playing to dziala "juz odpalona gra-tzn chodzenie ludkiem" Bardzo prosze o pomoc dlaczego "menu" nie dziala. Musle ze to moze byc problem z tym gdzie to ma wyswietlic - tzn. te co robie extern RenderWindow okno a jesli to jest to to nie umiem tego naprawic. z gory dziekuje |
|
kubawal |
» 2014-01-16 17:02:34 okno.draw( sprite ); okno.display();
Event event; while( okno.pollEvent( event ) ) { if( event.type == Event::Closed ||( event.type == Event::KeyPressed && event.key.code == Keyboard::Escape ) ) { okno.close(); }; }
|
To nie tak. Musisz zrobić taką jakby pętlę gry, czyli bool running = true; while( running ) { okno.clear(); Event e; while( okno.pollEvent( e ) ) { running = false; } win.draw( sprite ); win.display(); }
Poza tym gra się ni crashuje, lecz normalnie wyłącza. |
|
« 1 » 2 |