我正在制作吃豆人。我现在有一名玩家控制着PacMan,一名玩家控制了幽灵。它们都扩展了相同的抽象类。我无法找出检查它们是否发生碰撞的方法。这是抽象类 `
ObjectOutputStream
` 这是我要放置碰撞方法的地方
package org.entity.mobs;
import java.awt.Point;
import org.Constants;
import org.entity.Entity;
public abstract class Mob extends Entity {
private Point destination;
protected int nextDirection = 4;
protected int direction;
protected int tempX;
public Mob(int x, int y) {
super(x, y);
destination = new Point();
}
public void update() {
if (Constants.walls[destination.y][destination.x] != 1) {
switch (direction) {
case 1:
y -= 2;
break;
case 2:
y += 2;
break;
case 3:
x -= 2;
break;
case 4:
x += 2;
break;
default:
break;
}
}
if (onGrid()) {
direction = nextDirection;
}
}
public void setNextDirection(int key) {
switch (key) {
case Constants.PACMAN_UP:
this.nextDirection = 1;
break;
case Constants.PACMAN_DOWN:
this.nextDirection = 2;
break;
case Constants.PACMAN_LEFT:
this.nextDirection = 3;
break;
case Constants.PACMAN_RIGHT:
this.nextDirection = 4;
break;
}
}
public Point getDestination() {
return destination;
}
public void setDestination() {
Point point = new Point();
switch (direction) {
case 1: // up
point.setLocation(x / 20, ((y - 1) / 20));
if (x % 20 <= 4 || x % 20 >= 16) {
tempX = (x + 5) / 20;
} else {
tempX = x;
}
break;
case 2: // down
point.setLocation(x / 20, (y / 20) + 1);
if (x % 20 <= 4 || x % 20 >= 16) {
tempX = (x + 5) / 20;
} else {
tempX = x;
}
break;
case 3: // left
point.setLocation(((x - 1) / 20), y / 20);
if (x % 20 <= 4 || x % 20 >= 16) {
tempX = (x + 5) / 20;
} else {
tempX = x;
}
break;
case 4: // right
point.setLocation((x / 20) + 1, y / 20);
if (x % 20 <= 4 || x % 20 >= 16) {
tempX = (x + 5) / 20;
} else {
tempX = x;
}
break;
default:
break;
}
destination.setLocation(point);
}
public boolean onGrid() {
return (x % 20 == 0) && (y % 20 == 0);
}
}
答案 0 :(得分:0)
在Entity类中创建java.awt.Rectangle。矩形的坐标表示发生碰撞检测的边界框。在实体更新中,更新矩形的位置。
在Grid类中,创建方法chrckCollisions并遍历实体数组并检查每个实体是否与另一个实体发生冲突。 (搜索&#34;握手问题&#34;,这是一种粗鲁的方法,但你总是可以优化它。)你应该使用矩形内的交叉(矩形)方法。
在你的实体类中有一个方法是&#34; public abstract void onCollision(Entity other)&#34;。在这里,您为每个子类指定与另一个实体冲突时要做什么。例如,如果我们在ghost子类中,检查我们是否与pacman发生冲突然后执行某些操作。
当发现两个实体发生碰撞时,会调用此方法。希望这可以帮助。