Aktuelle Zeit: 22.12.2024, 15:34

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Game und Hauptmenü (umschalten)
BeitragVerfasst: 25.09.2008, 11:50 
Offline
Benutzeravatar

Registriert: 07.08.2008, 11:31
Beiträge: 104
Hallo zusammen!

Seit längerem suche ich nach einer Lösung für folgende Angelegenheit:
Wie bringe ich das Hauptmenü des Spieles mit der eigentlichen Spielszene sozusagen unter ein Dach?

Nun wir kennen sicher alle die Demo.exe unter der Irrlicht1.4.1.-Beispielen. Diese hat zB. ein (sehr) kleines Hauptmenü, in dem sich gewisse Dinge einstellen lassen. Bei diesem Game funktioniert das so, dass das Hauptmenü ein eigenes Fenster (Instanz?) ist und dieses geschlossen wird und daraufhin ein neues Fenster produziert wird, welches die Spielszene beinhaltet. Das wäre eine Möglichkeit, aber so etwas gefällt mir nicht ganz. Ich würde das gesamte Spiel gerne in einem einzigen Fenster (Irrlichtdevice) unterbringen, was unter anderem den Vorteil hätte, dass der Spieler die Möglichkeit hat, während der Spielszene die Spieloptionen des Hauptmenüs aufzurufen, etc.
Gut ich denke ich versteht ganz gut, wovon ich spreche...

Wie würde man sowas am leichtesten durchsetzen.
zB. Objekte des Hauptmenüs ausblenden. (GUI-Elemente, etc.)
Aber wie könnte ich am effektivsten eine Spielszene terminieren?
Sollte man besser "alles" terminieren und anschließend das Hauptmenü neu aufbauen, wenn man aus dem Spiel ins Hauptmenü wechselt?


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Game und Hauptmenü (umschalten)
BeitragVerfasst: 25.09.2008, 14:57 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Das Stichwort heißt Gamestates.

So kannst du das Spiel in seine Abschnitte unterteilen.

Primitiv sieht das dann ca. so aus:
Code:
while(device->run())
{
   if(gamestate == menu)
       MENUCODE
   elseif(gamestate == game)
       SPIELCODE
   ...
}

event receiver
onevent(event)
{
   if(gamestate == menu)
      MENUEVENTBEHANDLUNG
   elseif()
        ...
}

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Game und Hauptmenü (umschalten)
BeitragVerfasst: 25.09.2008, 15:06 
Offline
Benutzeravatar

Registriert: 07.08.2008, 11:31
Beiträge: 104
Hallo

Gamtestats... hmm auch noch nie in diesem Zusammenhang gehört.

Nun dein Beispiel verstehe ich soweit. Das ist auch ganz einleuchtend.
Nur wie bekomme ich ein aufgebautes Spiel wieder "weg", um es in ganz einfachen Wörtern auszudrücken?
Muss ich jedes einzelne Mesh, Terrain, Textur, etc. einzeln löschen (wenn auch durch automatische Schleife)?
Oder würde dies auch einfacher funktionieren?
Würde es auch die Möglichkeit geben den kompletten "Irrlicht-Inhalt" zu reseten, ohne dabei das gesamte Fenster schließen zu müssen?


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Game und Hauptmenü (umschalten)
BeitragVerfasst: 25.09.2008, 15:39 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Wozu den Inhalt löschen?

Wenn man vom Spiel ins Hauptmenü geht wird einfach nichtmehr das Spiel, sondern das Hauptmenü dargestellt. Wenn dann jetzt wieder gewechselt wird, dann ist das Spiel schon im Speicher und das Laden entfällt quasi.
Wenn das Spiel beendet wird kannst du die Sachen wieder aus dem Speicher entfernen.

Btw:
Gamestates nicht Stats ;)

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Game und Hauptmenü (umschalten)
BeitragVerfasst: 25.09.2008, 15:50 
Offline
Benutzeravatar

Registriert: 07.08.2008, 11:31
Beiträge: 104
Ja ja ja ... sicher. In diesem Fall würde man das besser so machen, wie du es gesagt hast.

Nur schau her,

wenn nun ein Level durchgespielt wurde, man hat gewonnen, dann soll eine neue Welt aufgebaut werden (nächstes Level sozusagen) oder wenn du das aktuelle Spiel verlassen und wieder zurück ins Hauptmenü möchtest, was dann? An diesem Punkt, muss das aktuell laufende Level wieder gelöscht werden. Nur wie?

