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

[SFML 2.0] Program sie zamyka po wykonaniu 1 zdarzenia ... i pozycja myszy.

Ostatnio zmodyfikowano 2013-02-12 14:17
Autor Wiadomość
Alan468
Temat założony przez niniejszego użytkownika
[SFML 2.0] Program sie zamyka po wykonaniu 1 zdarzenia ... i pozycja myszy.
» 2013-02-11 19:26:15
Witam. Napisałem krótki kod, okno które ma zostać menu gry oraz samo okno gry.
Gdy uruchamiam program włącza się menu ,gdy je zamknę uruchamia się same okno gry, a gdy nacisnę ESC wracam do menu ... i do tego momentu jest dobrze, ponieważ gdy chce wrócić do gry program się zamyka.
Próbowałem całość dać w pętle do...while pezenieść if'a ,i wiele innych cudów niewidów
Może pomożecie, ...kod:

main.cpp
C/C++
#include <SFML/Graphics.hpp>
#include "GraP Menu.hpp"
using namespace sf;

int main()
{
    bool WybBut = false;
    int okno = 0;
    MenuGry();
   
    RenderWindow GraP( VideoMode( 800, 600, 32 ), "GraP" );
    while( GraP.isOpen() )
    {
        Event Zdarzenie;
        while( GraP.pollEvent( Zdarzenie ) )
        {
            if(( Zdarzenie.type == Event::Closed ) ||( Zdarzenie.type == Event::KeyPressed && Zdarzenie.key.code == Keyboard::Escape ) )
            {
                GraP.close();
            }
            if(( Zdarzenie.type == Event::KeyPressed ) &&( Zdarzenie.key.code == Keyboard::Escape ) )
            {
                MenuGry();
            }
        }
        GraP.clear( Color( 100, 0, 0 ) );
        GraP.display();
    }
    return EXIT_SUCCESS;
}

menu:
C/C++
#include <SFML/Graphics.hpp>
#ifndef GraPMenu_hpp
#define GraPMenu_hpp
using namespace sf;

int MenuGry()
{
    int okno = 1;
    int x = 100, y = 230;
   
    Texture tlo; tlo.loadFromFile( "data/photo/menu_tlo.bmp" ); Sprite Tlo; /**/ Tlo.setTexture( tlo );
    Texture start; start.loadFromFile( "data/photo/start.bmp" ); Sprite Start; Start.setTexture( start ); Start.setPosition( 100, 120 );
    Texture stop; stop.loadFromFile( "data/photo/stop.bmp" ); Sprite Stop; Stop.setTexture( stop ); Stop.setPosition( 100, 230 );
    Texture exit; exit.loadFromFile( "data/photo/exit.bmp" ); Sprite Exit; Exit.setTexture( exit ); Exit.setPosition( 100, 340 );
    Texture akt; akt.loadFromFile( "data/photo/akt.bmp" ); Sprite Akt; Akt.setTexture( akt ); Akt.setPosition( x, y );
   
   
    RenderWindow Grap_Menu( VideoMode( 800, 600, 32 ), "Menu" );
    while( Grap_Menu.isOpen() )
    {
        Event Czynnosc;
        while( Grap_Menu.pollEvent( Czynnosc ) )
        {
            if(( Czynnosc.type == Event::Closed ) ) { Grap_Menu.close(); }
        }
        Grap_Menu.display();
        Grap_Menu.draw( Tlo );
        Grap_Menu.draw( Start );
        Grap_Menu.draw( Stop );
        Grap_Menu.draw( Exit );
        Grap_Menu.draw( Akt );
    }
}
P-76169
pekfos
» 2013-02-11 20:48:38
Dla zamknięcia okna i otwarcia menu masz ten sam warunek (wciśnięto Esc).
P-76176
Alan468
Temat założony przez niniejszego użytkownika
» 2013-02-11 23:17:37
Czy istnieje komenda która zakończy cały program ? bo nie wiem co wpisać w
C/C++
if( Czynnosc.type == sf::Event::MouseButtonPressed && Czynnosc.mouseButton.button == sf::Mouse::Left )
{
    if(( poz_x >= 100 && poz_x <= 220 ) &&( poz_y >= 340 && poz_y <= 400 ) )
    { !TUTAJ !}
}
aby program się zamykał całkowicie ,ta linijka jest w pliku *hpp i co bym nie wpisał to i tak po kliknięciu na "przycisk" zaczyna na nowo robić *cpp.
P-76185
DejaVu
» 2013-02-12 08:20:05
Z tego co napisałeś wynika, że kopiujesz bezmyślnie kod źródłowy. Każdy kurs SFML-a opisuje jak się zamyka okno aplikacji. Co więcej, w kodzie, który przedstawiłeś istnieje linijka zamykająca okno aplikacji, ale najwyraźniej nie wiesz która to jest...
P-76186
Alan468
Temat założony przez niniejszego użytkownika
» 2013-02-12 10:53:39
Chodzi o ...
C/C++
if(( Czynnosc.type == Event::Closed ) )
{
    Grap_Menu.close(); //to ?
}
to zamyka tylko menu i wraca do gry ,a zadaniem tej akcji było zakończenie programu ... .Czyli klikam START->PAUZA->EXIT->maiał sie zamknąć a wraca do gry.
P-76189
krzyk
» 2013-02-12 11:12:01
po wykonaniu
GraP.close()
 wchodzis do
