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

Moduł gry( SFML 2.x)

Ostatnio zmodyfikowano 2014-01-17 18:22
Autor Wiadomość
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:
C/C++
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?
P-102237
SeaMonster131
» 2014-01-15 17:25:15
Ja w podobny sposób robię i jestem zadowolony.
P-102240
pekfos
» 2014-01-15 17:37:53
I chcialem sie zapytac czy wlasnie tak sie tworzy gry.
Tworzy się tak, by działały..
P-102241
kubawal
» 2014-01-15 18:01:58
Ja tworzę gry na schemacie

C/C++
bool running = true;
while( running )
{
    // wyczyść ekran
   
    // obsłuż zdarzenia
    if( /* należy zakończyć grę */ )
         running = false;
   
    // uaktualnij stan, fizykę i pozycję obiektów
   
    // narysuj
}
P-102246
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
P-102272
pekfos
» 2014-01-15 21:35:42
Ja też polecam. Nie w formie enuma i jednej zmiennej, ale polecam!
P-102277
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
C/C++
#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 };
    // int sourceX = 32, sourceY = Down;
    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
C/C++
#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 menuShow(RenderWindow okno);
    void Show();
};

#endif // MENU_H_INCLUDED
menu.cpp
C/C++
#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
P-102314
kubawal
» 2014-01-16 17:02:34
C/C++
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
C/C++
bool running = true;
while( running )
{
    okno.clear();
    Event e;
    while( okno.pollEvent( e ) )
    {
        // jesli trzeba zamknac to
        running = false;
    }
   
    win.draw( sprite );
    win.display();
}

Poza tym gra się ni crashuje, lecz normalnie wyłącza.
P-102316
« 1 » 2
  Strona 1 z 2 Następna strona