Ich habe jetzt einen GameoverState eingebaut. Er funktioniert auch, jedoch nur unter einer Bedingung.
Wenn ich Enter während des Gameoverscreens drücke, komme ich nur in den MenuState, wenn ich in folgender Zeile der Menu-Klasse nicht Enter als Taste angebe.
Mit einer anderen Taste(zum Beispiel Q) funktioniert es:
|
C#-Quelltext
|
1
|
if (kbState.IsKeyDown(Keys.Q)) game1.ChangeGameState(Game1.GameStates.MaingameState);
|
Mit Enter funktioniert es nicht. Dann komme ich nicht ins Menü, sondern ins Maingame.
|
C#-Quelltext
|
1
|
if (kbState.IsKeyDown(Keys.Enter)) game1.ChangeGameState(Game1.GameStates.MaingameState);
|
Meine Vermutung:
Wenn ich während des Gameoversreens Enter drücke, wechselt das Spiel zuerst auf den MenuState, und danach sofort auf den MaingameState, weil ich in der Menü-Klasse durch Enter drücken ins Maingame wechsele. Deshalb müssen sich die Tasten unterscheiden damit nicht automatisch ein State übersprungen wird.
Jetzt meine Frage:
Wie kann ich das Problem umgehen? Sagen wir mal ich möchte alles mit Enter machen. Also das switchen vom GameoverState auf den MenuState und das switchen vom MenuState auf den MaingameState.
Wie geht man am besten vor wenn man möchte dass pro Tasten-Druck nur eine if-Abfrage ausgeführt wird? Und nicht noch eine andere if-Abfrage in einer anderen Klasse.
Der komplette Code(im Code ist die erwähnte Zeile(mit Taste Q) in der Menü-Klasse bereits geändert)
|
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
public class Game1 : Microsoft.Xna.Framework.Game {
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
IState lastState, currentState;
public enum GameStates
{
IntroState = 0,
MenuState = 1,
MaingameState = 2,
IngamemenuState = 3,
GameoverState = 4
}
public void ChangeGameState(GameStates newState)
{
if (newState == currentGameState)
return;
lastGameState = currentGameState;
lastState = currentState;
switch (newState)
{
case GameStates.IntroState:
currentState = new Intro(this);
currentGameState = GameStates.IntroState;
break;
case GameStates.MenuState:
currentState = new Menu(this);
currentGameState = GameStates.MenuState;
break;
case GameStates.MaingameState:
currentState = new Maingame(this);
currentGameState = GameStates.MaingameState;
break;
case GameStates.IngamemenuState:
currentState = new Ingamemenu(this);
currentGameState = GameStates.IngamemenuState;
break;
case GameStates.GameoverState:
currentState = new Gameover(this);
currentGameState = GameStates.GameoverState;
break;
}
currentState.Load(Content);
}
public void ChangeCurrentToLastGameState()
{
currentGameState = lastGameState;
currentState = lastState;
}
public GameStates CurrentState
{
get { return currentGameState; }
set { currentGameState = value; }
}
public GameStates LastState
{
get { return lastGameState; }
set { lastGameState = value; }
}
private GameStates currentGameState = GameStates.IntroState;
private GameStates lastGameState;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}
protected override void Initialize()
{
currentState = new Intro(this);
currentGameState = GameStates.IntroState;
base.Initialize();
}
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
currentState.Load(Content);
}
protected override void Update(GameTime gameTime)
{
currentState.Update(gameTime);
if ((lastGameState == GameStates.MaingameState) && (currentGameState == GameStates.IngamemenuState))
{
lastState.Update(gameTime);
}
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
if ((lastGameState == GameStates.MaingameState) && (currentGameState == GameStates.IngamemenuState))
{
lastState.Render(spriteBatch);
}
currentState.Render(spriteBatch);
spriteBatch.End();
base.Draw(gameTime);
}
}
|
|
C#-Quelltext
|
1
2
3
4
5
|
public interface IState {
void Load(ContentManager content);
void Update(GameTime gametime);
void Render(SpriteBatch batch);
}
|
|
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
|
public class Intro : IState {
Texture2D Titelbildschirm;
private Game1 game1;
public Intro(Game1 game)
{
game1 = game;
}
public void Load(ContentManager content)
{
Titelbildschirm = content.Load<Texture2D>("gruft");
}
public void Update(GameTime gametime)
{
KeyboardState kbState = Keyboard.GetState();
if (kbState.IsKeyDown(Keys.Space))
game1.ChangeGameState(Game1.GameStates.MenuState);
}
public void Render(SpriteBatch batch)
{
batch.Draw(Titelbildschirm, new Rectangle(0, 0, 1280, 720), Color.White);
}
}
|
|
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
|
public class Menu:IState {
Texture2D Choosescreen;
private Game1 game1;
public Menu(Game1 game)
{
game1 = game;
}
public void Load(ContentManager content)
{
Choosescreen = content.Load<Texture2D>("menubild");
}
public void Update(GameTime gametime)
{
KeyboardState kbState = Keyboard.GetState();
if (kbState.IsKeyDown(Keys.Q))
game1.ChangeGameState(Game1.GameStates.MaingameState);
if (kbState.IsKeyDown(Keys.Escape))
game1.Exit();
}
public void Render(SpriteBatch batch)
{
batch.Draw(Choosescreen, new Rectangle(0, 0, 1280, 720), Color.White);
}
}
|
|
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
|
public class Maingame : IState {
Texture2D Spielbildschirm, axe;
Vector2 position = new Vector2(100,100);
private Game1 game1;
public Maingame(Game1 game)
{
game1 = game;
}
public void Load(ContentManager content)
{
Spielbildschirm = content.Load<Texture2D>("hauszombie");
axe = content.Load<Texture2D>("axxx");
}
public void Update(GameTime gametime)
{
KeyboardState keyboardState = Keyboard.GetState();
float delta = (float)gametime.ElapsedGameTime.TotalSeconds;
position.X += 5 * delta;
position.Y += 3 * delta;
if (keyboardState.IsKeyDown(Keys.Escape))
game1.ChangeGameState(Game1.GameStates.IngamemenuState);
if (keyboardState.IsKeyDown(Keys.A))
game1.ChangeGameState(Game1.GameStates.GameoverState);
}
public void Render(SpriteBatch batch)
{
batch.Draw(Spielbildschirm, new Rectangle(0, 0, 1280, 720), Color.White);
batch.Draw(axe, position, Color.White);
}
}
|
|
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
|
public class Ingamemenu : IState {
Texture2D Quitscreen;
private Game1 game1;
public Ingamemenu(Game1 game)
{
game1 = game;
}
public void Load(ContentManager content)
{
Quitscreen = content.Load<Texture2D>("quit");
}
public void Update(GameTime gametime)
{
KeyboardState kbState = Keyboard.GetState();
if (kbState.IsKeyDown(Keys.Y))
game1.ChangeGameState(Game1.GameStates.MenuState);
if (kbState.IsKeyDown(Keys.N))
game1.ChangeCurrentToLastGameState();
}
public void Render(SpriteBatch batch)
{
batch.Draw(Quitscreen, new Rectangle(200, 200, 200, 200), Color.White);
}
}
|
|
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
|
public class Gameover : IState {
Texture2D Gameoverscreen;
private Game1 game1;
public Gameover(Game1 game)
{
game1 = game;
}
public void Load(ContentManager content)
{
Gameoverscreen = content.Load<Texture2D>("gameover");
}
public void Update(GameTime gametime)
{
KeyboardState kbState = Keyboard.GetState();
if (kbState.IsKeyDown(Keys.Enter))
game1.ChangeGameState(Game1.GameStates.MenuState);
}
public void Render(SpriteBatch batch)
{
batch.Draw(Gameoverscreen, new Rectangle(0, 0, 1280, 720), Color.White);
}
}
|