Monogame: Hjälp med breakout spel

Permalänk
Medlem

Monogame: Hjälp med breakout spel

Tja!

Jag håller på med ett breakout spel och försöker få ihop rörelserna när bollen och paddle träffar varandra. Vill alltså få rörelserna så likt det riktiga breakout spelet med någon typ av uträkning.

När man trycker på spacebar ska bollen gå rakt uppåt och sedan åt olika håll genom "Start = true" också.

En bug som jag har är att när bollen träffar höger/vänster sida om paddle, så går den igenom paddle och hastigheten ökas mycket. När väl hastigheten ändrats, så fortsätter bollen ha den nya hastigheten även om bollen ska starta från paddle igen när man dör, alltså när man trycker på spacebar.

Här är metoden med alla kollisioner och de flesta rörelser jag har i koden:

void BallPaddleCollisions() { //OM BOLLEN TRÄFFAR HÖGER/VÄNSTER KANT if (ball_rect.X > Window.ClientBounds.Width - ball_texture.Width || ball_rect.X < 0) ball_speed.X *= -1; //OM BOLLEN TRÄFFAR ÖVRE KANT if (ball_rect.Y > Window.ClientBounds.Height - ball_texture.Height || ball_rect.Y < 0) ball_speed.Y *= -1; //OM BOLLEN TRÄFFAR UNDRE KANT if (ball_rect.Y > Window.ClientBounds.Height - ball_texture.Height) { lives -= 1; Start = false; StartValueBallPaddle(); } //OM PADDLE TRÄFFAR HÖGER KANT, SÅ STANNAR DEN if (paddle_rect.X > Window.ClientBounds.Width - paddle_rect.Width) paddle_rect.X = (Window.ClientBounds.Width - paddle_rect.Width); //OM PADDLE TRÄFFAR VÄNSTER KANT, SÅ STANNAR DEN if (paddle_rect.X < 0) paddle_rect.X = 0; //OM BOLLEN TRÄFFAR PADDLE if (paddle_rect.Intersects(ball_rect)) { ball_speed.Y *= -1; //FÖRHÅLLANDE OM MAN HÅLLER HÖGER/VÄNSTER ELLER INTE HÅLLER NÅGON HÖGER/VÄNSTER if (holdingleft == true) { ball_speed.X -= 3; } else if (holdingright == true) { ball_speed.X += 3; } else if (resetballspeed == true) { ball_speed.X = 1; } } holdingleft = false; holdingright = false; } void KeyboardMouse() { 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; } //BOLLEN RÖR SIG OM MAN KLICKAR SPACE else if (ks.IsKeyDown(Keys.Space)) { Start = true; } } if (Start == true) { ball_rect.X += (int)ball_speed.X; ball_rect.Y += (int)ball_speed.Y; }

Permalänk
Medlem

Spontant känns det som att det kan ha med funktionen intersects att göra. Till exempel om den känner att bollen är i paddeln, uppdaterar dess hastighet men innan bollen tagit sig ut uppdaterar den hastigheten igen, och igen, tills den kommer ur på någon sida. Vilket skulle kunna ge det beteende du säger om att den åker igenom. Dock svårt att veta eftersom jag inte kan testa koden.

Gällande att ställa om hastigheten så borde det handla om att lägga in en ny hastighet där du även kollar att någon tryckt ner Space knappen. Alltså där du säger Start = true; kanske du även borde sätta en fast hastighet på bollen så den startar med rätt hastighet.

Permalänk
Medlem
Skrivet av AfterShock:

Spontant känns det som att det kan ha med funktionen intersects att göra. Till exempel om den känner att bollen är i paddeln, uppdaterar dess hastighet men innan bollen tagit sig ut uppdaterar den hastigheten igen, och igen, tills den kommer ur på någon sida. Vilket skulle kunna ge det beteende du säger om att den åker igenom. Dock svårt att veta eftersom jag inte kan testa koden.

Gällande att ställa om hastigheten så borde det handla om att lägga in en ny hastighet där du även kollar att någon tryckt ner Space knappen. Alltså där du säger Start = true; kanske du även borde sätta en fast hastighet på bollen så den startar med rätt hastighet.

Tack så mycket för svaret!

Det har du nog rätt i att det handlar om intersects. För den jag har skapat känns lite konstig att hastigheten ökar med 3 varje gång man håller vänster/höger och måste släppa alla tangenter för att få hastigheten 1 igen.

Kan lägga in hela koden så den går att testa.

Permalänk
Medlem
Permalänk
Medlem

Hur ofta frågar du om kollision?
Om hastigheten är säg 10 pixlar och du inte frågar mer än 1 gång per uppdatering kommer bollen kunna åka 9 pixlar in i padden innan den vet om att den har träffat.
Då får du antingen flytta tillbaka den så långt där den precis träffa innan något händer alternativt fråga om kollision flera gånger per uppdatering.