当前位置: 首页 > 知识库问答 >
问题:

java pacman墙冲突无法正常工作

能烨华
2023-03-14

正在尝试编写java pacman代码。我用BuffereImage来存储迷宫。为了检查pacman与墙壁的碰撞,我使用了2d int数组,值0表示空白

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;
}
}

共有1个答案

白和泽
2023-03-14

在这里看看你的变量:

if(k==KeyEvent.VK_LEFT){
    mapx=(x-15)/15;
    if(mapdata[mapx][mapy]==1)
        dx=0;
    else dx=-15; 
}

在事件之间,在哪里重置mapxmapy?我没看到你在任何地方这样做。那么,在后续事件之间,mapxmapy会发生什么?例如,如果您向左移动并撞到墙上,然后向上移动,则您的mapx现在仍然卡在墙上。

不要使用字段,因为您没有在其他任何地方使用它们。只需在方法中创建变量。您在dxdy方面也有类似的潜在问题,只有在更改方向前撞到墙时,它们才会重置为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;
}
 类似资料:
  • 问题内容: 因此,我的设置无法按我想要的方式工作。因此,每当我运行该程序时,它就会立即从0变为100。我尝试使用,任务,并尝试了,但没有任何尝试。 这是我的程序: @MadProgrammer这是我尝试做一名摆动工作人员并将每个名称写入文档并更新进度栏的尝试。该程序将达到86%左右并停止运行,永远不会创建完成的文档。该程序将创建一个空白文档。这是我首先创建的SwingWorker对象,这是两种方法

  • 问题内容: 我在JLayeredpane上有两个JPanels。其中一个显示pdf,重叠的一个具有透明背景(我使用过setOpaque(false))。现在,我可以将图形添加到透明面板中,这样看来我实际上是在注释pdf。我想要一个橡皮擦工具来删除这些注释。我尝试使用以下代码 其中path是由多条线构成的形状。现在,不是在先前的图形上绘制 透明线 ,而是绘制 黑线 。我要去哪里错了? 问题答案: 请

  • 问题内容: 这看起来有效,但无法正常工作。我希望菜单悬停时’huh’div不透明。我尝试了淡入/淡出效果,但效果很好,但只有一次很奇怪。 问题答案: 不带点使用:

  • 问题内容: 我正在编辑从tesseract ocr获得的一些电子邮件。 这是我的代码: 但是输出不正确。 输入: 输出: 但是,当我在每次替换后将结果分配给新的String时,它都能正常工作。为什么在同一字符串中连续分配不起作用? 问题答案: 您将在Javadoc中的String.replaceAll()中注意到,第一个参数是正则表达式。 句点()和管道()以及花括号()都有特殊的含义。您需要对它

  • 问题内容: 我正在编写3D绘画,但在Java中发现了问题。在代码的一部分中,它起作用了: 在另一种情况下,它不起作用: 你能告诉我如何使它工作吗?谢谢在我问之前,是的,它确实执行了那部分代码。 编辑: 哦,现在工作正常,谢谢 问题答案: 代替:

  • 问题内容: array_key_exists不适用于大型多维数组。对于前 array_key_exists(’test’,$ arr)返回’false’,但它可以与一些简单的数组一起使用。 问题答案: array_key_exists不能递归工作(正如MattiVirkkunen指出的那样)。看一下PHP手册,可以使用以下代码来执行递归搜索: