• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Struktura projektu w SFML

Object Storage Arubacloud
+1 głos
200 wizyt
pytanie zadane 30 października 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

Witam, ostatnio zacząłem pisać projekty w sfml, praktycznie napisałem tylko jedną gierkę - nie taką tragiczną aż bo było to coś w rodzaju minecraft 2D :). Za to tragiczny jest jej kod... Teraz che napisać coś bardzo prostego bo po prostu omijanie spadających kwadratów (ale to nie jest istotne). Stwierdziłem że teraz chce w jakiś logiczny sposób uporządkować kod gry, podzieliłem go tak:

* klasa programu:

#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <windows.h>

class Program
{
public:
	Program(); //wszystkie parametry okna 
	~Program(); //niszczenie obiektu (czyli window.close)
	bool gameRun(); //wykonywanie gry i sprawdzanie czy okno nie zostało zamknięte 
private:

	enum whatIs{GAME, GAMEOVER, MENU, ABOUT}; //stany gry (w zależności od niej bedzie gra, menu itd...
	whatIs gameStatus = MENU; //zmienna okreslajaca ststus gry

	sf::RenderWindow *window;
	sf::Event event;

	void runProcess(); //beda sie tam wykonywaly odpowiednie isnstrukcje w zaleznosci od statusu gry 
};

*ciało klasy:

#include "stdafx.h"
#include "Program.h"

Program::Program()
{
	window = new sf::RenderWindow(sf::VideoMode(600, 700), "The Live", sf::Style::Close);
}

Program::~Program()
{
	window->close();
}

bool Program::gameRun() {
	window->pollEvent(event);

	if (event.type == sf::Event::Closed) { 
		return false;
	}

	window->clear(sf::Color::Black);
	window->display();

	return true;
}

void Program::runProcess() {
	//
}

* main:

#include "stdafx.h"
#include "Program.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	Program *game = new Program;

	while (true) { //wykonywanie dopuki nie doszlo do jakiegos eventu zamikniecia 
		if (!game->gameRun()) {
			break;
		}
	}

	delete game; //jezeli doszlo to usuwamy nasz obiekt
	return 0;
}

Co sądzicie o takim początkowym ułożeniu projektu? Oczywiście to nie rozwiązuje jeszcze wielu problemów... Ale czy jest to w miarę czytelne? Z góry dziękuje za pomoc :)

komentarz 30 października 2017 przez Jakub 0 Pasjonat (23,120 p.)
dodam że mam teraz dziwny błąd w tym projekcie że jak skompiluje program to raz jest normalnie a raz okno się od razu zamyka... Kiedy usunę możliwość zamknięcia okna |X| a zamiast tego dam np ESC to jest w porządku. Jak by się ktoś orientował to był bym wdzięczny.
komentarz 30 października 2017 przez Jakub 0 Pasjonat (23,120 p.)
W ogóle jest dobrze kiedy dam styl okna inny od close
2
komentarz 30 października 2017 przez j23 Mędrzec (194,920 p.)

Drobna uwaga:

while (true) { //wykonywanie dopuki nie doszlo do jakiegos eventu zamikniecia 
        if (!game->gameRun()) {
            break;
        }
    }

Tak lepiej:

while(game->gameRun()) {}

 

1 odpowiedź

+1 głos
odpowiedź 30 października 2017 przez j23 Mędrzec (194,920 p.)

Nie znam SFML-a, ale czy gameRun nie powinna jakoś tak wyglądać:

bool Program::gameRun() 
{
    while(window->pollEvent(event))
	{
		if (event.type == sf::Event::Closed) return false;

		/* tu chyba powinna być obsługa zdarzeń */
	}

    window->clear(sf::Color::Black);
    window->display();
 
    return true;
}

 

Generalnie w Program::gameRun zrobiłbym główną pętlę, żeby w mainie nie trzeba było tego robić.

komentarz 30 października 2017 przez Jakub 0 Pasjonat (23,120 p.)
no tak, ale main musi dostać wiadomość kiedy przestać to wszystko powtarzać... Przecież klasa program nie może usunąć sama siebie
komentarz 30 października 2017 przez j23 Mędrzec (194,920 p.)

Nie rozumiem Twoich dylematów. Jak dasz np. tak:

bool Program::gameRun() 
{
	while(window->isOpen())
	{
		while(window->pollEvent(event))
		{
			if (event.type == sf::Event::Closed) return true;

			/* tu chyba powinna być obsługa zdarzeń */
		}


		...
		window->display();
	}
	
	return false;
}




int WINAPI WinMain(...)
{
	Program game;

	game.gameRun();
    return 0;
}

To powinno wystarczyć. Wszystko samo się pousuwa.

Podobne pytania

0 głosów
0 odpowiedzi 512 wizyt
pytanie zadane 19 grudnia 2018 w HTML i CSS przez niezalogowany
0 głosów
1 odpowiedź 361 wizyt
pytanie zadane 21 stycznia 2018 w C i C++ przez eldoxz Nowicjusz (140 p.)

92,555 zapytań

141,403 odpowiedzi

319,558 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...