Java中两个图像之间的冲突检测

2022-09-03 09:19:05

我在我正在写的游戏中展示了两个角色,玩家和敌人。定义如下:

public void player(Graphics g) {
    g.drawImage(plimg, x, y, this);
}

public void enemy(Graphics g) {
    g.drawImage(enemy, 200, 200, this);
}

然后调用:

player(g);
enemy(g);

我能够用键盘移动player(),但是当试图检测到两者之间的碰撞时,我不知所措。很多人都说过要使用矩形,但作为一个初学者,我看不出如何将它链接到我现有的代码中。任何人都可以为我提供一些建议吗?


答案 1

我认为你的问题是你没有为你的玩家和敌人使用好的OO设计。创建两个类:

public class Player
{
    int X;
    int Y;
    int Width;
    int Height;

    // Getters and Setters
}

public class Enemy
{
    int X;
    int Y;
    int Width;
    int Height;

    // Getters and Setters
}

播放机应具有 X、Y、宽度和高度变量。

你的敌人也应该如此。

在游戏循环中,执行如下操作 (C#):

foreach (Enemy e in EnemyCollection)
{
    Rectangle r = new Rectangle(e.X,e.Y,e.Width,e.Height);
    Rectangle p = new Rectangle(player.X,player.Y,player.Width,player.Height);

    // Assuming there is an intersect method, otherwise just handcompare the values
    if (r.Intersects(p))
    {
       // A Collision!
       // we know which enemy (e), so we can call e.DoCollision();
       e.DoCollision();
    }
}

为了加快速度,不要费心检查敌人坐标是否在屏幕外。


答案 2

首先,使用乔纳森·霍兰德(Jonathan Holland)描述的边界框来查找您是否可能发生碰撞。

从(多色)精灵中,创建黑白版本。如果您的子画面是透明的,您可能已经拥有了这些(即,有些地方位于边界框内,但您仍然可以看到背景)。这些是“面具”。

在蒙版上使用以获得像素。对于每个不透明的像素,在整数数组(及以下)中设置一个位。数组的大小为如果像素,否则。下面的代码适用于 。Image.getRGB()playerArrayenemyArrayheightwidth <= 32(width+31)/32*heightwidth <= 32

如果边界框发生冲突,请执行以下操作:

// Find the first line where the two sprites might overlap
int linePlayer, lineEnemy;
if (player.y <= enemy.y) {
    linePlayer = enemy.y - player.y;
    lineEnemy = 0;
} else {
    linePlayer = 0;
    lineEnemy = player.y - enemy.y;
}
int line = Math.max(linePlayer, lineEnemy);

// Get the shift between the two
x = player.x - enemy.x;
int maxLines = Math.max(player.height, enemy.height);
for ( line < maxLines; line ++) {
    // if width > 32, then you need a second loop here
    long playerMask = playerArray[linePlayer];
    long enemyMask = enemyArray[lineEnemy];
    // Reproduce the shift between the two sprites
    if (x < 0) playerMask << (-x);
    else enemyMask << x;
    // If the two masks have common bits, binary AND will return != 0
    if ((playerMask & enemyMask) != 0) {
        // Contact!
    }

}

链接: JGameFramework for Small Java Games


推荐