我有一个“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)
{
}
}
答案 0 :(得分:2)
虽然在没有看到太多代码的情况下很难分辨出导致问题的原因,但我建议您重新考虑您的架构。
CCSpriteBatchNode
是cocos2d引擎用于渲染批处理精灵的对象。你的Hero
真的是这样的对象吗?我不这么认为。英雄应该是一个独立的类,与has one
和CCSpriteBatchNode
有b2Body
的关系。
为什么呢?有几个原因。首先,它将你的Hero
实现与cocos2d强加的接口分离。如果cocos2d的创建者决定更改某些实现细节,那么如果它继承自CCNode
,那么您的类可能不再有效。还要考虑封装:视觉组件是否真的必须了解播放器逻辑?
如果你拆分你的架构,你将使你的代码更易读,更容易维护,并且如果将要发生的话,也更容易移植到另一个平台。有关类似帖子,请参阅this question on gamedev.SE.