带有Objective-C的子类Cocos2D MenuItem

时间:2010-07-07 07:04:30

标签: cocos2d-iphone subclass menuitem

我在我的小项目中使用CCMenu,其中有三个按钮。如果他们检测到触摸,我需要这些按钮来保持触发,因为这不是正常行为,我决定继承CCMenuItem并覆盖几种方法。

我想覆盖的两种方法是:

-(void) selected
{
    // subclass to change the default action
    if(isEnabled_) { 
        [super selected];
        [self stopActionByTag:kZoomActionTag];
        originalScale_ = self.scale;
        CCAction *zoomAction = [CCScaleTo actionWithDuration:0.1f scale:originalScale_ * 1.2f];
        zoomAction.tag = kZoomActionTag;
        [self runAction:zoomAction];
    }
}

-(void) unselected
{
    // subclass to change the default action
    if(isEnabled_) {
        [super unselected];
        [self stopActionByTag:kZoomActionTag];
        CCAction *zoomAction = [CCScaleTo actionWithDuration:0.1f scale:originalScale_];
        zoomAction.tag = kZoomActionTag;
        [self runAction:zoomAction];
    }
}

所以在我的子类中,我只是简单地复制这些,但用新功能替换里面的代码。为了简单起见,我们会说:

-(void) selected
{
    //turn a sprite around
    mySprite.rotation = 0;
}

-(void) unselected
{
    //turn a sprite around
    mySprite.rotation = 180;
}

现在,mySprite将在主体代码的标题中声明,并将其导入此子类。

问题是mySprite无法看到,它出现undeclared错误。我应该使用mySprite代替[super selected]吗?我试过这个,我得到完全相同的错误。

感谢。

1 个答案:

答案 0 :(得分:1)

首先,是的,您应该使用[超级选择],如果您希望它执行菜单项的默认行为,而不是仅仅复制超类的功能的内容。对于您复制的CCMenuItemLabel,调用[super selected]将允许标签对其选择时的视觉效果“做其事”。这使您可以专注于您想要做的事情。

至于为什么你的精灵无法看到,以及“未声明”错误可能是什么,很难说没有看到代码。一个问题可能是你说你是CCMenuItem的子类,但是粘贴在CCMenuItemLabel代码中。

您是否尝试过直接在按钮精灵上观看ccTouchesBegan和ccTouchesEnded?可能比试图迫使CCMenuItem做一些它并不是真正设计的事情更直接......

如果做不到这一点,请查看“虚拟游戏杆”,你应该得到一些很好的示例代码。 Cocos2d论坛至少有两个主题:Thread 1 Thread 2