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
#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:
#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 ); } }
|
|
pekfos |
» 2013-02-11 20:48:38 Dla zamknięcia okna i otwarcia menu masz ten sam warunek (wciśnięto Esc). |
|
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
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. |
|
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... |
|
Alan468 Temat założony przez niniejszego użytkownika |
» 2013-02-12 10:53:39 Chodzi o ...
if(( Czynnosc.type == Event::Closed ) ) { Grap_Menu.close(); }
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. |
|
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() |
|
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(); . |
|
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:
#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
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; if(( Evt.type == Event::KeyPressed ) &&( Evt.key.code == Keyboard::Escape ) ) return ME_ESC; } Window.clear( Color( 127, 0, 0 ) ); 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; } Window.clear( Color( 0, 127, 0 ) ); 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" ); 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; else std::cout << "nieznany MenuEvent " << MenuEvent << std::endl; } return EXIT_SUCCESS; } |
|
« 1 » |