Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

08.12.2012, 12:48

Einfaches Menü für Xbox360/PC Spiel

Was haltet ihr von diesem simplen Menü: http://www.file-upload.net/download-6895759/XNAMenu.rar.html
Ich hatte dieses Menü mal vor langer Zeit irgendwo gefunden. Ich weiß dass es besser aussieht wenn man den Code nicht ganz in eine Klasse schreibt. Jedoch geht es mir nicht um die Übersicht. Ich möchte nur wissen ob man solch ein ähnliches Menü auch in ein Xbox360/PC-Spiel einbauen kann, oder ob ein Menü(in dem man mehrere Levels auswählen kann) anders aufgebaut sein muss damit das Spiel auch funktioniert. Ich möchte nicht dass mein Spiel auf einmal wegen dem Menü abstürzt.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

08.12.2012, 15:11

Was davon soll denn bei der XBox nicht funktionieren? Warum solltest du sowas da nicht machen können? Ich verstehe deine Frage nicht. Guck dir mal Zustandsautomaten und das Statepattern an. Dieses ganze geswitche ist ja schrecklich;)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

3

10.12.2012, 18:36

Ich habe mir mal das Game State Management Sample für PC/Xbox360 angesehen, jedoch weiß ich nicht was ich davon für mein Spiel brauche. Da steht soviel Code, man braucht das doch sicher nicht alles. Das andere Tutorial(aus meinem ersten Beitrag) ist doch viel kleiner.

Welchen Code des Game State Management Samples brauche ich für mein Spiel? Wie kann ich mein kleines Spiel in das Sample einbauen?
Game State Management Sample: http://xbox.create.msdn.com/en-US/educat…tate_management

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

10.12.2012, 18:51

Tut mir leid ich hab grad keine Lust und keine Zeit mir das Sample genau anzugucken. Soweit ich das im Kopf habe, wird da aber auch mit Switch gearbeitet. Wirklich schön ist das an sich nicht. Such mal nach Entwurfsmustern. Das Muster welches du benötigst nennt sich Zustand. Ich schreib dir noch ne fixe Zusammenfassung.
Du schreibst ein Interface, welches die wichtigen Methoden für deinen Spielzustand definiert. Bei XNA benötige ich meistens nur eine Update und eine Render Funktion. Jetzt leitest du deine Spielzustände von diesem Interface ab. Zum Beispiel schreibst du eine Klasse für das Menü und eine für das Spiel selbst. Jetzt du zum Beispiel in der Klasse Game1 ein Objekt vom Typ des Interfaces halten. Am Anfang hält dies eine Instanz auf das Menü und sobald du ins Spiel wechselst, tauschst du das Objekt gegen eins vom Typ deines Spielzustandes aus. Der Vorteil ist, dass du jetzt keine Switch-Case Konstrukte mehr brauchst.

C#-Quelltext

1
2
3
4
5
public interface IState
{
    void Update();
    void Render();
}

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
public class Menu:IState
{
    public void Update()
    {
    }

    public void Render()
    {
    }
}

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
public class Game:IState
{
    public void Update()
    {
    }

    public void Render()
    {
    }
}

In Game1 speicherst du nun einen IState.

C#-Quelltext

1
private IState currentState;


In Init oder Load erstellst du dann ein Objekt für den Zustand:

C#-Quelltext

1
currentState = new Menu();


In Update machst du folgendes:

C#-Quelltext

1
currentState.Update();


Analog dazu musst du natürlich in der Draw-Methode den Code zum rendern aufrufen.

Wenn du jetzt in deinem Spiel vom Menü ins eigentliche Spiel wechseln willst, dann musst du currentState ein Objekt vom Typ Game zuweisen (Mit Game ist die oben geschriebene Klasse gemeint und nicht die Klasse Game von XNA).
Dafür könntest du der Klasse Game1 zum Beispiel eine ChanceGameState Methode oder sowas geben. Ist schnell implementiert und sehr übersichtlich wie ich finde.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

5

11.12.2012, 16:30

Habe ich das richtig verstanden dass sich die Klasse Game1 nur um die verschiedenen Zustände des Spiels kümmert? Der komplette Game-Code würde sich dann in der Klasse Game und der Menü-Code in der Klasse Menü befinden, richtig?
In deinem Beispiel würde die Update-Methode der Menü-Klasse(currentState.Update();) ja dauernd durchlaufen werden(was beim Spielstart ja der Fall ist), habe ich das richtig verstanden?

