首页 > 解决方案 > java中的吃豆人克隆运动

问题描述

吃豆人

我想使用矩形来检测碰撞水平和垂直 pac-man 和墙。因为我想如果检测到水平碰撞吃豆人只能向左或向右移动并垂直反转。我的想法是像这样制作矩形:

public void checkMap() {
    int xRaw = pac.getX();
    int yRaw = pac.getY();
    rectanglePacX = new Rectangle(xRaw+1, yRaw, Pac.SIZE, Pac.SIZE);
    rectanglePacX1 = new Rectangle(xRaw-1, yRaw, Pac.SIZE, Pac.SIZE);
    rectanglePacY = new Rectangle(xRaw, yRaw+1, Pac.SIZE, Pac.SIZE);
    rectanglePacY1 = new Rectangle(xRaw, yRaw-1, Pac.SIZE, Pac.SIZE);
    for (int i = 0; i < items.size(); i++) {
        if (isPacCollisionWallz(items.get(i), rectanglePacX) && isPacCollisionWallz(items.get(i), rectanglePacX1)) {
            vector = 1;
        }
        if (isPacCollisionWallz(items.get(i), rectanglePacY) && isPacCollisionWallz(items.get(i), rectanglePacY1)) {
            vector = 2;
        } else {
            vector = 3;
        }
    }

}

这是我的方法isPacCollisionWallz()

private boolean isPacCollisionWallz(MapItem mapItem, Rectangle rectangle) {
    return rectangle.intersects(mapItem.getRectangle());
}

vector == 1我启用角色向上或向下vector == 2移动,向左或向右移动时,vector == 3在十字路口它可以向所有方向移动。但我不知道出了什么问题。

标签: java

解决方案


您创建这些矩形的方式不正确:

rectanglePacX1 = new Rectangle(xRaw-1, yRaw, Pac.SIZE, Pac.SIZE); 
rectanglePacY1 = new Rectangle(xRaw, yRaw-1, Pac.SIZE, Pac.SIZE);

您会返回一个像素并使用 设置大小Pac.SIZE。它会给出一个与当前矩形相差 1 个像素的矩形。你需要的是:

rectanglePacX1 = new Rectangle(xRaw - Pac.SIZE -1, yRaw, Pac.SIZE, Pac.SIZE); 
rectanglePacY1 = new Rectangle(xRaw, yRaw - Pac.SIZE- 1, Pac.SIZE, Pac.SIZE);

一张图片更容易解释问题

在此处输入图像描述

红色是您创建的矩形减去 1 个像素,绿色是您想要的,减去 1 个像素和矩形本身的大小。


注意:我需要说明这不是在视图中实现逻辑的好习惯。最好在 OOP 中实现游戏本身然后在逻辑上添加一个视图,使用观察者模式通常是我自己做的。看看什么是MVC

实现一个Board包含 2 维数组的类Cell,每个单元格都有一个类型(有一个硬币,是一堵墙,...)。这将使您PacMan的实例能够轻松检测到运动。


推荐阅读