
我想使用矩形来检测碰撞水平和垂直pac-man和墙壁。因为我想,如果检测到水平碰撞,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在十字路口可以移动所有方向。但我不知道怎么回事。
发布于 2018-05-25 06:54:20
创建这些矩形的方式不正确,因为:
rectanglePacX1 = new Rectangle(xRaw-1, yRaw, Pac.SIZE, Pac.SIZE);
rectanglePacY1 = new Rectangle(xRaw, yRaw-1, Pac.SIZE, Pac.SIZE);返回一个像素,并使用Pac.SIZE设置大小。它将与当前的矩形只差一个像素。你需要的是:
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
实现一个包含二维Cell数组的类Cell,每个单元格都有一个类型(有一个硬币,是一个墙,.)。这将使您的PacMan实例能够很容易地检测到移动。
发布于 2018-05-25 07:07:15
不要把你的游戏模型和你在屏幕上看到的东西混淆起来。模型可以是游戏地图的简单表示,它可以像单元格一样简单:
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这样的东西,也不需要知道你的墙壁是什么颜色。
https://stackoverflow.com/questions/50522522
复制相似问题