Iphone 连续触摸物品

Iphone 连续触摸物品,iphone,objective-c,ios,cocos2d-iphone,Iphone,Objective C,Ios,Cocos2d Iphone,我正在用cocos2d创建一个程序,其中我有两个项目,每个项目都链接到一个图像:在本例中,一个是左箭头,另一个是右箭头。我的视图中心还有一个图像,它将根据按下的箭头旋转 当我将手指放在两个菜单项中的一个上(左或右)时,只要手指在按钮上,我就希望中心图像旋转。那就是我迷路的地方。我尝试使用以下代码: - (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event { CGPoint p = [touch locationI

我正在用cocos2d创建一个程序,其中我有两个项目,每个项目都链接到一个图像:在本例中,一个是左箭头,另一个是右箭头。我的视图中心还有一个图像,它将根据按下的箭头旋转

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

- (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]]];

    }

}
使用这段代码,当我按下两个菜单项中的一个时,甚至没有调用cctouchStart方法。该方法仅在我接触其他位置时调用

按住CCmenu项时,如何处理连续动作


谢谢你的帮助

据我所知,您发布的两个方法都在您的CCLayer的子类中

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

第二个,什么是
leftArrow
rightArrow
?你的箭的矩形


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

据我所知,您发布的两个方法都在您的CCLayer的子类中

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

第二个,什么是
leftArrow
rightArrow
?你的箭的矩形


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

您可以扩展用于这些菜单项的CCmenuItem类,并覆盖“selected”和“unselected”方法。菜单会抓取触摸(即它自己的CCTouchBegined功能会回答YES,因此触摸调度器不会将其传播给您)


您可以扩展ccmenuitem,不管您对这些菜单项使用什么类,并覆盖“selected”和“unselected”方法。菜单会抓取触摸(即它自己的CCTouchBegined功能会回答YES,因此触摸调度器不会将其传播给您)


您必须将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
////////////////////////////////////////////////////////////////////
//重复菜单项
////////////////////////////////////////////////////////////////////
#布拉格标记-
#pragma-mark-RepeatMenuItem
@实现RepeatMenuItem
-(作废)已选定
{
[超级精选];
块(自身);
速度=0.8;
[自调度:@选择器(repeatEvent:)间隔:速度];
}
-(无效)未选中
{
[自我计划外:@selector(repeatEvent:)];
[超级未选择];
}
-(无效)激活
{
}
-(无效)repeatEvent:(id)发件人
{
CGFloat minSpeed=0.05;
如果(速度>分钟速度)
速度=速度/3;
如果(速度<分钟速度)
速度=分钟速度;
[自我计划外:@selector(repeatEvent:)];
块(自身);
[自调度:@选择器(repeatEvent:)间隔:速度];
}
@结束

您必须将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
////////////////////////////////////////////////////////////////////
//重复菜单项
////////////////////////////////////////////////////////////////////
#布拉格标记-
#pragma-mark-RepeatMenuItem
@实现RepeatMenuItem
-(作废)已选定
{
[超级精选];
块(自身);
速度=0.8;
[自调度:@选择器(repeatEvent:)间隔:速度];
}
-(无效)未选中
{
[自我计划外:@selector(repeatEvent:)];
[超级未选择];
}
-(无效)激活
{
}
-(无效)repeatEvent:(id)发件人
{
CGFloat minSpeed=0.05;
如果(速度>分钟速度)
速度=速度/3;
如果(速度<分钟速度)
速度=分钟速度;
[自我计划外:@selector(repeatEvent:)];
块(自身);
[自调度:@选择器(repeatEvent:)间隔:速度];
}
@结束

子类化CCMenuItem不是一个好的解决方案,因为它允许简单的按钮了解速度,而按钮不需要这样做。速度只是重复间隔。用于重复事件频率,如键盘上的键。无论如何,主题主持人应该改变一些东西来使用它。子类化CCMenuItem不是一个好的解决方案,因为它允许简单的按钮了解速度,而这对按钮来说是不需要的。速度只是重复间隔。用于重复事件频率,如键盘上的键。无论如何,主题施法者应该改变一些东西来使用它。是的,leftArrow和rightArrow是我的箭头图像的矩形。如果我不能使用ccmen,我应该使用什么?精灵?现在你根本不用用任何东西。您有两个矩形和层用于处理触摸。在这种情况下,您只需要两个箭头精灵来标记触摸的位置。是的,leftArrow和rightArrow是我的箭头图像的矩形。如果我不能使用ccmen,我应该使用什么?精灵?现在你根本不用用任何东西。您有两个矩形和层用于处理触摸。在这种情况下,您只需要两个箭头精灵来标记触摸的位置。