0

私は cocos2D の本を読んでいて、Radar Dish オブジェクトを初期化しようとしています。アニメーションは initAnimations メソッド (init メソッドで呼び出される) で設定されますが、init メソッドは呼び出されません。GameLayer.m では、以下を呼び出す createObjectOfType メソッドを使用します。

RadarDish *radarDish = [[RadarDish alloc] initWithSpriteFrameName:@"radar_1.png"];

したがって、initWithSpriteFrameName は RadarDish のスーパー クラスの init であり、Radar Dish をセットアップします。では、RadarDish.m の init はいつ呼び出されるのでしょうか?? アニメーションが初期化で設定されないため、プログラムがクラッシュします。

4

1 に答える 1

3

独自の初期化手順が必要なinitWithSpriteFrameName:を含むすべてのサブクラスでオーバーライドする必要があります。そのメソッドでは、次のように、スーパークラスの指定されRadarDishた初期化子を呼び出してから、サブクラスの特定のニーズを続行する必要があります。

- (id)initWithSpritFrameName: (NSString *)frameName
{
    self = [super initWithSpriteFrameName:frameName];
    if( !self ) return nil;

    [self initAnimations];    // As long as initAnimations doesn't also call a
                              // superclass's initializer!
    // Other setup...

    return self;
}

[[RadarDish alloc] initWithSpriteFrameName:...]この実装を使用して、アニメーションがオブジェクトに設定されていることを確認します。

の名前も変更する必要がありますinitAnimations。これは、Cocoa の規則では、実際のインスタンス初期化子 (「生の」インスタンスを取り、インスタンスを完全に準備するメソッド) のみが . で始まる必要があるためinitです。それを呼び出すsetUpAnimationsか、そのようなもの。

于 2013-02-06T19:48:57.423 に答える