2012-04-11 5 views
-2

나는 간단한 프로젝트를 진행하고 있으며 드로어 블 오브젝트를 (a) 십자형으로 움직이는 방법을 얻을 수 없다. 내 말은, 예를 들어, 동시에 위로 화살표 키를 누를 때, 나는 드로어 블이 북서쪽으로 정확하게 움직 이도록하고 싶습니다. 그러나 KeyListener 메서드에서 간단한 if 문을 사용하여이를 수행 할 수 없었습니다. 특별한 방법으로 추가 패키지를 만들 수 있습니까? 여기 내 코드입니다 :자바 움직이는 공

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; 
    } 
    } 
} 

* 이 코드는 정확히 바로 * 당신은 키보드 이벤트를 수신하기 위해 KeyListener를 사용할 필요가

+0

도움을 받으려면 코드를 게시해야 할 수도 있습니다. – Jonatan

+0

우리는 당신이 어떤 코드를 보지 않고 무엇을 시도했는지 모르겠다. 우리가 해결책을 추측 할 필요가 없도록 몇 가지를 게시 해주십시오. – Chris

+0

여기에 수락 된 대답을보세요 : http://stackoverflow.com/questions/752999/ i-handle-multiple-key-java-press-in-java - 키보드가 별도의 이벤트로 그들을 보내기 때문에 여러 개의 키에 대한 "이벤트"가 없습니다 –

답변

0

후 다시 아래로 또는 왼쪽 타원을 이동하는 경우에만 기능이 있습니다 - 누른 특정 키에 따라 올바른 지점에서 개체를 그립니다. 이미지 구현 방법에 따라 repaint()JPanel이 필요할 수도 있습니다.

당신이하려는 일을 보여주는 몇 가지 코드를 게시 해 주실 수 있으며, 우리는 귀하의 문제를 돕기 위해 노력할 것입니다. 가장 먼저해야 할 일은 KeyListener이 올바르게 작동하는지 확인하는 것이므로 KeyListener의 코드를 시작하는 것이 좋습니다.

0

각 방향, 왼쪽, 오른쪽, 위 및 아래에 부울을 사용합니다. 따라서 다른 키보드 이벤트가 발생하면 화살표 키 중 하나가 계속 눌려 있는지 확인합니다. 예를 들어, 오른쪽 화살표 키를 눌렀다가 놓지 않으면 오른쪽 화살표 키의 부울이 true로 설정됩니다.

대각선 방향을 처리하기 위해 변수를 설정하기위한 것입니다. 다시 keyPressed 메소드로 이동하십시오. 위, 아래 키를 들어, 형식은

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

} 

은 당신의 keyReleased 방법을 위해, 당신은 그래서 프로그램은 지속적으로 누르고 있다는 것을 생각하지 않는다 false로 논리 값을 설정해야합니다 ... 다음과 같아야합니다 당신이 아니라면 열쇠.