Java mouseMoved方法中的碰撞检测

Java mouseMoved方法中的碰撞检测,java,swing,jpanel,paint,paintcomponent,Java,Swing,Jpanel,Paint,Paintcomponent,我正在用java创建一个游戏。在其中,您可以控制鼠标后面的正方形。我想为正方形实现碰撞检测,使其在JFrame内稍微停止,而不是在边缘。使用箭头键执行此操作非常简单,但我无法使用mouseMoved方法来解决此问题。以下是mouseMoved方法的代码: public void mouseMoved(MouseEvent e){ repaint(); if(e.getX() <= 0) playerX = 0

我正在用java创建一个游戏。在其中,您可以控制鼠标后面的正方形。我想为正方形实现碰撞检测,使其在JFrame内稍微停止,而不是在边缘。使用箭头键执行此操作非常简单,但我无法使用mouseMoved方法来解决此问题。以下是mouseMoved方法的代码:

public void mouseMoved(MouseEvent e){

            repaint();
            if(e.getX() <= 0)
                playerX = 0;
            if(e.getX() >= 300)
                playerX = 500;
            if(e.getY() <= 0)
                playerY = 0;
            if(e.getY() >= 300)
                playerY = 500;
            else
            playerX = e.getX()-25;
            playerY = e.getY()-25;
            repaint();

        }
我认为您不需要这个,但为了以防万一,这里是GamePanel类的所有代码,它在主类中用作我的JFrame的面板。如果您需要主修课,请告诉我,但我怀疑您是否会:

package main;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JPanel;

public class GamePanel extends JPanel implements Runnable{

    //Global variables

    //Double buffering
    private Image dbImage;
    private Graphics dbg;


    //JPanel variables
    static final int GWIDTH = 500, GHEIGHT = 500;
    static final Dimension gameDim = new Dimension(GWIDTH, GHEIGHT);

    //Game variable
    private Thread game;
    private volatile boolean running = false;
    public boolean mouseClicked = false;

    //Character variables
    int playerX = 150, playerY = 150;

    public class Mouse extends MouseAdapter{

        public void mousePressed(MouseEvent e){

            mouseClicked = true;

        }

        public void mouseReleased(MouseEvent e){

            mouseClicked = false;

        }

        public void mouseMoved(MouseEvent e){

            repaint();
            if(e.getX() <= 0)
                playerX = 0;
            if(e.getX() >= 300)
                playerX = 500;
            if(e.getY() <= 0)
                playerY = 0;
            if(e.getY() >= 300)
                playerY = 500;
            else
            playerX = e.getX()-25;
            playerY = e.getY()-25;
            repaint();

        }
    }



    public GamePanel(){

        addMouseMotionListener(new Mouse());
        setPreferredSize(gameDim);
        setBackground(Color.BLUE);
        setFocusable(true);
        requestFocus(true);

    }

    public void run(){

        while(running){



        }

    }

    public void addNotify(){

        super.addNotify();
        startGame();

    }

    private void startGame(){

        if(game == null || !running){

            game = new Thread(this);
            game.start();
            running = true;

        }

    }

    public void stopGame(){

        if(running){

            running = false;

        }

        //Paint method


    }

    public void paint(Graphics g){

        dbImage = createImage(getWidth(), getHeight());
        dbg = dbImage.getGraphics();
        paintComponent(dbg);
        g.drawImage(dbImage, 0, 0, this);

    }

    public void paintComponent(Graphics g) {

        Rectangle player = new Rectangle(playerX, playerY, 50, 50);
        g.setColor(Color.blue);
        g.fillRect(player.x, player.y, player.width, player.height);
        repaint();

    }

    private void log(String s){

        System.out.println(s);

    }

}
packagemain;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Image;
导入java.awt.Rectangle;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入javax.swing.JPanel;
公共类GamePanel扩展JPanel实现可运行{
//全局变量
//双缓冲
私有镜像dbImage;
专用图形数据库;
//JPanel变量
静态最终int GWIDTH=500,GHEIGHT=500;
静态最终尺寸gameDim=新尺寸(GWIDTH,GHEIGHT);
//博弈变量
私密线程游戏;
private volatile boolean running=false;
公共布尔mouseClicked=false;
//字符变量
int playerX=150,playerY=150;
公共类鼠标扩展了MouseAdapter{
公共无效鼠标按下(MouseEvent e){
mouseClicked=true;
}
公共无效MouseEvent(MouseEvent e){
mouseClicked=false;
}
public void mouseMoved(MouseEvent e){
重新油漆();
如果(如getX()=300)
playerX=500;
如果(如getY()=300)
playerY=500;
其他的
playerX=e.getX()-25;
playerY=e.getY()-25;
重新油漆();
}
}
公共游戏小组(){
addMouseMotionListener(新鼠标());
setPreferredSize(gameDim);
挫折背景(颜色:蓝色);
设置聚焦(真);
请求焦点(true);
}
公开募捐{
(跑步时){
}
}
public void addNotify(){
super.addNotify();
startGame();
}
私有void startGame(){
如果(游戏==null | |!正在运行){
游戏=新线程(此);
game.start();
运行=真;
}
}
公共游戏{
如果(正在运行){
运行=错误;
}
//油漆方法
}
公共空间涂料(图g){
dbImage=createImage(getWidth(),getHeight());
dbg=dbImage.getGraphics();
油漆组件(dbg);
g、 drawImage(dbImage,0,0,this);
}
公共组件(图形g){
矩形播放器=新矩形(playerX,playerY,50,50);
g、 setColor(Color.blue);
g、 fillRect(player.x,player.y,player.width,player.height);
重新油漆();
}
私有无效日志(字符串s){
系统输出打印项次;
}
}

谢谢你的帮助。如果您需要什么,请告诉我。

您的移动代码有点错误。仅当Y未超出边界时才设置x位置,并始终替换Y值。我可以建议将来使用完整的模块吗?它们有助于避免此类问题

playerX = e.getX()-25;
playerY = e.getY()-25;
if(e.getX() <= 0){
    playerX = 0;
}
else if(e.getX() >= 300){
    playerX = 500;
}

if(e.getY() <= 0){
    playerY = 0;
}
else if(e.getY() >= 300){
     playerY = 500;
}
playerX=e.getX()-25;
playerY=e.getY()-25;
如果(如getX()=300){
playerX=500;
}
如果(如getY()=300){
playerY=500;
}

这将首先设置位置,然后在球员出界时进行纠正

不要依赖魔法数字,使用getWidth和getHeight来确定游戏区域的大小。不要在任何paint方法中调用repaint,这将导致无限循环,这将慢慢消耗您的CPU。一定要调用super.paintComponent(g);)
playerX = e.getX()-25;
playerY = e.getY()-25;
if(e.getX() <= 0){
    playerX = 0;
}
else if(e.getX() >= 300){
    playerX = 500;
}

if(e.getY() <= 0){
    playerY = 0;
}
else if(e.getY() >= 300){
     playerY = 500;
}