Ich habe bis jetzt nämlich immer mit enum gearbeitet, deshalb muss ich mich zuerst an diese neue Möglichkeit gewöhnen. Es sieht aber sehr gut und übersichtlich aus. Ich werde jetzt versuchen ein kleines Spiel darin zu integrieren. Ich gehe davon aus dass sich dadurch noch mehrere Fragen anhäufen werden. Zum Beispiel im Fall eines Untermenüs für die Levelauswahl. Jedoch werde ich es jetzt mal ohne Untermenü versuchen. Man muss es am Anfang ja nicht zu kompliziert machen.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

6

11.12.2012, 16:47

schau dir in dem Zusammenhang auch den Wiki-Artikel Spielzustand-Automaten an ;)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

11.12.2012, 17:11

Im Prinzip hast du recht. Wie du mit Untermenüs etc umgehst, das hängt dann wieder von deinem Design allgemein ab. Du könntest für jedes Untermenü etc einen eigenen Zustand anlegen. Andererseits könntest du zum Beispiel die Ausgabe selbst in eine Klasse kapseln. Dann könntest du im Menüzustand einfach die Anzeige austauschen. Das könntest du dann theoretisch auch wieder über einen Zustandsautomaten umsetzen. Andererseits gibt es noch das Strategie-Pattern. Das ist wenn du es dir mal anguckst fast das selbe wie das State-Pattern. Interessant wird es noch, wenn du zum Beispiel ein Ingame Menü erstellen möchtest. Normalerweise möchte man dann, dass der Spielzustand nicht gelöscht wird. Vielleicht möchte man sogar, dass der Spielzustand im Hintergrund weiter läuft. In so einem Fall bietet es sich dann an, nicht nur einen aktuellen Zustand zu speichern, sondern mehrere. Organisieren könntest du diese dann zum Beispiel auf einem Stack. Dann wäre zum Beispiel der Spiel Zustand oben auf dem Stack. Mit öffnen des Menüs, wird der Zustand oben drauf gelegt. Wenn das Menü geschlossen wird, ist das Spiel aber immer noch auf dem Stack. Das kannst du dann beliebig weiter ausbauen und komplizierter machen. Ich würde dir Vorschlagen erst mal simpel zu beginnen. Versuch einfach mal eine Anwendung zu schreiben, die ein Intro hat, welches ein Bild anzeigt. Nach 5 Sekunden oder mit drücken der Space Taste wechselt die Anwendung ins Menü. Das Menü kann man mit Escape beenden, oder mit Enter in den Spielzustand wechseln. Für das Spiel reicht ja an sich eine einfache Grafik um den Zustand zu visualisieren. Mit Escape geht es dann zurück ins Menü. In dieser kleinen Beispielanwendung ist im Prinzip alles was für den Anfang wichtig ist vorhanden. Versuchs einfach mal.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

8

12.12.2012, 14:09

Ich habe das Menü erstellt, jedoch habe ich noch ein paar kleine Fragen dazu.
Wenn man unter das „I“ in folgender Zeile klickt kommt ein kleines Auswahlmenü.

C#-Quelltext

1
public class Menu:IState

Ich habe dort menuinterface.Game1.IState gewählt. Ist das richtig so?
Dasselbe habe ich bei "public class Game : IState" gemacht.

In meinem Code wird „Exit“ immer rot unterstrichen. Wenn ich unter das Wort klicke kann ich „generate methode stub for „Exit“ in „menuinterface.Game““ auswählen. Soll ich das auswählen?

Hier noch der komplette Code:
Game1-Klasse:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class Game1 : Microsoft.Xna.Framework.Game     { 
        GraphicsDeviceManager graphics; 
        SpriteBatch spriteBatch; 

        public IState currentState; 

        public interface IState 
        { 
            void Load(); 
            void Update(); 
            void Render(); 
        } 

        public Game1() 
        { 
            graphics = new GraphicsDeviceManager(this); 
            Content.RootDirectory = "Content"; 
        } 
        
        protected override void Initialize() 
        { 
            currentState = new Intro(); 

            base.Initialize(); 
        } 

        protected override void LoadContent() 
        {        
            spriteBatch = new SpriteBatch(GraphicsDevice); 

        } 

        protected override void Update(GameTime gameTime) 
        { 

            currentState.Update(); 
            
            base.Update(gameTime); 
        } 

        
        protected override void Draw(GameTime gameTime) 
        { 
            GraphicsDevice.Clear(Color.CornflowerBlue); 
            spriteBatch.Begin(); 
            currentState.Render(); 
            spriteBatch.End(); 
            
            base.Draw(gameTime); 
        } 
    } 


