2012-04-11 12 views
-2

Ich arbeite an einem einfachen Projekt und ich kann nicht erreichen, wie man ein Zeichenobjekt als (a) überqueren. Ich meine zum Beispiel, wenn ich gleichzeitig die linke und die obere Pfeiltaste drücke, möchte ich, dass sich meine Zeichnungsmarke in Richtung Nordwesten bewegt. Mit einfachen if-Anweisungen in KeyListener Methoden konnte ich es jedoch nicht erfüllen. Gibt es eine spezielle Möglichkeit, dies zu tun oder ein zusätzliches Paket? Hier ist mein Code:Java Moving Ball über

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.geom.Ellipse2D; 
import javax.swing.*; 
import javax.swing.JPanel; 


public class Top extends JPanel implements ActionListener, KeyListener { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 
Timer t = new Timer(5, this); 
int xR = 0;int yR = 0; int zR = 0; 
double x = 0, y = 0, xVel = 0, yVel = 0, width = 0, height = 0; 

public Top() { 
    t.start(); 
    setBackground(Color.black); 
    addKeyListener(this); 
    setFocusable(true); 
} 
public void actionPerformed(ActionEvent e) { 
    repaint(); 
    x+=xVel; 
    y+=yVel; 
} 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D)g; 

    g2d.setPaint(Color.blue); 
    g2d.fill(new Ellipse2D.Double(this.x, this.y, 50, 50)); 
} 
@Override 
public void keyTyped(KeyEvent e) { 
    // TODO Auto-generated method stub 
} 
@Override 
public void keyPressed(KeyEvent e) { 
    int keyCode = e.getKeyCode(); 

    if(keyCode == KeyEvent.VK_DOWN) { 
     down(); 
    } 
    if(keyCode == KeyEvent.VK_UP) { 
     up(); 
    } 
    if(keyCode == KeyEvent.VK_RIGHT) { 
     right(); 
    } 
    if(keyCode == KeyEvent.VK_LEFT) { 
     left(); 
    } 
} 
public void down() { 
    this.yVel= 1; 
    this.xVel= 0; 
} 
public void up() { 
    this.yVel = -1; 
    this.xVel = 0; 
} 
public void left() { 
    this.xVel = -1; 
    this.yVel = 0; 
} 
public void right() { 
    this.xVel = 1; 
    this.yVel = 0; 
} 
@Override 
public void keyReleased(KeyEvent e) { 
    int keyCode = e.getKeyCode(); 
    if(keyCode == KeyEvent.VK_DOWN || 
       keyCode == KeyEvent.VK_UP ||    
       keyCode == KeyEvent.VK_RIGHT || 
       keyCode == KeyEvent.VK_LEFT) { 
        xVel=0; 
        yVel=0; 
    } 
    } 
} 

* dieser Code hat nur Fähigkeit, eine Ellipse genau links nach rechts zu bewegen nach oben oder unten *

+0

Sie müssen wahrscheinlich Ihren Code posten, um damit geholfen zu werden. – Jonatan

+0

Wir wissen nicht, was Sie versucht haben, ohne etwas Code zu sehen, bitte posten Sie einige, damit wir keine Lösung erraten müssen – Chris

+0

Die akzeptierte Antwort finden Sie hier: http://stackoverflow.com/questions/752999/ how-do-i-handle-multiple-key-drücken-in-java - es gibt kein "event" für mehrere Schlüssel, da die Tastatur sie als separate Ereignisse sendet –

Antwort

0

Sie benötigen ein KeyListener verwenden für die Tastaturereignisse zu hören, dann wieder -Ziehen Sie das Objekt an der richtigen Stelle entsprechend der bestimmten Taste gedrückt. Sie müssen möglicherweise auch repaint() die JPanel, je nachdem, wie Sie das Bild implementiert haben.

Könnten Sie bitte einen Code schreiben, der zeigt, was Sie versuchen zu tun, und wir versuchen, Ihr Problem zu unterstützen. Das erste, was zu tun wäre, wäre zu überprüfen, dass die KeyListener korrekt funktioniert, also wäre der Code für Ihre KeyListener wahrscheinlich ein guter Anfang.

0

Ich würde einen Boolean für jede Richtung verwenden, links, rechts, oben und unten. Wenn also ein anderes Tastaturereignis auftritt, prüft es, ob eine der Pfeiltasten noch gedrückt gehalten wird. Wenn Sie beispielsweise die rechte Pfeiltaste drücken (und nicht freigeben), wird ein Boolescher Wert für die rechte Pfeiltaste als wahr festgelegt.

Das ist nur für die Einstellung der Variablen, jetzt um diagonale Richtungen zu behandeln. Gehen Sie erneut zu Ihrer keyPressed-Methode. Für die oben und unten Tasten, sollte das Format wie folgt aussehen ...

if (keyCode == VK.DOWN) { 
    if (leftKeyHeld) { 
     DownLeft(); 
    } else if (rightKeyHeld) { 
     DownRight(); 
    } else { 
     Down(); 
    } 

} 

Nur sicher sein, für Ihre keyReleased Methode, um die booleans auf false gesetzt, so wird das Programm nicht denken, dass Sie ständig der Hand halten, nach unten die Schlüssel, wenn Sie nicht sind.