MenuGry()
 a kiedy wracasz pętla
while( GraP.isOpen() )
 kończy się bo wcześniej zrobiłeś
GraP.close()
P-76190
Alan468
Temat założony przez niniejszego użytkownika
» 2013-02-12 13:54:34
Problem nie tkwi w tym ,że się zamyka .... problemem jest to że nie wiem jak zakończyć cały program ,a
window.close();
 zamyka tylko jedno okno ,ja potrzebował bym coś w stylu
entireprogram.close();
.
P-76192
krzyk
» 2013-02-12 14:17:46
Cały program możesz zamknąć funkcją exit() ale funkcja MenuGry powinna zwracać jakąś liczbe w zależności co wybrałeś w menu a kiedy wrócisz do głównej pętli sprawdż co zwróciło i wykonaj to.

Konstrukcja tej gierki jest dziwna po co tworzysz wiele okien,zrób jedno i w zależności od stanu gry wyświetlaj tylko to co chcesz.
Powinieneś nauczyć się klas bo na funkcjach daleko nie zajedziesz,ale jeśli już bardzo chcesz to mógłbyś to zrobić mniej więcej tak:
C/C++
#include <SFML/Graphics.hpp>
#include <iostream>

using namespace sf;

#define GS_MENU 0
#define GS_GAME 1

#define ME_NONE 0
#define ME_EXIT 100
#define ME_ESC 101

//obrazki,textury
sf::Font font_arial;

int Menu( RenderWindow & Window )
{
    sf::Text text( "Menu\nnacisnij ESC by wejsc do gry\nzamknij okno by wyjsc", font_arial, 50 );
    while( 1 ) {
        Event Evt;
        while( Window.pollEvent( Evt ) ) {
            if(( Evt.type == Event::Closed ) )
                 return ME_EXIT; // chcemy zamknac program
           
            if(( Evt.type == Event::KeyPressed ) &&( Evt.key.code == Keyboard::Escape ) )
                 return ME_ESC; // chcemy wrocic do menu
            //inne return
        }
        Window.clear( Color( 127, 0, 0 ) );
        // wyswietl menu
        Window.draw( text );
        Window.display();
    }
    return 0;
}

int Gra( RenderWindow & Window )
{
    sf::Text text( "Game\nnacisnij ESC lub zamknij okno\nby wrocic do menu", font_arial, 50 );
    while( 1 ) {
        Event Evt;
        while( Window.pollEvent( Evt ) ) {
            if(( Evt.type == Event::Closed )
            ||( Evt.type == Event::KeyPressed && Evt.key.code == Keyboard::Escape ) )
                 return ME_ESC; // chcemy wrocic do menu
           
        }
        Window.clear( Color( 0, 127, 0 ) );
        // wyswietl gre
        Window.draw( text );
        Window.display();
    }
    return 0;
}

int main()
{
    int GameState = GS_MENU;
    int MenuEvent = ME_NONE;
   
    RenderWindow Window( VideoMode( 800, 600, 32 ), "Quake 2013" );
    font_arial.loadFromFile( "arial.ttf" );
    // Zaladuj obrazki,textury
   
    while( Window.isOpen() ) {
        if( GameState == GS_MENU )
             MenuEvent = Menu( Window );
        else if( GameState == GS_GAME )
             MenuEvent = Gra( Window );
        else {
            std::cout << "nieznany GameState " << GameState << std::endl;
            std::cout << "zamykamy sklep" << std::endl;
            break;
        }
       
        if( MenuEvent == ME_EXIT )
             Window.close();
        else if( MenuEvent == ME_ESC )
             GameState = !GameState; //zamieniamy z gry na menu i odwrotnie
        else
             std::cout << "nieznany MenuEvent " << MenuEvent << std::endl;
       
    }
    return EXIT_SUCCESS;
}
P-76193
« 1 »
  Strona 1 z 1