java中的吃豆人克隆运动

java中的吃豆人克隆运动,java,Java,我想用矩形来检测水平和垂直的吃豆人和墙壁的碰撞。因为我想,如果检测到水平碰撞,吃豆人只能向左或向右移动,并用垂直方向反转。我的想法是制作如下矩形: public void checkMap() { int xRaw = pac.getX(); int yRaw = pac.getY(); rectanglePacX = new Rectangle(xRaw+1, yRaw, Pac.SIZE, Pac.SIZE); rectanglePacX1 = new Rec

我想用矩形来检测水平和垂直的吃豆人和墙壁的碰撞。因为我想,如果检测到水平碰撞,吃豆人只能向左或向右移动,并用垂直方向反转。我的想法是制作如下矩形:

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

}

vector==1
我启用字符向上或向下移动,
vector==2
向左或向右移动,
vector==3
在十字路口它可以向所有方向移动。但我不知道怎么了。

创建这些矩形的方法不适用于:

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中实现游戏本身,然后在逻辑上添加一个视图,使用一个通常是我自己做的。看看是什么


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

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

xxxxxxxxxxxxxx
x ...>  x    x
x xxxxx xxxx x
x     x      x
xxxxxxxxxxxxxx
在Java中,您可以将其表示为一个对象(称之为
Maze
,因为
Map
在Java中意味着其他东西),它包含一个单元格网格。定义一个
单元
类:

public class Cell {
    public boolean isWall() { ... }
    ...
}
public class Maze {
    private Cell[][] cells;
    ...
    public Cell getCellAt( int x, int y ) { ... }
}
迷宫
课程:

public class Cell {
    public boolean isWall() { ... }
    ...
}
public class Maze {
    private Cell[][] cells;
    ...
    public Cell getCellAt( int x, int y ) { ... }
}
当你想在屏幕上显示迷宫时,你只需参考迷宫对象,找出哪些单元格包含墙、重影或其他内容,然后将其渲染到屏幕上

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


这也意味着你的代码部分与你如何绘制游戏的细节脱钩:它不需要知道诸如
Pac.SIZE
或你的墙是什么颜色之类的事情。

不要试图在GUI中直接实现这样的逻辑;吃豆人游戏只是一个棋盘游戏(可以在
单元格[][]
中复制),您可以在其中按4个方向移动。创建模型、板和运动。然后在上面添加视图。对于其他人,我不确定问题是什么。我想用矩形来检测水平和垂直碰撞pacman和墙壁。因为我想检测水平碰撞pacman只能向左或向右移动,与垂直移动相同。对不起,我的英语我希望你能理解。就像我说的,不要使用
矩形
来检测任何东西。使用数组创建逻辑。它将像
cellUp().getType().isWall()一样简单。
。。。然后使用用于控制游戏的单元格数组添加GUI。例如,考虑到pacman能够向上移动但不能向下移动,或者向右移动但不能向左移动的可能性,请参阅有关mvcAre的内容?你应该用一套或一些东西来积累每一个转弯的可能方向。谢谢你的帮助谢谢你的建议明确的方向。单元格类型的枚举,您不会遇到这些问题。(我不想提供太多的部分让OP去做,有太多的例子…)。我个人不喜欢使用数组,而是使用知道邻居的
Cell
。它允许一些有趣的行为,如“无限”生成板。