MONOGAME: Två problem med min pause metod

Trädvy Permalänk
Medlem
Registrerad
Mar 2014

MONOGAME: Två problem med min pause metod

Tja!
Har två problem och båda handlar om min pause metod, alltså vill jag pausa spelet.
Första problemet är att bollen och paddle inte kan röra sig, efter att jag klickat P för att återuppta spelet.
Andra problemet är att min LEVEL text och blocken försvinner när jag klickar på P. Istället vill jag att de ska ritas på det andra och inte göra så det andra försvinner under.

Specifika del som behöver fixas:

else if (paused == true) { SpriteBatch.Draw(pausemenu_texture, pausemenu_rect, Color.White); }

All kod som behövs på första problemet:

protected override void Initialize() { paddle_speed.X = 6f; ball_speed.Y = 7f; ball_speed.X = 1f; base.Initialize(); }

void Pause() { if (paused == true) { paddle_speed.X = 0f; ball_speed.Y = 0f; ball_speed.X = 0f; } }

void KeyboardMouse() { KeyboardState ks = Keyboard.GetState(); if (ks.IsKeyDown(Keys.Left)) { paddle_rect.X -= (int)paddle_speed.X; holdingleft = true; } else if (ks.IsKeyDown(Keys.Right)) { paddle_rect.X += (int)paddle_speed.X; holdingright = true; } else if (ks.Equals(new KeyboardState())) { resetballspeed = true; } else if (ks.IsKeyDown(Keys.P) && Previousks.IsKeyUp(Keys.P)) { if (paused == false) paused = true; else if (paused == true) paused = false; } //BOLLEN RÖR SIG OM MAN KLICKAR SPACE else if (ks.IsKeyDown(Keys.Space)) { Start = true; } else if (ks.IsKeyDown(Keys.R)) { ResetButton(); } Previousks = ks; }

Specifika del som behöver fixas:

void Pause() { if (paused == true) { paddle_speed.X = 0f; ball_speed.Y = 0f; ball_speed.X = 0f; } }

All kod som behövs på andra problemet:

pausemenu_texture = Content.Load<Texture2D>("Pics/PauseMenu");

pausemenu_rect = new Rectangle((Window.ClientBounds.Width / 2) - (pausemenu_texture.Width / 2), ((Window.ClientBounds.Height / 2) - pausemenu_texture.Height / 2), pausemenu_texture.Width, pausemenu_texture.Height);

protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.Black); spriteBatch.Begin(); //SÅLÄNGE LIV ÄR STÖRRE ÄN 0 SÅ GÖRS DET HÄR if (lives > 0) { spriteBatch.Draw(ball_texture, ball_rect, Color.White); spriteBatch.Draw(paddle_texture, paddle_rect, Color.White); spriteBatch.DrawString(spritefont, "Lives left: " + lives, new Vector2(2, 0), Color.White); spriteBatch.DrawString(spritefont, "Points: " + points, new Vector2(350, 0), Color.White); spriteBatch.DrawString(spritefont, "Highscore: " + highscore, new Vector2(652, 0), Color.White); spriteBatch.DrawString(spritefont, "Timer: " + seconds, new Vector2(350, 600), Color.White); if (level == 1) { if (block.Count == 14 && block2.Count == 14) { spriteBatch.DrawString(spritefont2, "LEVEL " + level, new Vector2(252, 400), Color.White); } foreach (Rectangle g in block) { spriteBatch.Draw(block_texture, g, Color.LimeGreen); } foreach (Rectangle r in block2) { spriteBatch.Draw(block_texture, r, Color.IndianRed); } } else if (level == 2) { if (block3.Count == 18 && block4.Count == 27) { spriteBatch.DrawString(spritefont2, "LEVEL " + level, new Vector2(246, 400), Color.White); } foreach (Rectangle b in block3) { spriteBatch.Draw(block_texture, b, Color.CornflowerBlue); } foreach (Rectangle y in block4) { spriteBatch.Draw(block_texture, y, Color.Yellow); } } else if (level == 3) { if (block5.Count == 36 && block6.Count == 18) { spriteBatch.DrawString(spritefont2, "LEVEL " + level, new Vector2(246, 400), Color.White); } foreach (Rectangle o in block5) { spriteBatch.Draw(block_texture, o, Color.Orange); } foreach (Rectangle p in block6) { spriteBatch.Draw(block_texture, p, Color.HotPink); } } else if (paused == true) { spriteBatch.Draw(pausemenu_texture, pausemenu_rect, Color.White); } else if (block5.Count == 0 && block6.Count == 0) { //visa en vinnarbild } } //OM LIV ÄR 0 TAS ALLT ANNAT BORT OCH GAMEOVER BILDEN KOMMER FRAM else if (lives == 0) { spriteBatch.Draw(gameover_texture, gameover_rect, Color.White); } spriteBatch.End(); base.Draw(gameTime); }

HÄR ÄR BILDEN TILL PROBLEM 2:
http://imgur.com/a/MwZQj

Trädvy Permalänk
Medlem
Registrerad
Dec 2016

