0

我目前正在编写一个安卓游戏,并且正在处理快速碰撞检测。我想出了一个解决方案,但我想知道最喜欢的方法。

我的解决方案:如果我们有一个每帧移动 30 个单位的游戏对象,我们可能会直接穿过另一个游戏对象。因此,当我更新时,我将游戏对象迭代 1 个单位并运行碰撞检测,直到达到我想要的速度,然后进行渲染。

这是一个游戏对象,用于检查玩家的激光或玩家本身是否与它发生碰撞。

public void update(PlayerDroid[] holderPlayerDroid) {
            // Update the location
            //y = y + velocity;
            //stupidBadDroidPositionShape.setLocation(this.x, this.y);

            // Updates regarding interactions with the enemy out of the StupidBadDroids perspective, which is the PlayeDroid
            for(int numberOfPlayerDroid = 0; numberOfPlayerDroid < holderPlayerDroid.length; numberOfPlayerDroid++) {
                // Check if the StupidBadDroid got hit
                for(int iterations = 0; iterations < velocity; iterations++) {
                    y = y + 1;
                    stupidBadDroidPositionShape.setLocation(this.x, this.y);
                    // Check if StupidBadDroid collides with the enemy (which is the player)
                    if(Physics.shapeInShape(holderPlayerDroid[numberOfPlayerDroid].getPlayerPositionShape(), getPlayerPositionShape())) {
                        isDead = true;
                    }
                    for(int i = 0; i < holderPlayerDroid[numberOfPlayerDroid].amountOfVisibleLasers; i++) {
                        if(holderPlayerDroid[numberOfPlayerDroid].holderLaser[i].isDisposed() == false) {
                            if(Physics.shapeInShape(holderPlayerDroid[numberOfPlayerDroid].holderLaser[i].getLaserPositionShape(), getPlayerPositionShape())) {
                                isDead = true;
                                holderPlayerDroid[numberOfPlayerDroid].holderLaser[i].dispose();
                            }
                        }

                    }
                }



            }

    }

这种方式对 CPU 要求很高。你相信我可以应用更好的解决方案吗?

4

1 回答 1

1

您正在描述隧道,并正在尝试进行连续的碰撞检测。您的方法是 CPU 密集型的,因为您正试图暴力破解解决方案。

您想要的保真度越高,解决方案的技术含量就越高。如果您不需要太多保真度,您可以假设对象在每一帧中的路径是线性的,并“扩展”您的命中框以覆盖对象在帧期间移动的整个距离。因此,例如,您可以简单地将这些点扩展为一条线段,然后查看它们是否相交,而不是一次将每个点移动一个离散距离。但是,您的 hitboxes 不会是点,因此只需按路径长度“拉伸”它们。这是一个非常低保真度的解决方案 - 如果同一对象发生多次碰撞,您不会总是选择“首先”发生的碰撞。

对于非常复杂的解决方案,请尝试 -

http://www.bulletphysics.org/mediawiki-1.5.8/index.php/Collision_Detection_and_Physics_FAQ

于 2013-09-04T12:54:51.003 回答