Cocos2d iphone cocos 2d继承CCSprite,可以';t-acces法

Cocos2d iphone cocos 2d继承CCSprite,可以';t-acces法,cocos2d-iphone,ccsprite,Cocos2d Iphone,Ccsprite,可能是我遗漏了一些基本的东西。我创建了一个继承CCSprite的类,名为Dude。在我的图层中,我添加了对象dude,它工作正常:它显示在屏幕上。一切都很顺利,直到我触摸屏幕。不知怎的,我班上的“跳跃”方法,伙计,是达不到的 我得到的错误是: -[CCSprite跳转::]:无法识别的选择器已发送到实例0xF461A0 2012-05-18 10:20:40.870比特人[1732:10a03]*由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[

可能是我遗漏了一些基本的东西。我创建了一个继承CCSprite的类,名为Dude。在我的图层中,我添加了对象dude,它工作正常:它显示在屏幕上。一切都很顺利,直到我触摸屏幕。不知怎的,我班上的“跳跃”方法,伙计,是达不到的

我得到的错误是:

-[CCSprite跳转::]:无法识别的选择器已发送到实例0xF461A0 2012-05-18 10:20:40.870比特人[1732:10a03]*由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[CCSprite跳转::]:未识别的选择器发送到实例0xF461A0'

谁能给我指出正确的方向吗?为什么错误显示为[CCSprite Jump::],而不是[Dude Jump::]?我错过了什么

我的图层设置如下(仅相关代码):

我按照如下方式设置了类Dude: 杜德.h:

#导入“CCSprite.h”
#进口
#导入“cocos2d.h”
@界面花花公子:CCSprite
-(void)Jump:(float)fHight:(float)fTime;
@结束
杜德。m:

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

@implementation Dude
-(id)init{
    self=[super init];
    if(self!=nil){

        CGSize screenSize =[CCDirector sharedDirector].winSize;
        self=[[CCSprite spriteWithFile:@"something.png"]retain];
        self.position=ccp(screenSize.width/2,screenSize.height*0.333f);

    }
    return self;
}

-(void) Jump:(float)fHight:(float)fTime{
    NSLog(@"JUMP!");
    //Jump actions    
}
@end
#导入“Dude.h”
#进口
#导入“cocos2d.h”
@执行花花公子
-(id)init{
self=[super init];
if(self!=nil){
CGSize screenSize=[CCDirector sharedDirector].winSize;
self=[[CCSprite spriteWithFile:@“something.png”]retain];
自身位置=ccp(屏幕尺寸.宽度/2,屏幕尺寸.高度*0.333f);
}
回归自我;
}
-跳转:(浮动)右:(浮动)fTime{
NSLog(@“跳跃!”);
//跳跃动作
}
@结束

您的主要错误在
Dude
的实现中

self=[[CCSprite spriteWithFile:@"something.png"]retain];
首先,您可以正确地将
self=[super init]
指定为
Dude
,但通过使用
[CCSprite spriteWithFile:…]覆盖
self
可以将其更改为默认值
CCSprite

您可以改为使用
self=[super initWithFile:@“something.png”]
。像这样:

-(id)init {
  self = [super initWithFile:@"something.png"];
  if (self == nil) return nil;

  CGSize screenSize =[CCDirector sharedDirector].winSize;
  self.position = ccp(screenSize.width / 2.0, screenSize.height / 3.0);

  return self;
}
另一条建议:在objc中,方法通常是小写的,并且倾向于为您提供有关参数的更多信息。 因此,您可以考虑重命名<代码>跳转::<代码>至

-(void)jumpWithHeight:(float)height duration:(ccTime)duration {
  ...
}

这是因为您阅读代码的频率高于编写代码的频率;)

谢谢!这看起来合乎逻辑…但是,它会导致无限循环。。。。当我把一个NSLog放在self=[super initWi…]的正上方时,它会永远重复…嗯,这很奇怪。CCSprite的实现看起来只有
[super initXYZ]
方法被调用,因此不应该发生递归。您确定没有意外调用
self=[self initWithFile:…]
?是的,我确定。我把我的代码降到了最低限度,我会发布它。。。一定有一些递归,但似乎没有意义……我发现了一个类似的问题和解决方案:[link]对于用super替换CCSprite的部分,Tharabas的答案是正确的。谢谢
-(id)init {
  self = [super initWithFile:@"something.png"];
  if (self == nil) return nil;

  CGSize screenSize =[CCDirector sharedDirector].winSize;
  self.position = ccp(screenSize.width / 2.0, screenSize.height / 3.0);

  return self;
}
-(void)jumpWithHeight:(float)height duration:(ccTime)duration {
  ...
}