Intro-Klasse:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Intro : menuinterface.Game1.IState     { 
        Game1 game1; 
        Texture2D Titelbildschirm; 

        public void Load(ContentManager content) 
        { 
           Titelbildschirm = content.Load<Texture2D>("gruft"); 
        } 

        public void Update() 
        { 
            KeyboardState kbState = Keyboard.GetState(); 
            if (kbState.IsKeyDown(Keys.Space)) 
                game1.currentState = new Menu(); 
            
        } 

        public void Render(SpriteBatch batch) 
        { 
            batch.Begin(); 
            batch.Draw(Titelbildschirm, new Rectangle(0, 0, 1280, 720), Color.White); 
            batch.End(); 
        } 
    } 


Menu-Klasse:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Menu:menuinterface.Game1.IState { 
    Game1 game1; 
    Texture2D Auswahlbildschirm; 

    public void Load(ContentManager content) 
    { 
        Auswahlbildschirm = content.Load<Texture2D>("menubild"); 
    } 

    public void Update() 
    { 
        KeyboardState kbState = Keyboard.GetState(); 
        if (kbState.IsKeyDown(Keys.Enter)) 
            game1.currentState = new Game(); 
        if (kbState.IsKeyDown(Keys.Escape)) 
            this.Exit(); 
    } 

    public void Render(SpriteBatch batch) 
    { 
        batch.Begin(); 
        batch.Draw(Auswahlbildschirm, new Rectangle(0, 0, 1280, 720), Color.White); 
        batch.End(); 
    } 
} 


Game-Klasse:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Game : menuinterface.Game1.IState     { 
        Game1 game1; 
        Texture2D Spielbildschirm; 

        public void Load(ContentManager content) 
        { 
            Spielbildschirm = content.Load<Texture2D>("hauszombie"); 
        } 

        public void Update() 
        { 
            KeyboardState kbState = Keyboard.GetState(); 
            if (kbState.IsKeyDown(Keys.Escape)) 
                this.Exit(); 
        } 

        public void Render(SpriteBatch batch) 
        { 
            batch.Begin(); 
            batch.Draw(Spielbildschirm, new Rectangle(0, 0, 1280, 720), Color.White); 
            batch.End(); 
        } 
    } 


Ist das bis jetzt richtig so?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

9

12.12.2012, 14:19

Warum ist das Interface IState in der Game1 Klasse? Hat das einen bestimmten Grund? Mir kommt es allgemein so vor, als wenn du mit ein paar wichtigen Grundlagen nicht vertraut wärest. Du solltest dich dringend zu Interfaces informieren. Vererbung ist auch wichtig. Mit der Klasse Game solltest du vorsichtig sein, da XNA auch eine Klasse mit dem Namen Game besitzt. Davon wird zum Beispiel Game1 abgeleitet. Du musst darauf achten dass immer die richtige Game Klasse verwendet wird, oder deine eigene Klasse anders benennen. Exit gibt es natürlich nicht, da du diese Funktion nirgendwo in deinen Klassen oder dem Interface definierst. Die Game Klasse von XNA kennt eine Funktion mit dem Namen exit, weshalb du in Game1 darauf zugreifen kannst. Ich vermute wie gesagt, dass dir einfach Grundlagen fehlen. Hast du C# irgenwie mit Hilfe eines Buches oder so gelernt? Wenn nein, solltest du das dringend nachholen. Ansonsten solltest du auf etwas wie Unity wechseln. Nur ein Vorschlag.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

10

12.12.2012, 14:37

Ich dachte folgender Code sollte man in die Game1-Klasse schreiben:

C#-Quelltext

1
public IState currentState;

C#-Quelltext

1
2
3
4
5
public interface IState 
        { 
            void Load(); 
            void Update(); 
            void Render();          } 


Ist es besser eine neue Klasse dafür anzulegen?

Werbeanzeige