0

だから私はcocos2dを使ってXcode3.2.4でゲームをプログラミングしていて、playerという名前のクラスを作りました。今のところ、それは何もしない1つの機能しか持っていません。

#import <Foundation/Foundation.h>
#import "cocos2d.h"

@interface Player : CCSprite {

}

-(void)leftButtonPressed;

@end 



#import "Player.h"


@implementation Player

- (id)init{
    if((self=[super init])){
        self = [CCSprite spriteWithFile:@"playerPlane.png"];
        }
    return self;
}

-(void)leftButtonPressed{
}

@end `

どこからでもleftButtonPressedを呼び出そうとすると、コンソールでアプリ全体がクラッシュします

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CCSprite leftButtonPressed]: unrecognized selector sent to instance 0x6e4bb50'

プレーヤーを別のクラスのインスタンスとして初期化するには、 Player * thePlayer = [[Player alloc]init];

助けてください!ありがとう!!

4

2 に答える 2

3

これにより問題が発生します。

- (id)init{
    if((self=[super init])){
        self = [CCSprite spriteWithFile:@"playerPlane.png"];
        }
    return self;
}

何してるの?alloc新しく作成された(それを呼び出す/作成した呼び出し元initPlayerオブジェクトを初期化します。このinitメソッドは、現在実行中のインスタンスとは別のインスタンスを返した可能性もあります(奇妙なユニークなカカオのもの)。そして、それが成功したら、新しいCCSpriteオブジェクトを作成してに割り当てますselfSelfその後、発信者に返されます。(もしあなたがARCをしないなら-私はあなたがそうすると思います-そしてこれは確かにメモリリークを引き起こすでしょう);

ただし、呼び出し元はオブジェクトを処理することを期待しておりPlayer、後で応答できないleftButtonPressedメッセージをオブジェクトに送信します。CCSprite

つまり、エラーメッセージからわかることです。

代わりに使用できます:

- (id)initSpriteWithFile(NSString*)fileName{
    if((self=[super initSpriteWithFile:fileName])){
        // Do any additional setup here. If you don't have any setup then do not overwrit the init method at all. 
        }
    return self;
}

または次のようなもの:

- (id)init{
    if((self=[super init])){
        [self setFileName:@"playerPlane.png"]; //This method may not exist at all but you may find an appropriate one in the docs. I am not used to CCSprit. I am just trying to explain the concept by example. 
        }
    return self;
}
于 2013-01-12T20:39:23.137 に答える
0

呼び出していますself = [CCSprite spriteWithFile:@"playerPlane.png"];が、これによりCCSpriteインスタンスではなくインスタンスが作成されPlayerます。

CCSpriteのソースがないか、工場ベースではない初期化子がないのではないかと思います。

この場合、サブクラス化するよりもクラス拡張を作成する方がよいでしょう。

于 2013-01-12T20:29:48.317 に答える