java pacman墙冲突无法正常工作

java pacman墙冲突无法正常工作,java,collision-detection,collision,pacman,Java,Collision Detection,Collision,Pacman,尝试编写java pacman代码。我使用BuffereImage存储迷宫。为了检查pacman与墙壁的碰撞,我使用2d int数组,值0表示空白空间&pacman可以在上面移动,1表示墙壁。pacman对象在按键时一次移动1个正方形,在按键释放时停止。但吃豆人并没有正确地移动,它有时也会越过墙壁广场,有时它会移动,然后完全停止,即使它在空的广场上。不知道我哪里出错了。我使用了下面的课程。请找个人帮忙 public class Map extends JPanel implements Runn

尝试编写java pacman代码。我使用BuffereImage存储迷宫。为了检查pacman与墙壁的碰撞,我使用2d int数组,值0表示空白空间&pacman可以在上面移动,1表示墙壁。pacman对象在按键时一次移动1个正方形,在按键释放时停止。但吃豆人并没有正确地移动,它有时也会越过墙壁广场,有时它会移动,然后完全停止,即使它在空的广场上。不知道我哪里出错了。我使用了下面的课程。请找个人帮忙

public class Map extends JPanel implements Runnable{

private int TILE_W=15; //divide map into 15x15 tiles
private int TILE_H=20; //there will be 20 tiles along width and 15 along height,total of 300 tiles

private Image tile; // 15x15 png image

private BufferedImage img; //stores maze image

private long DELAY=50;

private Pacman pacman;

private int[][] mapdata={{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 
                         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                         {1,0,0,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1},
                         {1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1},
                         {1,0,0,1,0,0,1,0,1,0,1,0,1,1,1,1,1,1,0,1},
                         {1,0,0,1,1,1,1,0,1,0,1,0,1,0,0,0,0,1,0,1},
                         {1,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,1,0,1},
                         {1,0,0,1,1,1,1,0,1,0,1,0,1,1,1,1,1,1,0,1},
                         {1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1},
                         {1,0,0,1,0,0,1,0,1,0,1,0,1,1,1,1,1,1,0,1},
                         {1,0,0,1,0,0,1,0,1,0,1,0,1,0,0,0,0,1,0,1},
                         {1,0,0,1,0,0,1,0,1,0,1,0,1,0,0,0,0,1,0,1},
                         {1,0,0,1,1,1,1,0,1,0,1,0,1,1,1,1,1,1,0,1},
                         {1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1},
                         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
                        };

public Map(){
  ImageIcon ict=new ImageIcon(this.getClass().getResource("tile.png"));
  tile=ict.getImage();
  addKeyListener(new KbListener());
  setFocusable(true);
  setDoubleBuffered(true);
  pacman=new Pacman(mapdata);
  img=new BufferedImage(350,350,BufferedImage.TYPE_INT_ARGB);
  Graphics2D g2D=(Graphics2D) img.getGraphics();
  for(int x=0;x<TILE_W;x++)
    for(int y=0;y<TILE_H;y++){
            if(mapdata[x][y]==1)
                g2D.drawImage(tile,y*15,x*15,this);
    }
  Thread t=new Thread(this);
  t.start();
}

@Override
public void paintComponent(Graphics g){
    super.paintComponent(g);
    Graphics2D g2D=(Graphics2D) g;
    g2D.drawImage(img,0,0,this);
    g2D.drawImage(pacman.getImage(),pacman.getX(),pacman.getY(),this);
    Toolkit.getDefaultToolkit().sync();
    g.dispose();
}

public void run() {
    // TODO Auto-generated method stub
    while(true){
     repaint();
     pacman.move();
     try {
        Thread.sleep(DELAY);
     } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
     }
   }
}

private class KbListener extends KeyAdapter{
    public void keyReleased(KeyEvent e){
        pacman.keyReleased(e);
    }

    public void keyPressed(KeyEvent e){
        pacman.keyPressed(e);
    }
}

}


