首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MouseListener无移动

MouseListener无移动
EN

Stack Overflow用户
提问于 2014-01-15 02:34:40
回答 3查看 135关注 0票数 0

我一直在学习如何在java中使用rpg风格的游戏,并找到了一个很棒的教程。然而,本教程展示了如何使用按键侦听器来移动精灵,我想要做的是通过在屏幕上获得鼠标位置来移动精灵,并在没有任何按键侦听器的情况下自动移动精灵。这是我到目前为止拥有的代码,谢谢你的帮助!(哦,问题是精灵没有移动,忘了说...是因为move方法中的while循环吗?)

代码语言:javascript
复制
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);

    }

}
EN

回答 3

Stack Overflow用户

发布于 2014-01-15 02:41:27

您必须向您的面板Board添加MouseListener。

变化

代码语言:javascript
复制
public class Board extends JPanel implements ActionListener {

代码语言:javascript
复制
public class Board extends JPanel implements ActionListener,MouseListener  {

在构造函数中添加

代码语言:javascript
复制
addMouseListener(this);
票数 2
EN

Stack Overflow用户

发布于 2014-01-15 02:43:01

你需要一次移动你的精灵一点,画出每一步。按照你现在的方式,当你的精灵移动时,你没有任何绘画,所以它看起来就像是传送到鼠标位置。

您还必须实际添加一个MouseListener,而不仅仅是编写MouseListener方法。

票数 1
EN

Stack Overflow用户

发布于 2014-01-15 02:42:49

你可以采取几种方法。

首先,您可以在鼠标事件上调用actionPerformed(ActionEvent e)时记录当前位置,并跟踪当前的X和Y。

然后你只需要让它在你的游戏循环中,现在必须在paint()中,你得到X和Y并将它应用于工艺。

因此在paint()中添加对craft.move();的调用

如果您想做得更好,可以在调用craft.move()时直接检查鼠标的位置,而不是记录actionPerformed事件。

代码语言:javascript
复制
PointerInfo a = MouseInfo.getPointerInfo();
Point b = a.getLocation();
int x = (int) b.getX();
int y = (int) b.getY();

是一种方法,尽管我认为这给了你绝对的坐标,你想让它们相对于你的窗口,对吧?

代码语言:javascript
复制
Display.getCurrent().getCursorLocation(); 

代码语言:javascript
复制
MouseInfo.getPointerInfo();

尽管这只是将工艺精确地移动到鼠标位置。如果您希望它具有最大的速度并朝向鼠标位置移动,则需要使craft.move()方法更加智能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21121278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档