我想使用矩形来检测碰撞水平和垂直的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
在十字路口移动它可以向所有方向移动。但我不知道出了什么问题。
答案 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
图像解释问题要简单一些
红色是你创建的矩形减去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
之类的内容或墙壁的颜色。