java - 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
在十字路口它可以向所有方向移动。但我不知道出了什么问题。
解决方案
您创建这些矩形的方式不正确:
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
的实例能够轻松检测到运动。
推荐阅读
- java - 有没有办法在 listview 或 recyclerview 上向左滑动以显示更多选项?
- c++ - 如何对齐为 std::vector 分配的内存?
- python - 使用python访问XML标签中的数据
- c++ - 对象初始化
- android - 在扩展片段布局之前实例化 MapBox 导致异常
- python - 当列表中的字符串与列表的先前值中的字符串不同时运行函数
- python - 如何按高度优化队列重构?(力科)
- javascript - 单击播放()时不必要地下载多个音频文件
- node.js - 无法读取 CPU 温度 - Nodejs 或 WindowsForms
- cmake - 为avr构建代码时出现cmake构建问题