Permalänk
Medlem

Java keyPressed problem

Tjena!
Jag sitter och skriver ett spel i Java, jag försöker att göra så att man kan gå åt två riktningar samtidigt, t.ex. upp och vänster.
Men jag har stött på ett litet problem, det är när jag t.ex. går upp och till vänster, och sen släpper knapparna, men när jag trycker upp igen så går den åt samma riktning igen (upp + vänster).
Samma sak händer om jag går typ ner och till vänster eller ner och till höger etc.
Som jag förstår det så släpper inte en knapp.

package com.PlatformGame; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; public class UserInput implements KeyListener, MouseListener, MouseMotionListener, MouseWheelListener{ public void mouseWheelMoved(MouseWheelEvent e) { } public void mouseDragged(MouseEvent e) { } public void mouseMoved(MouseEvent e) { } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); switch(key) { case KeyEvent.VK_A: Display.isMovingLeft = true; Display.isMoving = true; Display.dir = Display.left; break; case KeyEvent.VK_S: Display.isMovingDown = true; Display.isMoving = true; Display.dir = Display.down; break; case KeyEvent.VK_D: Display.isMovingRight = true; Display.isMoving = true; Display.dir = Display.right; break; case KeyEvent.VK_W: Display.isMovingUp = true; Display.isMoving = true; Display.dir = Display.up; break; } } public void keyReleased(KeyEvent e) { int key = e.getKeyCode(); switch(key) { case KeyEvent.VK_A: if(Display.dir == Display.left){ Display.isMoving = false; Display.isMovingLeft = false; } break; case KeyEvent.VK_S: if(Display.dir == Display.down){ Display.isMoving = false; Display.isMovingDown = false; } break; case KeyEvent.VK_D: if(Display.dir == Display.right){ Display.isMoving = false; Display.isMovingRight = false; } break; case KeyEvent.VK_W: if(Display.dir == Display.up){ Display.isMoving = false; Display.isMovingUp = false; } break; } } public void keyTyped(KeyEvent e) { } }

public void tick() { if(Display.isMoving){ boolean canMove = false; if(Display.isMoving && Display.isMovingUp){ y += -movementSpeed; } if(Display.isMoving && Display.isMovingDown){ y += movementSpeed; } if(Display.isMoving && Display.isMovingLeft){ x += -movementSpeed; } if(Display.isMoving && Display.isMovingRight){ x += movementSpeed; } } }

Uppskattar all hjälp jag kan få, Tack!

Visa signatur

SSD: OCZ-VERTEEX3 128gb | GPU: GeForce GTX 570 kfa2 | CPU: i5-3570K @ 3.4GHz | RAM:2x 4gb Corsair Dominator @ 1600MHz | PSU: Fractal Design Newton r2 650W | Mobo: Asus p8Z77-V LX | Skärm: Dell 2209WA 75Hz

Permalänk
Medlem

Säg att du trycker på D och W samtidigt. Case D sätter Display.dir = Display.right, sen sätter case W Display.dir = Display.up.

När du sedan släpper knappen D så kollar du ifall Display.dir == display.right, med det stämmer inte för när du tryckte ner W satte du det till display.up?

Det var det enda jag kunde se direkt, gissar på att det är det som ställer till problem.

Permalänk
Medlem
Skrivet av Goose7:

Säg att du trycker på D och W samtidigt. Case D sätter Display.dir = Display.right, sen sätter case W Display.dir = Display.up.

När du sedan släpper knappen D så kollar du ifall Display.dir == display.right, med det stämmer inte för när du tryckte ner W satte du det till display.up?

Det var det enda jag kunde se direkt, gissar på att det är det som ställer till problem.

JA! Tack så himla mycket!!

Visa signatur

SSD: OCZ-VERTEEX3 128gb | GPU: GeForce GTX 570 kfa2 | CPU: i5-3570K @ 3.4GHz | RAM:2x 4gb Corsair Dominator @ 1600MHz | PSU: Fractal Design Newton r2 650W | Mobo: Asus p8Z77-V LX | Skärm: Dell 2209WA 75Hz

Permalänk

