我正在OOP中编写2D物理引擎。我想知道如何为空间中的物理对象创建一种“onTouchStart”或“onTouchEnd”事件系统?

是的,我知道有Box2D和其他产品,但是我想在内部做一些事情,因为游戏将执行非常基本的碰撞检查。另外,我认为这是学习新知识的一种方式。

无论如何,我有此代码...。

void phPhysics::step(float delta)
{
    int objectCount = m_objects.size();

    for (int i = 0; i < objectCount; ++i)
    {
        phPhysicsObject* obj = m_objects.at(i);

        /* Update positon of the object. */
        obj->update(delta);

        if(!obj->isSleep())
            checkForCollisions(obj);
    }
}

void phPhysics::checkForCollisions(phPhysicsObject* object)
{
    int objectCount = m_objects.size();

    for (int i = 0; i < objectCount; ++i)
    {
        phPhysicsObject* obj = m_objects.at(i);

        if(object == obj)
            continue;

        if(isColliding(object, obj))
            obj->onTouchStart(object);
    }
}

如您所见,我有onTouchStart事件,但这当然会在“onTouchStart”上连续触发。我如何让它仅在碰撞时触发“一次”,而在触碰结束时一次触发?我曾想过要做一系列相互接触的对象,但是我不知道这样是否行得通。

最佳答案

我认为效果很好。在phPhysicsObject中,您可以有一个对象的array(或者如果有一个,则为它们的id,以节省内存),然后每次调用onTouchStart时,您都可以检查对象是否已在其中,如果没有,则有一个新对象碰撞。如果是,则停止,因为已经为该对象调用了该函数。然后onTouchEnd将对象从数组中删除。

关于c++ - 为物理引擎编写 'ON'事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36236990/

10-08 22:26