按住MenuItem按钮时如何重复动作? (cocos2d的)

时间:2011-07-27 18:31:29

标签: iphone ios cocos2d-iphone

按住MenuItem按钮时如何重复操作? 我试图在CCMenuItemImage上创建一个子类并生成

@implementation CCMenuItemSpriteHoldable

@synthesize buttonHeld;

-(void) selected
{
[super selected];
buttonHeld = true;
}
-(void) unselected
{
[super unselected];
buttonHeld = false;
}

@end

并将其放在我的init

CCMenuItem *upButtonItem = [CCMenuItemSpriteHoldable
                            itemFromNormalImage:@"up.png" selectedImage:@"upsel.png"
                            target:self selector:@selector(upButtonTapped:)];

但它什么也没做...... :( 它只是在我释放按钮时加载(void)upButtonTapped。 有没有办法制作一个允许你按住的按钮?

谢谢

2 个答案:

答案 0 :(得分:2)

你必须在CCLayer中添加一个CCSprite,当用户点击你的CCSprite(使用[yourSprite boundingBox])并开始按下选择器时,实现CCLayer touch(开始,移动,结束)catch:当用户触摸开始时按钮CCSprite和取消预定选择器触摸结束!

N.B。取消预定按下:选择器如果触摸移动触摸退出按钮CCSprite边界框

答案 1 :(得分:0)

我只能回答Cocos2dX,但它应该是相同的机制。实现这个功能有点笨拙,所以我建议你继续使用Sprite子类化并添加一个CCLayerTouch。

但是如果你想使用CCMenuItem,我可以告诉你应该从哪里开始寻找。 每次用户触摸CCMenuItem-(节点)时,该班级都会检查哪些孩子被触摸并将这些孩子设置为已选中。当您松开手指时,它会将其设置为未选中并触发您指定给它的选择器(动作)。这是一次性行动。

现在有两种方式:

  1. 为了让它一直激活,你需要子类化CCMenuItem并覆盖四个触控回调(不调用super)。在touchbegan中,您将精灵注册为触摸,并在取消注册时注册。你的类还需要一个update()方法,它将在你的runloop中的每一帧被调用。在此update()方法中,您将测试是否触摸了精灵,如果是,则触发。这是一种较少采用cocos风格的方法。

  2. 如上所述。注册调度程序,并在触摸结束时取消注册。

  3. 触摸移动方法在这种情况下没有做任何事情。 touchCancelled方法的行为类似于touchEnded。