Du kontrollerar Display.isMoving i början av tick() och sedan på varje "if", vilket känns onödigt. Det räcker med en gång.

Du behöver inte kontrollera att knappen är nedtryckt för att sätta variablerna som false under keyReleased(). Ta bort alla "if" under keyReleased().

Sen har du även "Display.isMoving = false;" under varje release-event, vilket gör att så fort du släpper den senaste knappen du tryckte på så kommer du stanna helt.

Antingen använder du en array med 4 index för upp, ner, vänster och höger och kontrollerar alla 4 varje gång eller så använder du dig av binära flaggor (vilket troligtvis är mer effektivt).

Edit: Nu har jag aldrig använt Java, det var en stund sen jag programmerade och jag är usel på bitwise. Men jag tror det här är någorlunda rätt.
Ni som kan, snälla rätta om jag använt "|=" och "&=~" på fel sätt.

public class UserInput implements KeyListener, MouseListener, MouseMotionListener, MouseWheelListener{ // ... public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); switch(key) { case KeyEvent.VK_W: Display.isMoving |= 1; break; case KeyEvent.VK_A: Display.isMoving |= 2; break; case KeyEvent.VK_S: Display.isMoving |= 4; break; case KeyEvent.VK_D: Display.isMoving |= 8; break; } } public void keyReleased(KeyEvent e) { int key = e.getKeyCode(); switch(key) { case KeyEvent.VK_W: Display.isMoving &= ~1; break; case KeyEvent.VK_A: Display.isMoving &= ~2; break; case KeyEvent.VK_S: Display.isMoving &= ~4; break; case KeyEvent.VK_D: Display.isMoving &= ~8; break; } } public void keyTyped(KeyEvent e) { } } public void tick() { boolean canMove = false; if ( Display.isMoving & 1 ) { y += -movementSpeed; } if ( Display.isMoving & 4 ) { y += movementSpeed; } if ( Display.isMoving & 2 ) { x += -movementSpeed; } if ( Display.isMoving & 8 ) { x += movementSpeed; } }

Permalänk
Medlem

Jag har tagit bort "if" och alla "Display.isMoving = false" i keyReleased, då funkar det perfekt att gå omkring och så. Men när jag stannar så stannar inte animationerna, animationerna stannar då Display.isMoving = false.

Visa signatur

SSD: OCZ-VERTEEX3 128gb | GPU: GeForce GTX 570 kfa2 | CPU: i5-3570K @ 3.4GHz | RAM:2x 4gb Corsair Dominator @ 1600MHz | PSU: Fractal Design Newton r2 650W | Mobo: Asus p8Z77-V LX | Skärm: Dell 2209WA 75Hz

Permalänk
Skrivet av Redab:

Jag har tagit bort "if" och alla "Display.isMoving = false" i keyReleased, då funkar det perfekt att gå omkring och så. Men när jag stannar så stannar inte animationerna, animationerna stannar då Display.isMoving = false.

Är det här ett problem du vill lösa eller ett konstaterande? Jag vet inte riktigt vad du menar.

Permalänk
Medlem
Skrivet av StabTheDrama:

Är det här ett problem du vill lösa eller ett konstaterande? Jag vet inte riktigt vad du menar.

Lösa

Skickades från m.sweclockers.com

Visa signatur

SSD: OCZ-VERTEEX3 128gb | GPU: GeForce GTX 570 kfa2 | CPU: i5-3570K @ 3.4GHz | RAM:2x 4gb Corsair Dominator @ 1600MHz | PSU: Fractal Design Newton r2 650W | Mobo: Asus p8Z77-V LX | Skärm: Dell 2209WA 75Hz

Permalänk
Medlem

Nu är allt löst, tack så mycket för hjälpen!

Visa signatur

SSD: OCZ-VERTEEX3 128gb | GPU: GeForce GTX 570 kfa2 | CPU: i5-3570K @ 3.4GHz | RAM:2x 4gb Corsair Dominator @ 1600MHz | PSU: Fractal Design Newton r2 650W | Mobo: Asus p8Z77-V LX | Skärm: Dell 2209WA 75Hz