如何插入绘制事件之间的冲突

时间:2015-01-03 02:18:08

标签: java algorithm collision-detection game-loop

最近,我一直在研究各种花哨的碰撞检测算法和二维应用程序的四叉树,并且我的应用程序处于我想要开始实现这些碰撞算法的地步。我的游戏循环能够计算我的帧的Δt,我想在绘制的帧之间执行'插值'碰撞检查(与'暴力'方法相反:尽可能快地绘制,导致性能和动画质量普遍下降)。

底线

实现“插值”碰撞检查的最有效方法是什么?此外,是否有任何碰撞算法可以简单地采用Δt和速度为我进行插值?


其他思考和信息

我在四叉树中的AABB之后使用每像素交叉点。图像本质上表示为矩形,我发现在计算符合定义的Alpha透明度阈值的图像像素周围的凸/凹多边形时效率太高,然后执行其他算法,如minkowski门户细化或递归圆。我选择每个像素,尽管速度效率低,因为图像的特定矩形约束形状(知道这一点,我通过用AABB碰撞检查包裹检查来减少每像素检查)。在未来,我可能会尝试重新优化/使用与AABB不同的方法,因为我的图像将以不同的角度旋转。

游戏循环代码:update()处理追赶操作。

currentUpdateTime = System.nanoTime();

    while(true) {
        beginLoopTime = System.nanoTime();

        drawPanel.repaint();

        lastUpdateTime = currentUpdateTime;
        currentUpdateTime = System.nanoTime();
        update((int) ((currentUpdateTime - lastUpdateTime)/( Math.pow(10,-9) )));//1000*1000

        endLoopTime = System.nanoTime();
        deltaLoop = endLoopTime - beginLoopTime;

        if(deltaLoop <= desiredDeltaLoop) {
           try {
           /*Refer to: 'http://stackoverflow.com/questions/1036754/difference-between-wait-and-sleep'
           on differences between Thread.sleep() and wait()*/
               wait((long) ((desiredDeltaLoop - deltaLoop)/( Math.pow(10,-6) )));
           } catch(InterruptedException e) {
               e.printStackTrace(System.out);
           }
        }
    }

1 个答案:

答案 0 :(得分:1)

我首先要说这可能不是最好的答案。这是一种我能想到的“蝙蝠”技术,而不是我所知道的在实践中使用的技术。话虽如此:

通过将您的空间视为3D空间(第三维度为时间),然后应用3D碰撞检查技术,可以实现使用随时间移动的窗格进行的2D碰撞检查。同时占据相同空间的面板将表示为相交的3D形状,交叉点将告诉您碰撞发生的时间。