迷宫2D java游戏中的碰撞检测

迷宫2D java游戏中的碰撞检测,java,collision,maze,pacman,Java,Collision,Maze,Pacman,我正在尝试制作我的第一个Pacman游戏,但我遇到了一堵我自己似乎无法打破的墙:( 这是关于如何在我的游戏中检测碰撞,这样吃豆人就不能穿过障碍物/墙壁。我已经做了,这样它就不能走出屏幕了,代码如下: if (pacman_x < 27) { pacman_velX = 0; pacman_x = 27; } if (pacman_y < 27) { pacman_velY = 0; pacman_

我正在尝试制作我的第一个Pacman游戏,但我遇到了一堵我自己似乎无法打破的墙:(

这是关于如何在我的游戏中检测碰撞,这样吃豆人就不能穿过障碍物/墙壁。我已经做了,这样它就不能走出屏幕了,代码如下:

    if (pacman_x < 27) {
        pacman_velX = 0;
        pacman_x = 27;
    }
    if (pacman_y < 27) {
        pacman_velY = 0;
        pacman_y = 27;
    }
    if (pacman_x > 621) {
        pacman_velX = 0;
        pacman_x = 621;
    }
    if (pacman_y > 513) {
        pacman_velY = 0;
        pacman_y = 513;
    }
if(pacman_x<27){
pacman_velX=0;
pacman_x=27;
}
如果(吃豆人y<27){
吃豆人=0;
pacman_y=27;
}
如果(pacman_x>621){
pacman_velX=0;
pacman_x=621;
}
如果(pacman_y>513){
吃豆人=0;
pacman_y=513;
}
,但如果我在屏幕中间的电路板上有一个矩形,我不知道如何编程,这样它就会在墙前停止

我已经上传了地图的foto:

我需要阻止我的pacman移动到竞技场内的墙上,如您所见(左上方的矩形)

我的Board类代码:

public class Board extends JPanel implements ActionListener, KeyListener {

private Timer timer;
private Map m;
private Pacman p;
int pacman_x = 27, pacman_y = 27, pacman_velX = 0, pacman_velY = 0; 

public Board() 
{
    m = new Map();
    p = new Pacman();
    timer = new Timer(10, this);
    timer.start();
    addKeyListener(this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(false); // So we can't use shift 
}

public void actionPerformed(ActionEvent e) {
    pacman_x = pacman_x + pacman_velX;
    pacman_y = pacman_y + pacman_velY;
    repaint();          

    if (pacman_x < 27) {
        pacman_velX = 0;
        pacman_x = 27;
    }
    if (pacman_y < 27) {
        pacman_velY = 0;
        pacman_y = 27;
    }
    if (pacman_x > 621) {
        pacman_velX = 0;
        pacman_x = 621;
    }
    if (pacman_y > 513) {
        pacman_velY = 0;
        pacman_y = 513;
    }

    if (pacman_x >= 150 && pacman_y >= 27) {
        pacman_velX = 0;
        pacman_x = 27;
    }

}

public void paint(Graphics g) {
    super.paint(g);

    Graphics2D g2d = (Graphics2D) g;

    for(int y = 0; y < 21; y++) {
        for (int x = 0; x < 25; x++) {
            if (m.getMap(x, y).equals("b")) {
                g.drawImage(m.getBarrier(), x * 27, y * 27, null);
            }
            if (m.getMap(x, y).equals("s")) {
                g.drawImage(m.getSpace(), x * 27, y * 27, null);
            }
        }

    }

    // Place pacman on board        
    g.drawImage(p.getPacman(), pacman_x , pacman_y, null);  

    // Create Rectangles barriers
    Rectangle r1 = new Rectangle(150, 27, 27, 27);

    g2d.setColor(new Color(63, 72, 204, 250));      
    g.fillRect(r1.x, r1.y, 27, 27);

    // Sets Color on lives
    int lives = 3;
    g2d.setColor(new Color(255, 0, 0, 250));
    g2d.drawString("Lives left: " + lives, 20, 20);

    // Sets Color on Scoreboard text
    int point = 0;      
    g2d.setColor(new Color(255, 0, 0, 250));
    g2d.drawString("Score: " + point, 20, 550);
}

@Override
public void keyPressed(KeyEvent e) {

    int pacman_direction = e.getKeyCode();

    if (pacman_direction == KeyEvent.VK_LEFT) {

        pacman_velX = -3;
        pacman_velY = 0;

    }       

    if (pacman_direction == KeyEvent.VK_UP) {

        pacman_velX = 0;
        pacman_velY = -3;           

    }

    if (pacman_direction == KeyEvent.VK_RIGHT) {

        pacman_velX = 3;
        pacman_velY = 0;

    }

    if (pacman_direction == KeyEvent.VK_DOWN) {

        pacman_velX = 0;
        pacman_velY = 3;    

    }

}
公共类板扩展JPanel实现ActionListener、KeyListener{
私人定时器;
私有地图m;
私人吃豆人;
int pacman_x=27,pacman_y=27,pacman_velX=0,pacman_velY=0;
公共委员会()
{
m=新映射();
p=新的吃豆人();
定时器=新定时器(10,此);
timer.start();
addKeyListener(此);
设置聚焦(真);
setFocusTraversalKeysEnabled(false);//因此我们不能使用shift
}
已执行的公共无效操作(操作事件e){
吃豆人=吃豆人+吃豆人;
吃豆人=吃豆人+吃豆人;
重新油漆();
如果(吃豆人x<27){
pacman_velX=0;
pacman_x=27;
}
如果(吃豆人y<27){
吃豆人=0;
pacman_y=27;
}
如果(pacman_x>621){
pacman_velX=0;
pacman_x=621;
}
如果(pacman_y>513){
吃豆人=0;
pacman_y=513;
}
如果(吃豆人x>=150和吃豆人y>=27){
pacman_velX=0;
pacman_x=27;
}
}
公共空间涂料(图g){
超级油漆(g);
Graphics2D g2d=(Graphics2D)g;
对于(int y=0;y<21;y++){
对于(int x=0;x<25;x++){
if(m.getMap(x,y).等于(“b”)){
g、 drawImage(m.getBarrier(),x*27,y*27,null);
}
if(m.getMap(x,y).equals(“s”)){
g、 drawImage(m.getSpace(),x*27,y*27,null);
}
}
}
//把吃豆人放在船上
g、 drawImage(p.getPacman(),pacman_x,pacman_y,null);
//创建矩形屏障
矩形r1=新矩形(150,27,27,27);
g2d.setColor(新颜色(63,72,204,250));
g、 fillRect(r1.x,r1.y,27,27);
//给生活增添色彩
int=3;
设置颜色(新颜色(255,0,0250));
g2d.抽绳(“生命左:”+生命,20,20);
//设置记分板文本的颜色
int点=0;
设置颜色(新颜色(255,0,0250));
g2d.抽绳(“分数:+分,20550分);
}
@凌驾
按下公共无效键(按键事件e){
int pacman_direction=e.getKeyCode();
if(pacman_direction==KeyEvent.VK_LEFT){
pacman_velX=-3;
吃豆人=0;
}       
if(pacman_direction==KeyEvent.VK_UP){
pacman_velX=0;
pacman_velY=-3;
}
if(pacman_direction==KeyEvent.VK_RIGHT){
pacman_velX=3;
吃豆人=0;
}
if(pacman_方向==KeyEvent.VK_向下){
pacman_velX=0;
吃豆人=3;
}
}

希望有人能告诉我该怎么做。似乎在互联网上找不到一个简单的示例教程来解释我想要它做的事情!

这并不完全是关于用java制作pac man,而是关于一个2d平台,它在2d空间中有所有的碰撞映射,以及如何创建和添加对象,例如一个玩家和一个有碰撞的敌人包括在其中的NIMOTIONS,您会发现它总体上是有用的:

注意:你需要自己处理鬼的AI:D


免责声明我没有制作这些视频,我只是觉得它们非常有用。

请检查此框架以进行碰撞检查。因此,您基本上想知道如何在任何墙壁上进行碰撞检测?您可以创建一个定义所有墙壁的形状。方法Shape.intersects(矩形2D)当吃豆人撞到墙上时,它会告诉你,使用吃豆人的边框作为矩形。返回到最后一个好位置,将速度设置为0,等等。如果形状不够,该区域会提供更多功能。