Wer kennt das nicht?
ESC -> Spiel verlassen -> Hauptmenü
Hauptmenü -> Spiel laden (okay das wäre ja geklärt)
Spiel -> Nächstes Spiel (Level)


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Game und Hauptmenü (umschalten)
BeitragVerfasst: 25.09.2008, 17:33 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
ISceneNode::remove() , ISceneManager::clear(), IGUIElement::remove(), IGUIEnvironment::clear()

Meinst du das?
Wobei das imho trotzdem sinnlos ist. Einfach bis zum Ende des Programms alle Daten, die geladen wurden im Speicher lassen (dürfte im Hobby-Bereich ja wohl kaum an die Grenzen des RAMs stoßen). Um den Rest kümmert sich das OS, nämlich den Platz im Speicher für die Daten freimachen. Während des Spiels muss der IM oder EMail-Client nicht im Speicher sein, dafür gibts die Auslagerungsdatei.

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Game und Hauptmenü (umschalten)
BeitragVerfasst: 26.09.2008, 09:44 
Offline
Benutzeravatar

Registriert: 17.04.2007, 08:42
Beiträge: 460
Wohnort: Willich, NRW
würd ich auch sagen. also wenn du ein hobbyprojekt entwickelst, was die grenzen das RAMs durchbricht, dann hut ab, oder auch nicht. dann sind deine ressourcen zu groß ;D

lad doch einfach je nach gamestate die erforderlichen daten aus deinen ressourcenmanagern (wäre gut, wenn du sowas hast)

Code:
int level = 0;

while(device->run())
{
   if(gamestate == menu)
       show_menu();
   elseif(gamestate == game)
        load_data(level); //modelle, grafiken, sound usw
   ...
}

event receiver
onevent(event)
{
   if(gamestate == menu)
      MENUEVENTBEHANDLUNG
   elseif()
        ...
}

_________________
Bild

Irrlicht - From Noob To Pro A Guideline

--

Sonstige Projekte, Blog : http://www.rpdev.net


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Game und Hauptmenü (umschalten)
BeitragVerfasst: 26.09.2008, 11:58 
Offline
Benutzeravatar

Registriert: 07.08.2008, 11:31
Beiträge: 104
Hallo

Zitat:
ISceneNode::remove() , ISceneManager::clear(), IGUIElement::remove(), IGUIEnvironment::clear()

Meinst du das?
Genau, das geht in die richtige Richtung.
Man muss sich doch nur mal paar großen Games, zB. welche von EA ansehen und dessen Verhalten studieren. Wann bei ihnen etwas geladen wird, was genau viel Arbeitsspeicher wegfrisst, etc. Ganz einfach um zu sehen, wie es die Profis machen. Natürlich, ganz selbstverständlich, jeder muss sein ganz eigenes Konzept entwickeln, das ist auch Sinn der Sache.

Zitat:
(dürfte im Hobby-Bereich ja wohl kaum an die Grenzen des RAMs stoßen)
Könnte im Hobbybereich aber an die Grenzen des KnowHow stoßen. :)

Zitat:
lad doch einfach je nach gamestate die erforderlichen daten aus deinen ressourcenmanagern (wäre gut, wenn du sowas hast)
Welche Ressourcenmanager? Kannst du das näher erklären, ich weiß nicht genau was du meinst.

Also ich würde es so machen:

Beim Programmaufruf:
Gamestate=Menu, Menu laden

Im Menu startet man nun eine Mission:
Gamestate=Game (Menu unsichtbar), Game laden

Nächste Mission:
Reset (alle terminieren), Gamestate=Game, Menu laden, Game laden

Mission beenden, Spielabbruch:
Reset, Gamestate=Menu, Menu laden

Dies könnte man durch Aufruf von Funktionen leicht bewerkstelligen. Das Hauptmenü besteht hauptsächlich aus GUI-Elementen und ich denke der Aufbau dessen wird im Vergleich zu einer Spielszene deutlich schneller sein, deswegen wird es nicht ausmachen, wenn man dieses durch das Reseten neu laden müsste.

Würde ich wie ihr es beschrieben habt, die Spielszene einfach da lassen, würde diese doch immerhin Rechenleistung beanspruchen und was wäre daran so vorteilhaft 10 Levels parallel laufen zu lassen?


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Game und Hauptmenü (umschalten)
BeitragVerfasst: 26.09.2008, 13:08 
Offline
Benutzeravatar

Registriert: 17.04.2007, 08:42
Beiträge: 460
Wohnort: Willich, NRW
Folgendes, ich würde mir ne Art Manager schreiben, zum Beispiel für Texturen (mal ganz abstrahiert)

Code:
#include <vector>
using namespace std;

class texturemanager
{
private:
         vector<ITexture*>         array_;

public:
         texturemanager(void) {}
         ~texturemanager(void) {}

         void load_texture(const char* filename); //schiebe neue texture in das array
         void unload(void); //lösche das gesamt array

         ITexture* acces(unsigned int index) //greife auf bestimmte Textur zu
         ITexture* operator [](unsigned int index) //das gleiche nur als operator   
};


Du kannst da alle Texturen reinladen, und dann für jedes bestimmte Level auf die nötigen Texturen zugreifen. Natürlich ist das keine Art und Weiße Speicher zu schonen, das soltlest du dann anders anstellen. Und so bastelste dir der reihe nach die anderen Manager zusammen (Sound, 3D Objekte usw ...)

Code:
//in main
texturemanager mng;

mng.load_texture("himmel.jpg"); //index = 0
//unvm

if(level1)
{
         driver->draw2DImage(mng[0], position2d<int>(0, 0));
}


Ist mal schnell geschrieben. Für ienen guten Manager sollte er natürlich noch ne Ecke mehr können^^ Aber das is das Prinzip, damit deine Ressourcen nicht so lose in der Luft hängen ;D

mfg heck

_________________
Bild

Irrlicht - From Noob To Pro A Guideline

--

Sonstige Projekte, Blog : http://www.rpdev.net


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Game und Hauptmenü (umschalten)
BeitragVerfasst: 26.09.2008, 16:11 
Offline
Benutzeravatar

Registriert: 07.08.2008, 11:31
Beiträge: 104
Also die Idee mit einer Array hatte ich auch schon. Ich verstehe jetzt was du meinst. Das Reseten könnte man sich dadurch sparen. Zum terminieren könnte man einfach jede Array durchgehen und mitfilfe einer for-Schleife alle geladenen Inhalte löschen (wie auch immer... Ich denke mit remove()).
-------------------
Edit:
Leute, vergisst alles! Ich hab was viel besseres! :lol:

Code:
// Initialisierung
ISceneManager *Menu::smgr = 0;
ISceneManager *Game::smgr = 0;
Menu::smgr = device->getSceneManager();
Game::smgr = device->getSceneManager();

// Das was ich schon immer wollte
Game::smgr->clear();

// Von mir aus dann sowas
Menu::show();

Für Sound, etc. muss man selbstverständlich dasselbe wie im Abschnitt 2 durchführen. Obwohl, den Sound könnte man ja lassen, lediglich anhalten und beim nächsten Level einen neuen Track einlegen.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Game und Hauptmenü (umschalten)
BeitragVerfasst: 26.09.2008, 17:37 
Offline
Benutzeravatar

Registriert: 17.04.2007, 08:42
Beiträge: 460
Wohnort: Willich, NRW
das geht natürlich auch. aber stell dir jez einmal vor, du willst ne hud einblenden und renderst dann ein paar images über den IVideoDriver* da würde das nicht mehr funbktionieren. von daher spricht auch nichts gegen das gamestate-konzept. Zumal man damit ideal den EventReceiver anpassen kann. Packe einfach in jeden gamestate eine funktion

Code:
bool input(SEvent event);


rein, die den ganzen input kram regelt und du bist alle sorgen los, was in richtung Input-management geht.

Code:
class trigger : public IEventReceiver
{
public:
     virutal bool OnEvent(SEvent event)
     {
        return(gamestate.input(event));
     }
};


Was eigentlich wieder für gamestates sprechen würde. Aber hauptsache es läuft erstmal. Wenn du an Grenzen stößt kannst du immer noch auf gamestates (schon wieder das wort =D) umsteigen

_________________
Bild

Irrlicht - From Noob To Pro A Guideline

--

Sonstige Projekte, Blog : http://www.rpdev.net


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Game und Hauptmenü (umschalten)
BeitragVerfasst: 26.09.2008, 18:14 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Schau mal hier.
Ein schon fertiger GamestateManager incl. Gamestate Interface.

Müsste nur an 1.4 angepasst werden, aber ansonsten reicht das Ding eigentlich. (Bin zumindest bis jetzt noch nicht an seine Grenzen gestoßen ^^)

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de