Permalänk

Hjälp med Xna/C#

Hej!

Är en nybörjare inom programmering och håller på att utforska och lära mig lite mer i Xna/C#

Har gjort ett fönster med en boll som man kan styra, jag har försökt lägga in så att om man klickar space så ska bollen byta färg.

Citat:

if (keyboardState.IsKeyDown(Keys.Space))
if (ball == Content.Load<Texture2D>("ballmini"))
ball = Content.Load<Texture2D>("ballblue");
else if (ball == Content.Load<Texture2D>("ballblue"))
ball = Content.Load<Texture2D>("ballmini");

Så ser det ut just nu. Problemet är att ibland så byter den och ibland byter den färg och sen tillbaks.

Jag antar att det finns något mycket bättre sätt att göra detta på än mitt lilla påhitt. Så förslag på vad jag borde göra åt det eller hur jag kan göra det smidigare.

//Einarsson

Permalänk
Medlem

Vet inte om det hjälper och det är helt orelaterat till ditt problem men csharpskolan.se har några fina guider på XNA, någon av dom kanske kan hjälpa dig förstå problemet? ^^ Jag är bara nybörjare och inte kommit så långt än så detta är ända sättet jag kan försöka hjälpa dig på

Visa signatur

AMD Ryzen 9 3900x - MSI Tomahawk x570 Wi-Fi - 32GB Corsair Vengence @ 3200Mhz - MSI GeForce GTX 1070 8GB Gaming X - Corsair Hydro H100x - Några HDD's

Permalänk
Hedersmedlem

När anropas den där koden? Om det sker många gånger medan man håller ned mellanslag borde färgen växla många gånger.

Citat:

ball == Content.Load<Texture2D>("ballmini")

Detta känns också som en ineffektiv jämförelse; kanske borde du ha en variabel som anger vilken textur som används istället för att läsa in den på nytt varje gång.

Permalänk
Inaktiv

Du måste använda { } vid if statements som är mer än en rad. För att få den att sluta gå tillbaka måste du också kolla i förra keyboardStaten om Space inte var nedtryckt.

lastKeyState = keyState; keyState = keyboardState; if (keyState.IsKeyDown(Keys.Space) && lastKeyState.isKeyUp(Keys.Space)) { if (ball == Content.Load<Texture2D>("ballmini")) ball = Content.Load<Texture2D>("ballblue"); else if (ball == Content.Load<Texture2D>("ballblue")) ball = Content.Load<Texture2D>("ballmini"); }

Du måste även definera lastKeyState och keyState i början av ditt program:

KeyboardState lastKeyState, keyState;

Sen som Elgot säger är det kanske inte så bra att jämföra texturen med Content.Load, utan du borde ha en variabel som håller koll på vilken textur den har.

Permalänk
Medlem

Borde man inte använda keyPress i stället för keyDown för då slipper man hålla reda på vad den hade för keyState innan.

Visa signatur

[CPU: AMD Phenom II X4 955BE- C3, 3.2GHz][Modekort: ASUS M4A79XTD EVO][GF: ATI Radeon HD 5850][RAM: Corsair 1333MHz 4GB][Chassi: Fractal Define R2][PSU: Fractal Design Newton R2, 650W][OS: W7 Proffersonal 64-bit]

Permalänk
Skrivet av anon150287:

Sen som Elgot säger är det kanske inte så bra att jämföra texturen med Content.Load, utan du borde ha en variabel som håller koll på vilken textur den har.

Hur gör jag den variabeln?

Permalänk
Hedersmedlem
Skrivet av Einarsson:

Hur gör jag den variabeln?

Det finns säkert klokare sätt, men tydligast är kanske att spara vad man bytte till förra gången:

//definiera lastTexture någonstans if (keyState.IsKeyDown(Keys.Space) && lastKeyState.isKeyUp(Keys.Space)) { if (lastTexture == "ballmini") { ball = Content.Load<Texture2D>("ballblue"); lastTexture = "ballblue"; } else if (lastTexture == "ballblue") { ball = Content.Load<Texture2D>("ballmini"); lastTexture = "ballmini"; } }

Permalänk
Inaktiv

Texturerna borde också sparas i varsin variabel så de inte behöver laddas om varje gång man trycker på Space.

Permalänk
Medlem

Varje gång du kollar vilken textur bollen har kör du ju content.load vilket resulterar i att texturen laddas på nytt.

Skickades från m.sweclockers.com

Visa signatur

Core i7 7700K | Titan X (Pascal) | MSI 270I Gaming Pro Carbon | 32 GiB Corsair Vengeance LPX @3000MHz | Samsung 960 EVO 1TB

Permalänk

Det blir mycket frågor efter som jag är nybörjare, men hur ska jag spara texturerna i varsin variabel?

string ballblue = Content.Load<Texture2D>("ballblue")

Det är det enda jag kommer på och det känns som att det inte funkar.

Permalänk
Medlem

Känns lite dumt att köra en else if när bollen bara har två texturer.
Gör det även som en vana att använda {} även om det bara är en rad kod.

if (keyboardState.IsKeyDown(Keys.Space)) { if (ball == Content.Load<Texture2D>("ballmini")) { ball = Content.Load<Texture2D>("ballblue"); } else { ball = Content.Load<Texture2D>("ballmini"); } }

Permalänk

Laddas inte texturerna om varje gång då om jag skriver så?

Permalänk
Inaktiv
Skrivet av Einarsson:

Laddas inte texturerna om varje gång då om jag skriver så?

Jo det gör dom.

För att undvika det sparar du texturerna i variabler som jag nämnt ovan.
Högst upp initierar du variablerna:

Texture2D ballBlue, ballMini;

Sen i ContentLoad laddar du inte texturerna i variablerna:

ballBlue = Content.Load<Texture2D>("ballblue"); ballMini = Content.Load<Texture2D>("ballmini");