0

我正在使用 cocos2d 创建一个程序,其中我有 2 个 ccMenuItems 每个链接到一个图像:在这种情况下,一个是左箭头,另一个是右箭头。我的视图中心还有一个图像,它将根据按下的箭头旋转。

当我将手指放在左侧或右侧的两个菜单项之一上时,只要我的手指放在按钮上,我就希望中心图像旋转。那是我迷路的地方。我尝试使用以下代码:

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {

    CGPoint p = [touch locationInView:[touch view]];

    if (CGRectContainsPoint(leftArrow, p) || CGRectContainsPoint(rightArrow, p)) {
        return YES;
    }
    return NO;
}

- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event {

    CGPoint p = [touch locationInView:[touch view]];

    if (CGRectContainsPoint(leftArrow, p)) {
        [gun runAction:[CCRepeatForever actionWithAction:[CCRotateTo actionWithDuration:0.2 angle:180]]];
    }
    if (CGRectContainsPoint(rightArrow, p)) {
        [gun runAction:[CCRepeatForever actionWithAction:[CCRotateTo actionWithDuration:0.2 angle:0]]];

    }

}

使用此代码,当我按下两个菜单项之一时,甚至不会调用 ccTouchBegan 方法。仅当我触摸其他地方时才调用该方法。

按住 ccMenuItem 时如何处理连续动作。

感谢您的帮助!

4

3 回答 3

2

您必须继承 CCMenuItem 才能获得此类行为:

////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////

@interface RepeatMenuItem : CCMenuItemSprite 
{
    CGFloat speed;
}

@end

和实施:

////////////////////////////////////////////////////////////////////
// RepeatMenuItem
////////////////////////////////////////////////////////////////////
#pragma mark -
#pragma mark RepeatMenuItem

@implementation RepeatMenuItem


-(void) selected
{
    [super selected];
    block_(self);
    speed = 0.8;
    [self schedule:@selector(repeatEvent:) interval:speed];
}


-(void) unselected
{
    [self unschedule:@selector(repeatEvent:)];
    [super unselected];
}


-(void) activate
{
}


-(void) repeatEvent:(id)sender
{
    CGFloat minSpeed = 0.05;

    if (speed > minSpeed)
        speed = speed/3;
    if (speed < minSpeed)
        speed = minSpeed;

    [self unschedule:@selector(repeatEvent:)];
    block_(self);
    [self schedule:@selector(repeatEvent:) interval:speed];
}

@end
于 2012-10-27T20:36:06.153 回答
1

据我了解,您发布的两种方法在您的 CCLayer 的子类中。

首先,如果你想自己处理触摸,你必须删除菜单项。CCMenu 有更多的触摸优先级,如果它处理触摸击中任何菜单项,它会吞下它。这就是为什么只有当触摸在菜单项之外时才会收到触摸。

第二个,什么是leftArrowrightArrow?你的箭头的矩形?

至于我,在这种情况下,我可以建议您运行更新方法并rotation在每次滴答时更改其中的中心图像的属性。我的意思是,如果没有一个箭头被触摸,旋转值将为 0,并且由于您触摸的箭头而具有正值或负值。

于 2012-10-27T20:34:14.407 回答
0

您可以扩展用于这些菜单项的 CCMenuItemWhatever 类,并覆盖“selected”和“unselected”方法。菜单抓取触摸(即 IT 在其自己的 ccTouchBegan 函数上回答“是”,因此触摸调度程序不会将其传播给您)。

-(void) selected{
    [super selected];
    // start your animation here
}

-(void) unselected {
    [super unselected];
    // stop your animation here.
}
于 2012-10-27T20:34:48.993 回答