所以我使用cocos2d在Xcode 3.2.4中编写游戏,然后我创建了一个名为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];
请帮忙!谢谢!
答案 0 :(得分: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;
}
答案 1 :(得分:0)
您正在呼叫self = [CCSprite spriteWithFile:@"playerPlane.png"];
,但这会创建CCSprite
个实例而不是Player
个实例。
我猜你没有CCSprite的来源,或者没有非工厂的初始化程序?
在这种情况下,您最好创建一个类扩展而不是子类化。