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