고전적인 "화면에서 이미지 이동"프로그램을 만들고 있습니다. Keylistener 대신 키 바인딩을 얻으려고하지만 성공하지 못했습니다.입력 맵 및 액션 맵을 인스턴스화하는 방법 및 위치
내 객체는 LinkedList의
public LinkedList<GameObject> object = new LinkedList<GameObject>();
에 있고
public void addObject(GameObject object){
this.object.add(object);
}
를 통해이 목록에 추가
public class KeyBindings extends JPanel{
private static final String accelerate = "accelerate";
public KeyBindings(){
System.out.println("test");
registerKeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, false), "UP-press", new ShuttleMove(accelerate));
}
public void registerKeyBinding(KeyStroke keyStroke, String name, Action action) {
InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap am = getActionMap();
im.put(keyStroke, name);
am.put(name, action);
}
class ShuttleMove extends AbstractAction {
public ShuttleMove(String movement) {
if (movement.equals("accelerate")){
//this.setVelocityForward(this.getVelocityForward() + 0.1);
System.out.println("accelerate");
}
}
public void actionPerformed(ActionEvent e) {
}
}
}
내 플레이어를 다음과 같이 내 키 바인딩 클래스입니다 뚜껑 같은 게임 오브젝트 클래스 외모 (약간 응축) 확장 S :
public class Player extends GameObject {
Handler handler;
public Player(int x, int y, ID id, int width, int height, int rotation,double totalRotation, Handler handler, double velocityForward, double velocityRotate){
super(x, y, id, width, height, rotation, totalRotation);
this.handler = handler;
}
public void tick(){
x += this.getVelocityForward();
y += this.getVelocityForward();
}
public void render(Graphics2D g2d){
try {
player = ImageIO.read(new File("src/Game/images/shuttle3.png"));
} catch (IOException e) {
e.printStackTrace();
}
AffineTransform old = g2d.getTransform();
AffineTransform at = AffineTransform.getTranslateInstance(x,y);
g2d.drawImage(player, at,null);
g2d.setTransform(old);
}
}
는 비록 키 바인딩을 "활성화"하는 방법을 잘 모르겠습니다. 메인 루프에 있어야합니까? 플레이어 이미지를 업데이트하고 이후에 그려야하는 player.tick 메서드에 있어야합니까?
또한 inputmap 및 actionmap이 플레이어 개체와 어떻게 관련되어 있습니까? 나는 작동하지 않았다 같은 것을, 일을 시도 : 내 플레이어가 JComponent에 캐스팅되는 방법 몇 가지를 생각
public void registerKeyBinding(KeyStroke keyStroke, String name, Action action) {
for (int i = 0; i < handler.object.size(); i++){
GameObject player = handler.object.get(i);
//find player
if (player.getID() == ID.Player){
InputMap im = player.getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap am = player.getActionMap();
im.put(keyStroke, name);
am.put(name, action);
}
}
}
을하지만 이클립스는 나에게 말한다대로와 호환되지 않습니다 (이 작업을 수행하는 방법을 잘 모르겠습니다 내 GameObject 클래스). 누군가 올바른 방향으로 나를 안내 할 수 있습니까? 실수로 중요한 정보를 빠뜨린 경우 알려주십시오. (내가 한 일은 확실합니다.)
또한 후속 조치로 여기에 _register_의 의미를 잘못 해석했다고 생각합니다. 키 핸들러를 등록하는 것은 키 누르기를 듣는 기능을 추가하는 것입니다 ** ** 클릭 자체를 등록하는 것이 아닙니다. 따라서 핵심 기능을 actionPerformed 메소드로 옮기고 핸들러를 등록하는 기능에 어떠한 로직도 사용하지 않아야합니다. 핵심은 "각각의 키 누르기 시작"이라고 말하는 것입니다. –
Player 객체에서 getActionMap을 호출하여 이미 수행했습니다. 이벤트가 시작되면 ActionEvent에 플레이어가 소스로 포함되어야합니다. 플레이어로 전송하면됩니다. –
내 의견을 삭제 해 주셔서 죄송합니다. 편집 중이 었어. I 클래스 ShuttleMove이 AbstractAction로 { \t \t 공공 ShuttleMove (개체 플레이어) { \t \t \t this.player = 플레이어를 확장 같은 것을 원했고, \t \t \t \t} 공개 무효의 actionPerformed (ActionEvent의 전자) { \t \t \t this.setVelocityForward (this.getVelocityForward() + 0.1); \t \t} \t} 플레이어에게 던지기가 확실치 않아 뭔가 개념적으로 놓칠 수 있습니다. 어쨌든, 나는 그걸 최대한 빨리 읽을거야. 답변 해 주셔서 감사합니다. – user2913053