hej. kollade lite snabbt

problem ett: när du återupptar spelet måste du sätta deras speed igen så bör det fungera

problem två: sätt paused i en egen if efter den första if-satsen så bör den ritas "ovanpå" nuvarande level

//perelli38

Trädvy Permalänk
Medlem
Registrerad
Maj 2014

Vad jag skulle rekommendera är att skapa en "Game state manager"
Där du använder en stack för att komma åt rätt "state"

Så du skapar ett Play state där all spellogik sker.
Sen skapar du ett Menu state där menyns logik sker.

Du startar spelet och pushar Play till stacken.
Använder peek().update() för att köra spellogiken.
När du trycker på P så pushar du Menu till stacken.
Nu när du använder peek().update() så kommer du uppdatera menyns logik.
När du är klar med menyn så poppar du.

Spelet kommer vara "pausat" efter som att du inte uppdaterar det.

Trädvy Permalänk
Medlem
Registrerad
Mar 2014
Skrivet av perelli38:

hej. kollade lite snabbt

problem ett: när du återupptar spelet måste du sätta deras speed igen så bör det fungera

problem två: sätt paused i en egen if efter den första if-satsen så bör den ritas "ovanpå" nuvarande level

//perelli38

Tack för hjälpen, det andra problemet är löst nu!

Men fattar inte riktigt vad du menar med första problemet. Ska det vara något sånt här:

void Pause() { if (paused == true) { paddle_speed.X = 0f; ball_speed.Y = 0f; ball_speed.X = 0f; } else { paddle_speed.X = 6f; ball_speed.Y = 7f; ball_speed.X = 1f; } }

Trädvy Permalänk
Medlem
Registrerad
Mar 2014
Skrivet av TheFlyingPanda:

Vad jag skulle rekommendera är att skapa en "Game state manager"
Där du använder en stack för att komma åt rätt "state"

Så du skapar ett Play state där all spellogik sker.
Sen skapar du ett Menu state där menyns logik sker.

Du startar spelet och pushar Play till stacken.
Använder peek().update() för att köra spellogiken.
När du trycker på P så pushar du Menu till stacken.
Nu när du använder peek().update() så kommer du uppdatera menyns logik.
När du är klar med menyn så poppar du.

Spelet kommer vara "pausat" efter som att du inte uppdaterar det.

Tack för svaret! Hm det där låter väldigt intressant, ska kolla närmare på stack och hur det fungerar, så kanske jag kan ta nytta av de i koden

Trädvy Permalänk
Medlem
Plats
Borlänge
Registrerad
Jan 2003
Skrivet av GGlucke:

Tack för svaret! Hm det där låter väldigt intressant, ska kolla närmare på stack och hur det fungerar, så kanske jag kan ta nytta av de i koden

http://blog.nuclex-games.com/tutorials/cxx/game-state-managem... där har du en hyffsat bra tutorial över hur gamestate managers fungerar.

Om du bara vill ha något snabbt som fungerar

private void Update(GameTime gameTime) { // Fungerar ungefär som en gamestate manager // Dvs du behöver inte ha koll på speed etc, det enda du gör är att säga: // Så länge spelet inte är pausat, uppdatera alla object etc etc på skärmen. // Annars uppdatera enbart menyn. if(paused) { // Kör allt som ska köras när du är pausad här, meny input etc, } else { // Kör game logic etc här } }

C#/MonoGame Fanatiker.
Pixel Artist & Game Developer

Trädvy Permalänk
Medlem
Registrerad
Mar 2014
Skrivet av AJL:

http://blog.nuclex-games.com/tutorials/cxx/game-state-managem... där har du en hyffsat bra tutorial över hur gamestate managers fungerar.

Om du bara vill ha något snabbt som fungerar

private void Update(GameTime gameTime) { // Fungerar ungefär som en gamestate manager // Dvs du behöver inte ha koll på speed etc, det enda du gör är att säga: // Så länge spelet inte är pausat, uppdatera alla object etc etc på skärmen. // Annars uppdatera enbart menyn. if(paused) { // Kör allt som ska köras när du är pausad här, meny input etc, } else { // Kör game logic etc här } }

Tack för svaret! Det där låter väldigt smart, kanske kan använda det till min meny
Fixade mitt första problem genom att sätta värden på hastigheterna igen i if-satsen:

else if (ks.IsKeyDown(Keys.P) && Previousks.IsKeyUp(Keys.P)) { if (paused == false) paused = true; else if (paused == true) { paused = false; paddle_speed.X = 6f; ball_speed.Y = 7f; ball_speed.X = 1f; } }

Trädvy Permalänk
Medlem
Plats
Stockhom
Registrerad
Jun 2004

Hej!

Snabb lösning:

Omslut din kod eller den kod som inte ska uppdateras när spelet är pausat. Detta med ett state eller IF villkor.

Skickades från m.sweclockers.com

Ryzen 7 - 1700 @ 3.7 | 16 Gb | RX 480
--------------------------------------------------
Grundare av MaseApps. Se våra spel: www.maseapps.com. För IOS och Android.