当前位置:  开发笔记 > 编程语言 > 正文

Java中两个图像之间的碰撞检测

如何解决《Java中两个图像之间的碰撞检测》经验,为你挑选了2个好方法。

我在写作的游戏中显示了两个角色,即玩家和敌人.定义如下:

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);

我可以用键盘移动播放器(),但在尝试检测两者之间的碰撞时我感到很茫然.很多人都说使用矩形,但作为一个初学者,我看不出如何将它链接到我现有的代码中.谁能为我提供一些建议?



1> FlySwat..:

我认为你的问题是你没有为你的玩家和敌人使用优秀的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,Width和Height变量.

你的敌人也应该如此.

在你的游戏循环中,做这样的事情(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> Aaron Digull..:

首先,使用Jonathan Holland所描述的边界框来查找是否有碰撞.

从(多色)精灵,创建黑色和白色版本.如果你的精灵是透明的,你可能已经有了这些(即有些地方在边界框内,但你仍然可以看到背景).这些是"面具".

使用Image.getRGB()蒙版来获取像素.对于每个不透明的像素,在整数数组(playerArrayenemyArray以下)中设置一个位.该数组的大小是height如果width <= 32像素,(width+31)/32*height否则.以下代码适用于width <= 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!
    }

}

链接:JGame,小型Java游戏框架

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有