在Box2D GetUserData的结果上调用纯虚函数

时间:2014-03-21 22:15:38

标签: c++ cocos2d-x box2d game-physics

首先,我使用Cocos2d-x-2.1.5和Box2D 2.3.0(不太确定如何检查哪个,但在cocos'存储库中找到了信息)。

当我尝试从通过SetUserData方法分配给b2Body对象的对象调用纯虚函数时出现我的问题。

我安排了一个方法updateBodies来更新精灵,这些精灵是我游戏对象表示的一部分。

void GameplayLogicLayer::updateBodies(float pDeltaTime)
{
    mWorld->Step(pDeltaTime, 10, 10);

    for(b2Body* tBodies = mWorld->GetBodyList(); tBodies; tBodies = tBodies->GetNext()){
        A* tA = (static_cast<A*>(tBodies->GetUserData()));
        if(tA != NULL)
        {
            tA->callPureVirtualFunction();
            tA->callFunction();
        }
    }
}

程序在尝试执行callPureVirtualMethodFunction()时崩溃。

我的对象层次结构如下(A包含mBody,它是b2Body类型; B和C扩展A): Hierarchy

在B和C的构造函数中,我创建Box2D主体并通过以下方式将对象链接到b2Body:

mBody = pWorld.CreateBody(&tBodyDef);
mBody->SetUserData(this);

你知道在执行纯虚函数时它是如何崩溃的,但是当我从基类调用方法时效果很好吗?

编辑 - 响应LearnCocos2d用户。

这是A类内容。

#ifndef __A_H__
#define __A_H__

#include "cocos2d.h"
#include "Box2D/Box2D.h"

USING_NS_CC;

class A
{
public:
    virtual void callPureVirtualFunction() = 0;
    void callFunction();
protected:
    CCSprite* mSprite;
    b2Body* mBody;
    b2Fixture* mFixture;
};

#endif // __A_H__

和C类实现。 .h文件:

#ifndef __C_H__
#define __C_H__

#include "A.h"

class C : public A
{
public:
    C(CCLayer& pParent, b2World& pWorld, const char* pFileName, float pPositionX, float pPositionY, float pWidth, float pHeight);
    C();

    virtual void callPureVirtualFunction();
private:
    bool mWithSensor;
};

#endif // __C_H__

.cpp文件:

#include "C.h"
#include "../Utilities/Constants.h"

C::C(CCLayer& pParent, b2World& pWorld, const char* pFileName, float pPositionX, float pPositionY, float pWidth, float pHeight)
{
    mWithSensor = false;

    // GRAPHICS
    if(pFileName)
    {
        mSprite = CCSprite::create(pFileName);
        mSprite->setPosition(CCPointMake(pPositionX, pPositionY));
        pParent.addChild(mSprite);
    }

    b2BodyDef tBodyDef;
    tBodyDef.type = b2_kinematicBody;
    tBodyDef.position.Set( pPositionX / PIXELS_IN_METER, pPositionY / PIXELS_IN_METER );
//  tCollisionBoxBodyDef.userData = this;
    tBodyDef.userData = NULL;

    mBody = pWorld.CreateBody(&tBodyDef);
    mBody->SetGravityScale(0.f);
    mBody->SetUserData(this);

    b2PolygonShape tBodyShape;
    tBodyShape.SetAsBox(pWidth / 2.f / PIXELS_IN_METER, pHeight / 2.f / PIXELS_IN_METER);

    b2FixtureDef tBodyFixtureDef;
    tBodyFixtureDef.shape = &tBodyShape;
    tBodyFixtureDef.friction = 0.4f;
    tBodyFixtureDef.density = 10.0f;
    tBodyFixtureDef.restitution = 0.1f;

    mFixture = mBody->CreateFixture( &tBodyFixtureDef );
}

C::C()
{

}

/*virtual*/ void C::callPureVirtualFunction()
{  

}

0 个答案:

没有答案