0

所以我在 Xcode 3.2.4 中使用 cocos2d 编写游戏,并创建了一个名为 player 的类。到目前为止,它只有一个什么都不做的功能。

#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 初始化为另一个类中的实例 Player * thePlayer = [[Player alloc]init];

请帮忙!谢谢!!

4

2 回答 2

3

这会导致问题:

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

你在做什么?您初始化新创建的(调用alloc/init创建它的调用者) Player对象。该init方法甚至可能返回了另一个实例,而不是当前正在执行的实例(一些奇怪的独特可可事物)。当这成功时,您创建一个新CCSprite对象并将其分配给self. Self然后返回给调用者。(如果你不会 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 回答