我在我的小项目中使用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]
吗?我试过这个,我得到完全相同的错误。
感谢。
答案 0 :(得分:1)
首先,是的,您应该使用[超级选择],如果您希望它执行菜单项的默认行为,而不是仅仅复制超类的功能的内容。对于您复制的CCMenuItemLabel,调用[super selected]将允许标签对其选择时的视觉效果“做其事”。这使您可以专注于您想要做的事情。
至于为什么你的精灵无法看到,以及“未声明”错误可能是什么,很难说没有看到代码。一个问题可能是你说你是CCMenuItem的子类,但是粘贴在CCMenuItemLabel代码中。
您是否尝试过直接在按钮精灵上观看ccTouchesBegan和ccTouchesEnded?可能比试图迫使CCMenuItem做一些它并不是真正设计的事情更直接......
如果做不到这一点,请查看“虚拟游戏杆”,你应该得到一些很好的示例代码。 Cocos2d论坛至少有两个主题:Thread 1 Thread 2