我正在用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时使用连续操作。
感谢您的帮助!
答案 0 :(得分: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
答案 1 :(得分:1)
据我了解,您发布的两种方法都在CCLayer的子类中。
首先,如果您想自己处理触摸,则必须删除菜单项。 CCMenu具有更多的触摸优先级,如果它处理触摸击中任何菜单项,它将吞下它。这就是为什么只有当触摸在菜单项外时才接受触摸。
第二个,leftArrow
和rightArrow
是什么?箭的矩形?
至于我,在这种情况下,我建议你运行更新方法,并在每个刻度上更改中心图像的rotation
属性。我的意思是,如果没有触摸任何一个箭头,旋转值将为0,并且由于您触摸的箭头将具有正值或负值。
答案 2 :(得分:0)
您可以为这些菜单项扩展CCMenuItemWhatever类,并覆盖“selected”和“unselected”方法。菜单抓取触摸(即IT在其自己的ccTouchBegan函数上回答YES,因此触摸调度程序不会将其传播给您)。
-(void) selected{
[super selected];
// start your animation here
}
-(void) unselected {
[super unselected];
// stop your animation here.
}