如何进行碰撞

时间:2015-05-22 17:54:56

标签: java collision pacman

我正在制作吃豆人。我现在有一名玩家控制着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);
    }
}

1 个答案:

答案 0 :(得分:0)

在Entity类中创建java.awt.Rectangle。矩形的坐标表示发生碰撞检测的边界框。在实体更新中,更新矩形的位置。

在Grid类中,创建方法chrckCollisions并遍历实体数组并检查每个实体是否与另一个实体发生冲突。 (搜索&#34;握手问题&#34;,这是一种粗鲁的方法,但你总是可以优化它。)你应该使用矩形内的交叉(矩形)方法。

在你的实体类中有一个方法是&#34; public abstract void onCollision(Entity other)&#34;。在这里,您为每个子类指定与另一个实体冲突时要做什么。例如,如果我们在ghost子类中,检查我们是否与pacman发生冲突然后执行某些操作。

当发现两个实体发生碰撞时,会调用此方法。希望这可以帮助。