cocos2d继承CCSprite,无法访问方法

时间:2012-05-18 08:51:05

标签: cocos2d-iphone ccsprite

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

我得到的错误是:

- [CCSprite Jump ::]:无法识别的选择器发送到实例0xf4611a0 2012-05-18 10:20:40.870 bitman [1732:10a03] * 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [CCSprite Jump ::]:发送到实例的无法识别的选择器0xf4611a0'

有人能指出我正确的方向吗?为什么错误说[CCSprite Jump ::]而不是[Dude Jump ::]?我错过了什么?

我有一个图层设置如下(仅相关代码):

#import "GameplayLayer.h"
#import "Dude.h"

@implementation GameplayLayer

+(CCScene *) scene
{
    // 'scene' is an autorelease object.
    CCScene *scene = [CCScene node];

    // 'layer' is an autorelease object.
    GameplayLayer *layer = [GameplayLayer node];

    // add layer as a child to scene
    [scene addChild: layer];

    // return the scene
    return scene;
}

-(id)init{
    self=[super init];
    if(self!=nil){
        dude=[[Dude alloc]init] ;
        dude.position=ccp(screenSize.width/2,screenSize.height/2);
        [self addChild:dude];

        fJumpHight=screenSize.height/3;
        fJumpTime=.2f;
    }
    return self;
}

-(void) registerWithTouchDispatcher
{ 
    [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority: swallowsTouches:YES];
}

-(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{
    [dude Jump:40:3];
    return YES;
}

@end

我按照以下方式设置了Dude类: Dude.h:

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

@interface Dude : CCSprite

    -(void) Jump:(float)fHight:(float)fTime;

@end

Dude.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

1 个答案:

答案 0 :(得分:0)

您的主要错误在Dude

的实施范围内
self=[[CCSprite spriteWithFile:@"something.png"]retain];

首先,您正确地将self = [super init]留下self作为Dude,但通过用self覆盖[CCSprite spriteWithFile:...],您将其更改为默认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中,方法通常是小写的,并且往往会为您提供有关参数的更多信息。 因此,您可以考虑将Jump::重命名为

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

这是因为你代码比你更频繁;)