public class Pacman {
private Image pacman;
private int x,y;
private int dx,dy;

private int[][] mapdata;
private int mapx,mapy;

public Pacman(int[][] mapdata){
    ImageIcon icp=new ImageIcon(this.getClass().getResource("pacman.png"));
    pacman=icp.getImage();
    x=30;
    y=15;
    dx=0;
    dy=0;
    mapx=2;
    mapy=1;
    this.mapdata=mapdata;
}

public void move(){
    x+=dx;
    y+=dy;  
}

public Image getImage(){
    return pacman;
}

public int getX(){
    return x;
}

public int getY(){
    return y;
}

public void keyPressed(KeyEvent e){
    int k=e.getKeyCode();
    if(k==KeyEvent.VK_LEFT){
        mapx=(x-15)/15;
        if(mapdata[mapx][mapy]==1)
            dx=0;
        else dx=-15; 
    }
    if(k==KeyEvent.VK_RIGHT){
        mapx=(x+15)/15;
        if(mapdata[mapx][mapy]==1)
            dx=0;
        else dx=15;
    }
    if(k==KeyEvent.VK_UP){
        mapy=(y-15)/15;
        if(mapdata[mapx][mapy]==1)
            dy=0;
        else dy=-15;
    }
    if(k==KeyEvent.VK_DOWN){
        mapy=(y+15)/15;
        if(mapdata[mapx][mapy]==1)
            dy=0;
        else dy=15;
    }
}

public void keyReleased(KeyEvent e){
    int k=e.getKeyCode();
    if(k==KeyEvent.VK_LEFT)
        dx=0;
    if(k==KeyEvent.VK_RIGHT)
        dx=0;
    if(k==KeyEvent.VK_UP)
        dy=0;
    if(k==KeyEvent.VK_DOWN)
        dy=0;
}
}
公共类映射扩展JPanel实现可运行{
private int TILE_W=15;//将地图分成15x15个TILE
private int TILE_H=20;//将有20块宽瓷砖和15块高瓷砖,总共300块
私有图像平铺;//15x15 png图像
私有缓冲区映像img;//存储迷宫映像
专用长延时=50;
私人吃豆人;
私有int[]mapdata={{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,1,0,0,1,0,1,0,1,0,1,1,1,1,1,1,0,1},
{1,0,0,1,1,1,1,0,1,0,1,0,1,0,0,0,0,1,0,1},
{1,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,1,0,1},
{1,0,0,1,1,1,1,0,1,0,1,0,1,1,1,1,1,1,0,1},
{1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,1,0,0,1,0,1,0,1,0,1,1,1,1,1,1,0,1},
{1,0,0,1,0,0,1,0,1,0,1,0,1,0,0,0,0,1,0,1},
{1,0,0,1,0,0,1,0,1,0,1,0,1,0,0,0,0,1,0,1},
{1,0,0,1,1,1,1,0,1,0,1,0,1,1,1,1,1,1,0,1},
{1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};
公共地图(){
ImageIcon ict=新的ImageIcon(this.getClass().getResource(“tile.png”);
tile=ict.getImage();
addKeyListener(新KbListener());
设置聚焦(真);
setDoubleBuffered(真);
pacman=新pacman(地图数据);
img=新的BuffereImage(350350,BuffereImage.TYPE_INT_ARGB);
Graphics2D g2D=(Graphics2D)img.getGraphics();

对于(int x=0;x请在此处查看变量:

if(k==KeyEvent.VK_LEFT){
    mapx=(x-15)/15;
    if(mapdata[mapx][mapy]==1)
        dx=0;
    else dx=-15; 
}
在事件之间,你在哪里重置
mapx
mapy
?我看不到你在任何地方都这样做。那么后续事件之间的
mapx
mapy
会发生什么?例如,如果你向左移动并撞到墙上,然后向上移动,你的
mapx
现在仍然卡在墙上

不要使用字段,因为您没有在其他任何地方使用它们。只需在方法中创建变量即可。您在
dx
dy
中也有类似的潜在问题,只有在更改方向前撞到墙时,它们才会重置为0

int mapx = x / 15;
int mapy = y / 15;

if (k == KeyEvent.VK_LEFT) {
    mapx--;

    if (mapx < 0 ||
            mapdata[mapx][mapy] == 1)
        dx = 0;
    else dx =- 15;

    dy = 0;

} else if (k == KeyEvent.VK_RIGHT) {
    mapx++;

    if (mapx > mapdata.length - 1 ||
            mapdata[mapx][mapy] == 1)
        dx = 0;
    else dx = 15;

    dy = 0;

} else if (k == KeyEvent.VK_UP) {
    mapy--;

    if (mapy < 0 ||
            mapdata[mapx][mapy] == 1)
        dy = 0;
    else dy =- 15;

    dx = 0;

} else if (k == KeyEvent.VK_DOWN) {
    mapy++;

    if (mapy > mapdata[mapx].length - 1 ||
            mapdata[mapx][mapy] == 1)
        dy = 0;
    else dy = 15;

    dx = 0;
}
intmapx=x/15;
int-mapy=y/15;
if(k==KeyEvent.VK_左){
mapx--;
如果(mapx<0||
mapdata[mapx][mapy]==1)
dx=0;
否则dx=-15;
dy=0;
}else if(k==KeyEvent.VK_RIGHT){
mapx++;
如果(mapx>mapdata.length-1||
mapdata[mapx][mapy]==1)
dx=0;
否则dx=15;
dy=0;
}else if(k==KeyEvent.VK_UP){
马皮--;
if(mapy<0||
mapdata[mapx][mapy]==1)
dy=0;
否则dy=-15;
dx=0;
}else if(k==KeyEvent.VK_DOWN){
mapy++;
如果(mapy>mapdata[mapx].length-1||
mapdata[mapx][mapy]==1)
dy=0;
d=15;
dx=0;
}

1)为了更快地获得更好的帮助,请发布一条。2)您的“问题”不包含“?”。您有问题吗,如果有,是什么问题吗?3)对于Swing,通常在基于AWT的较低级别上使用键绑定,
KeyListener
。有关如何使用它们的详细信息,请参阅。4)查看一种有效的碰撞检测形式。谢谢。它工作得更好,但是pacman当我不停地按住键时,有时仍然会穿过墙壁。有什么方法可以防止这种情况发生吗?这与在pacman速度设置为0之前调用paint()有关吗?这可能是一个并发问题。请尝试将pacman中的字段声明为volatile。