在Java中的吃豆人克隆运动

时间:2018-05-25 06:05:58

标签: java

PacMan

我想使用矩形来检测碰撞水平和垂直的pac-man和wall。因为我想要检测水平碰撞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在十字路口移动它可以向所有方向移动。但我不知道出了什么问题。

2 个答案:

答案 0 :(得分:1)

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

IdentifierForProduct

您返回一个像素并使用rectanglePacX1 = new Rectangle(xRaw-1, yRaw, Pac.SIZE, Pac.SIZE); rectanglePacY1 = new Rectangle(xRaw, yRaw-1, Pac.SIZE, Pac.SIZE); 设置大小。它将使用当前的矩形仅提供1个像素的矩形。你需要的是:

Pac.SIZE

图像解释问题要简单一些

enter image description here

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

注意:我需要告诉我,在视图中实现逻辑并不是一个好的实践。最好在OOP中实现游戏本身,然后在逻辑上添加一个视图,使用Observer pattern通常是我自己做的。查看什么是MVC

实现一个包含2维数组rectanglePacX1 = new Rectangle(xRaw - Pac.SIZE -1, yRaw, Pac.SIZE, Pac.SIZE); rectanglePacY1 = new Rectangle(xRaw, yRaw - Pac.SIZE- 1, Pac.SIZE, Pac.SIZE); 的类Board,每个单元格都有一个类型(有一个硬币,一个墙,......)。这将允许您Cell实例轻松检测到移动。

答案 1 :(得分:1)

请勿将游戏模型与您在屏幕上看到的内容混淆。该模型可以是游戏地图的简单表示,可以像单元格网格一样简单:

xxxxxxxxxxxxxx
x ...>  x    x
x xxxxx xxxx x
x     x      x
xxxxxxxxxxxxxx

您可以在Java中将其表示为对象(称之为Maze,因为Map表示Java中的其他内容),其中包含单元格网格。定义Cell类:

public class Cell {
    public boolean isWall() { ... }
    ...
}

Maze类:

public class Maze {
    private Cell[][] cells;
    ...
    public Cell getCellAt( int x, int y ) { ... }
}

当您想要在屏幕上显示迷宫时,您可以查阅迷宫对象以确定哪些单元格包含墙壁,鬼魂或其他任何单元格,并将其渲染到屏幕上。

这样做的好处是碰撞检测变得非常简单:只需获取播放器位置左/右/上方/下方的单元格,然后调用isWall()确定你是否可以搬到那里。

这也意味着您的代码部分与您绘制游戏的细节分离:它不需要了解Pac.SIZE之类的内容或墙壁的颜色。