首先,我使用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):
在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()
{
}