Java 鼠标听器不动

Java 鼠标听器不动,java,swing,mouseevent,Java,Swing,Mouseevent,我一直在学习如何在java中使用rpg风格的游戏,并找到了一个很棒的教程。但是,本教程演示了如何使用键侦听器移动精灵,我想做的是通过在屏幕上获取鼠标位置,并在没有任何键侦听器的情况下自行移动精灵来移动精灵。这是我到目前为止的代码,谢谢你的帮助!(哦,问题是精灵没有移动,忘了说……是因为移动方法中的while循环吗?) import java.awt.*; 导入java.awt.event.*; 导入javax.swing.*; 导入java.awt.Image; 导入java.awt.event

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

import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入java.awt.Image;
导入java.awt.event.*;
导入javax.swing.ImageIcon;
公共级航天器{
私有字符串craft=“craft.png”;
私人int dx;
私家侦探;
私人INTX;
私营企业;
私有图像;
公共航天器(){
ImageIcon航天器=新的ImageIcon(this.getClass().getResource(craft));
image=航天器.getImage();
x=40;
y=60;
}
公开作废动议(){
while((x==Board.mouseX)==false){
if(xBoard.mouseX){
x-=1;
}
}
while((y==Board.mouseY)==false){
如果(y<板上鼠标){
y+=1;
}else if(y>Board.mouseY){
y-=1;
}
}
}
公共int getX(){
返回x;
}
公共int getY(){
返回y;
}
公共映像getImage(){
返回图像;
}
/*按下公共无效键(按键事件e){
int key=e.getKeyCode();
if(key==KeyEvent.VK_左){
dx=-1;
}
if(key==KeyEvent.VK_RIGHT){
dx=1;
}
if(key==KeyEvent.VK_UP){
dy=-1;
}
if(key==KeyEvent.VK_DOWN){
dy=1;
}
}*/
/*公共无效密钥已释放(密钥事件e){
int key=e.getKeyCode();
if(key==KeyEvent.VK_左){
dx=0;
}
if(key==KeyEvent.VK_RIGHT){
dx=0;
}
if(key==KeyEvent.VK_UP){
dy=0;
}
if(key==KeyEvent.VK_DOWN){
dy=0;
}
}*/
}
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Toolkit;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.JPanel;
导入javax.swing.Timer;
公共类板扩展JPanel实现ActionListener{
公共静态鼠标;
公共静态鼠标;
私人定时器;
私人航天器;
公共委员会(){
//addKeyListener(新的TAdapter());
设置聚焦(真);
挫折背景(颜色:绿色);
setDoubleBuffered(真);
飞行器=新航天器();
定时器=新定时器(5,此);
timer.start();
}
公共空间涂料(图g){
超级油漆(g);
Graphics2D g2d=(Graphics2D)g;
g2d.drawImage(craft.getImage(),craft.getX(),craft.getY(),this);
getDefaultToolkit().sync();
g、 处置();
}
已执行的公共无效操作(操作事件e){
craft.move();
重新油漆();
}
公共无效MouseEvent(MouseEvent e){
mouseX=e.getXOnScreen();
mouseY=e.getYOnScreen();
craft.move();
重新油漆();
}
/*私有类TAdapter扩展了KeyAdapter{
公共无效密钥已释放(密钥事件e){
释放钥匙(e);
}
按下公共无效键(按键事件e){
工艺。按键(e);
}
}*/
}
导入javax.swing.*;
导入java.applet.*;
导入java.awt.Dimension;
导入java.net。*;
公共类RType扩展Applet{
板b=新板();
公共void init(){
b、 setPreferredSize(新尺寸(400400));
添加(b);
}
}

您必须将鼠标听筒添加到面板

改变

public class Board extends JPanel implements ActionListener {

在构造函数中添加

addMouseListener(this);

您必须将鼠标侦听器添加到面板

改变

public class Board extends JPanel implements ActionListener {

在构造函数中添加

addMouseListener(this);

您必须将鼠标侦听器添加到面板

改变

public class Board extends JPanel implements ActionListener {

在构造函数中添加

addMouseListener(this);

您必须将鼠标侦听器添加到面板

改变

public class Board extends JPanel implements ActionListener {

在构造函数中添加

addMouseListener(this);

你可以采取几种方法

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

然后你只需要在你的游戏循环中,现在必须在paint()中,取X和Y并将其应用到工艺上

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

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

有一种方法,虽然我认为它能给你们绝对坐标,你们希望它们相对于你们的窗口,对吗

Display.getCurrent().getCursorLocation(); 


尽管这只是将飞行器精确地移动到鼠标位置。如果你想让它有一个最大的速度并朝鼠标位置移动,你需要让你的craft.move()方法更智能。

你可以采取几种方法

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

然后你只需要在你的游戏循环中,现在必须在paint()中,取X和Y并将其应用到工艺上

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

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

这是一种方法,尽管