Permalänk
Medlem

Problem med min C# XNA kod!

Hallåj!

Jag har gjort ett litet "spel" där jag nu kan åka runt med en liten boll, sedan ska det vara en annan boll som åker automatiskt. Jag vill att när den bollen slår väggarna ska den studsa och åka tillbaka. Jag trodde att min kod stämde men när jag testade åkte den utanför.
Kolla igenom och hjälp mig är ni snälla!

bollOldposition = bollPosition; // TODO: Add your update logic here KeyboardState kstate = Keyboard.GetState(); if (kstate.IsKeyDown(Keys.Escape)) this.Exit(); if (kstate.IsKeyDown(Keys.Left)) { bollPosition.X -= 3; } if (kstate.IsKeyDown(Keys.Right)) { bollPosition.X += 3; } if (kstate.IsKeyDown(Keys.Down)) { bollPosition.Y += 3; } if (kstate.IsKeyDown(Keys.Up)) { bollPosition.Y -= 3; } boll2Position += redbollVelocity; if (boll2Position.Y + boll2Texture.Height > this.Window.ClientBounds.Height && redbollVelocity.X < 0) { redbollVelocity = new Vector2(-1, -1); } if (boll2Position.X + boll2Texture.Width > this.Window.ClientBounds.Width && redbollVelocity.Y > 0) { redbollVelocity = new Vector2(-1, 1); } if (boll2Position.X + boll2Texture.Width > this.Window.ClientBounds.Width && redbollVelocity.Y > 0) { redbollVelocity = new Vector2(-1, -1); } if (boll2Position.Y == 0 && redbollVelocity.X < 0) { redbollVelocity = new Vector2(-1, 1); } if (boll2Position.Y == 0 && redbollVelocity.X > 0) { redbollVelocity = new Vector2(1, 1); } if (boll2Position.X == 0 && redbollVelocity.Y <0) { redbollVelocity = new Vector2(1, -1); } if (boll2Position.X == 0 && redbollVelocity.Y > 0) { redbollVelocity = new Vector2(1, 1); } if (boll2Position.Y + boll2Texture.Height > this.Window.ClientBounds.Height && redbollVelocity.X > 0) { redbollVelocity = new Vector2(1, -1); } base.Update(gameTime); }

om ni vill att jag ska skicka all kod notifiera mig gärna!

Permalänk
Medlem

Vi kan börja med dina ifsatser, försök använda dig av ELSE om en sak bara kan inträffa åt gången.
Det är ju ju ganska liten sannorlikhet att en bolls x värde är större än skärmen och mindre på samma gång tex.?
Alltså när detta inträffar vill du inte kolla övriga x antal if satser vilket bara kostar extra tid och i större projekt kan det leda till "lagg".

Sen bör du inte skapa nya vectorer varje gång, uppdatera istället bara x och y.

Sen ser det ut som du har för många ifsatser?
Börja med en kant av skärmen och få den att fungera först sen arbeta vidare med de övriga sen.

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem

if (boll2Position.Y == 0 && redbollVelocity.X > 0)

Ett problem där är att du förusätter att bollens position blir 0. Är du helt säker på detta?
Jag skulle nog vilja tro att du ska mindre eller likamed 0 (<= 0). Sen borde du som tidigare nämnt använda dig av If/Else.
Du kanske även borde fundera på att dela upp det i flera funktioner? Detta kommer göra saker mer överskådliga.
(tex private bool isOutOfBoundsTop el. liknande)

Permalänk

Något sånt här borde den enklaste formen bli. Du får såklart anpassa den för dina variabler/händelser. Men det där är grunden

if (x <= 0){ gör något i x-led } else if (x => windowwidth){ gör något i x-led } else if (y <= 0){ gör något i y-led } else if (y => windowheight){ gör något i y-led }

Permalänk
Medlem

Hmm, tack för svaren.

Alltså jag vill att bollen ska studsa till baka när den antigen når botten/toppen eller sidorna av mitt fönster. Vilket den nu inte gör, vet ni hur jag får kanterna att "stänga" sig?

Jag gjorde detta ihop om räddning

if (boll2Position.X + boll2Texture.Width < 0) boll2Position.X = this.Window.ClientBounds.Width; if (boll2Position.Y + boll2Texture.Height < 0) boll2Position.Y = this.Window.ClientBounds.Height;

Men det funkade ej, den åker fortfarande ut, och det konstiga med allt är att den studsar på vissa ställen (där bollen är noll?) men inte på kanterna av fönstret...
Hoppas ni orkar svara!!
Mch

Permalänk
Medlem

Har du testat att debugga så du kan kolla vad X och Y har för värden när den "gör fel"?

Permalänk
Medlem
Skrivet av Fåtölj:

Hmm, tack för svaren.

Alltså jag vill att bollen ska studsa till baka när den antigen når botten/toppen eller sidorna av mitt fönster. Vilket den nu inte gör, vet ni hur jag får kanterna att "stänga" sig?

Jag gjorde detta ihop om räddning

if (boll2Position.X + boll2Texture.Width < 0) boll2Position.X = this.Window.ClientBounds.Width; if (boll2Position.Y + boll2Texture.Height < 0) boll2Position.Y = this.Window.ClientBounds.Height;

Men det funkade ej, den åker fortfarande ut, och det konstiga med allt är att den studsar på vissa ställen (där bollen är noll?) men inte på kanterna av fönstret...
Hoppas ni orkar svara!!
Mch

Det som du bör tänka på när bollen ska studsa på väggen till vänster så behöver du inte lägga till texturens bredd.
Utan istället använda dig av bollens x, annars så åker "hela" bollen utanför innan den registrerar.
När den åker till höger ska du ta med texturens bredd.
Något i stil med detta, sen får du leka lite med värdet på din Velocity.

if( (boll2Position.X < 0) || (boll2Position.X + boll2Texture.Width > this.Window.ClientBounds.Width) ) { boll2Position.X -= redbollVelocity; }

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem

Tack för hjälpen!
Men jag fick det löst på annat sätt, nämligen denna video!
http://www.youtube.com/watch?v=92jkCceWCOg