类初始化有问题吗?

时间:2012-02-09 08:20:12

标签: iphone cocos2d-iphone

我有一个“Hero”类,子类来自CCSpriteBatchNode(cocos2d):

@interface Hero : CCSpriteBatchNode {...}

我正在这样做:

Hero *hero;
...
hero = [[Hero alloc] initWithWorld:world];

这是Hero的初始化方法:

-(id) initWithWorld:(b2World*)world
{
    if (self = [super init])
    {
        ...
    }
    return self;
}

直到这一刻一切正常:我可以将hero作为孩子添加到我的图层,它将正确显示。但是,我正试图从hero获取一些数据。我在Hero类中有这个方法:

-(b2Body*) getBody; //in Hero.h

-(b2Body*) getBody  //in Hero.mm
{
    return selfBody;
}

我的应用程序在调用[hero getBody];后发生错误:

  

* 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [CCSpriteBatchNode getBody]:   无法识别的选择器发送到实例0x42bde0'

所以,他试图在getBody类中找到方法CCSpriteBatchNode。在他看来,他无法找到它。但为什么他试图在那里找到它?为什么不在Hero课程? 附:我的所有课程都是*.mm。我需要它来支持box2d。

修改

我在启动和调用hero之间使用getBody的时间是将其添加到CCLayer

[self addChild:hero z:0 tag:kTagParentNode]; //self - CCLayer subclass
getBody方法调用

tick

[self schedule:@selector(tick:)];

...

-(void)tick:(float)dt 
{
    CGPoint scaledVelocity = ccpMult(leftJoystick.velocity, 480.0f);
    if (scaledVelocity.y > CGPointZero.y)
    {

        [objectControls jump:[hero getBody]];

    }
    if (scaledVelocity.x > CGPointZero.x) 
    {
    }
}

1 个答案:

答案 0 :(得分:2)

虽然在没有看到太多代码的情况下很难分辨出导致问题的原因,但我建议您重新考虑您的架构。

CCSpriteBatchNode是cocos2d引擎用于渲染批处理精灵的对象。你的Hero真的是这样的对象吗?我不这么认为。英雄应该是一个独立的类,与has oneCCSpriteBatchNodeb2Body的关系。

为什么呢?有几个原因。首先,它将你的Hero实现与cocos2d强加的接口分离。如果cocos2d的创建者决定更改某些实现细节,那么如果它继承自CCNode,那么您的类可能不再有效。还要考虑封装:视觉组件是否真的必须了解播放器逻辑?

如果你拆分你的架构,你将使你的代码更易读,更容易维护,并且如果将要发生的话,也更容易移植到另一个平台。有关类似帖子,请参阅this question on gamedev.SE.