2014-01-14 3 views
0

저는 Java에서 RPG 스타일 게임을 사용하는 방법을 배웠고 멋진 자습서를 발견했습니다. 그러나 자습서에서는 키 수신기를 사용하여 스프라이트를 이동하는 방법을 보여줍니다. 원하는 것은 화면에서 마우스 위치를 가져 와서 키 리스너없이 자체적으로 스프라이트를 이동하여 스프라이트를 이동하는 것입니다. 내가 지금까지 가지고있는 코드를 heres, 도움을 주셔서 감사합니다! (스프라이트가 움직이지 아, 문제는, 즉 ... 때문에 이동 방법 while 루프의 그것을 말할 것을 잊었다?)MouseListener 움직임 ​​없음

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.awt.Image; 
import java.awt.event.*; 

import javax.swing.ImageIcon; 

public class SpaceCraft { 

    private String craft = "craft.png"; 

    private int dx; 
    private int dy; 
    private int x; 
    private int y; 
    private Image image; 

    public SpaceCraft() { 
     ImageIcon spaceCraft = new ImageIcon(this.getClass().getResource(craft)); 
     image = spaceCraft.getImage(); 
     x = 40; 
     y = 60; 
    } 

    public void move() { 
     while ((x==Board.mouseX)==false) { 
      if (x < Board.mouseX){ 
       x += 1; 
      } else if (x > Board.mouseX){ 
       x -= 1; 
      } 
     } 
     while ((y==Board.mouseY)==false) { 
      if (y < Board.mouseY){ 
       y += 1; 
      } else if (y > Board.mouseY){ 
       y -= 1; 
      } 
     } 

    } 

    public int getX() { 
     return x; 
    } 

    public int getY() { 
     return y; 
    } 

    public Image getImage() { 
     return image; 
    } 



    /* public void keyPressed(KeyEvent e) { 

     int key = e.getKeyCode(); 

     if (key == KeyEvent.VK_LEFT){ 
      dx = -1; 
     } 
     if (key == KeyEvent.VK_RIGHT) { 
      dx = 1; 
     } 

     if (key == KeyEvent.VK_UP) { 
      dy = -1; 
     } 

     if (key == KeyEvent.VK_DOWN) { 
      dy = 1; 
     } 

    }*/ 

    /* public void keyReleased(KeyEvent e) { 
     int key = e.getKeyCode(); 

     if (key == KeyEvent.VK_LEFT) { 
      dx = 0; 
     } 

     if (key == KeyEvent.VK_RIGHT) { 
      dx = 0; 
     } 

     if (key == KeyEvent.VK_UP) { 
      dy = 0; 
     } 

     if (key == KeyEvent.VK_DOWN) { 
      dy = 0; 
     } 
    }*/ 


} 


import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Toolkit; 
import java.awt.event.*; 

import javax.swing.*; 

import javax.swing.JPanel; 
import javax.swing.Timer; 
public class Board extends JPanel implements ActionListener { 

    public static int mouseX; 
    public static int mouseY; 
    private Timer timer; 
    private SpaceCraft craft; 

    public Board() { 
     //addKeyListener(new TAdapter()); 
     setFocusable(true); 
     setBackground(Color.GREEN); 
     setDoubleBuffered(true); 

     craft = new SpaceCraft(); 

     timer = new Timer(5, this); 
     timer.start(); 
    } 

    public void paint(Graphics g) { 
     super.paint(g); 

     Graphics2D g2d = (Graphics2D)g; 
     g2d.drawImage(craft.getImage(), craft.getX(), craft.getY(), this); 

     Toolkit.getDefaultToolkit().sync(); 
     g.dispose(); 
    } 

    public void actionPerformed(ActionEvent e) { 
     craft.move(); 
     repaint(); 
    } 
    public void mouseReleased(MouseEvent e) { 
     mouseX = e.getXOnScreen(); 
     mouseY = e.getYOnScreen(); 
     craft.move(); 
     repaint(); 
    } 

    /*private class TAdapter extends KeyAdapter { 

     public void keyReleased(KeyEvent e) { 
      craft.keyReleased(e); 
     } 

     public void keyPressed(KeyEvent e) { 
      craft.keyPressed(e); 
     } 
    }*/ 



} 

import javax.swing.*; 
import java.applet.*; 
import java.awt.Dimension; 
import java.net.*; 

public class RType extends Applet { 
    Board b = new Board(); 

    public void init() { 
     b.setPreferredSize(new Dimension(400, 400)); 
     add(b); 

    } 

} 

답변

2

당신은 당신의 패널 Board에의 MouseListener를 추가해야합니다.

변경

public class Board extends JPanel implements ActionListener { 

생성자에서

public class Board extends JPanel implements ActionListener,MouseListener { 

에가 몇이야 취할 수있는 접근

addMouseListener(this); 
+0

아아아, 알겠습니다. –

0

추가 할 수 있습니다.

먼저, 그럼 당신은 그냥 그렇게하는 동안 그것을 할 필요가의 actionPerformed (ActionEvent를 전자)이 마우스 이벤트에 호출 할 때 현재 위치를 기록하고, 현재의 X를 추적하고 Y.

수 귀하 game loop (지금 paint()에 있어야 할 것입니다. 당신은 X와 Y를 가져 와서 그것을 기술에 적용합니다.)

따라서 craft.move()에 대한 호출을 추가하십시오. in paint()

그런 다음 actionPerformed 이벤트를 기록하는 대신 craft.move()를 호출 할 때 마우스의 위치를 ​​직접 확인할 수 있습니다.

PointerInfo a = MouseInfo.getPointerInfo(); 
Point b = a.getLocation(); 
int x = (int) b.getX(); 
int y = (int) b.getY(); 

나는 당신에게 절대 좌표를 제공한다고 생각하지만 한 가지 방법이 있습니까?

Display.getCurrent().getCursorLocation(); 

또는

그건 그냥 마우스 위치에 정확히 선박을 이동하지만
MouseInfo.getPointerInfo(); 

. 최대 속도로 마우스 위치를 향해 이동하려는 경우 craft.move() 메소드를 더 지능적으로 만들어야합니다.

+0

마우스 이벤트에서 actionPerformed()가 호출되면? 응? 이 대답은 실제로 의미가 없습니다. –

+0

@KevinWorkman 그는 현재 ActionListener를 사용하여 클릭했을 때 마우스의 X 및 Y 좌표를 가져옵니다.이 X 및 Y 좌표를 제공하는 이벤트 e와 함께 actionPerformed()를 호출합니다. 그는 이미 그렇게하고 있기 때문에 그 방법에 대해 이야기했지만 더 나은 대안이 있으므로 제안했습니다. 너가 이해하지 못한게 뭐야? – SpacePrez

+0

그는 actionPerformed() 메소드가없는 MouseListener에 대해 질문합니다.설명 된 접근 방식은 MouseListener를 사용하는 것보다 훨씬 직관적 인 것처럼 보입니다. –

1

한 번에 조금씩 스프라이트를 움직여 각 단계를 그려야합니다. 여러분이 지금하고있는 것처럼, 스프라이트가 움직일 때 그림이 없기 때문에 마우스 위치로 순간 이동하는 것처럼 보일 것입니다.

또한 실제로 MouseListener 메서드를 작성하는 것이 아니라 MouseListener를 추가해야합니다.

+0

조언 해 주셔서 감사합니다. 나는 그걸로 놀려고 노력할 것이다. –