Ipad 触摸检测的问题
我正在学习Cocos2d和Objective-C,我在触摸检测方面遇到了一些问题 我在HelloWorldLayer中有几个精灵和一些DragableSprites NSMutableArray。两个可拖动精灵一个接一个地放置,底部的一个更大 然后我有一些代码可以让一个被触摸的精灵震动:Ipad 触摸检测的问题,ipad,cocos2d-iphone,touch,Ipad,Cocos2d Iphone,Touch,我正在学习Cocos2d和Objective-C,我在触摸检测方面遇到了一些问题 我在HelloWorldLayer中有几个精灵和一些DragableSprites NSMutableArray。两个可拖动精灵一个接一个地放置,底部的一个更大 然后我有一些代码可以让一个被触摸的精灵震动: - (void)selectSpriteForTouch:(CGPoint)touchLocation { CCSprite *touchSprite = nil; for (CCSprite
- (void)selectSpriteForTouch:(CGPoint)touchLocation {
CCSprite *touchSprite = nil;
for (CCSprite *sprite in dragableSprites) {
if (CGRectContainsPoint(sprite.boundingBox, touchLocation)) {
touchSprite = sprite;
break;
}
}
if (touchSprite != selSprite) {
[selSprite stopAllActions];
[selSprite runAction:[CCRotateTo actionWithDuration:0.1 angle:0]];
CCRotateTo * rotLeft = [CCRotateBy actionWithDuration:0.1 angle:-1.0];
CCRotateTo * rotCenter = [CCRotateBy actionWithDuration:0.1 angle:0.0];
CCRotateTo * rotRight = [CCRotateBy actionWithDuration:0.1 angle:1.0];
CCSequence * rotSeq = [CCSequence actions:rotLeft, rotCenter, rotRight, rotCenter, nil];
[touchSprite runAction:[CCRepeatForever actionWithAction:rotSeq]];
selSprite = touchSprite;
}
}
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint touchLocation = [self convertTouchToNodeSpace:touch];
[self selectSpriteForTouch:touchLocation];
return TRUE;
}
但当我触摸顶部或底部精灵时,只有底部精灵在晃动,这是在init中首先添加的
我想我需要替换代码CGRectContainsPointsprite.boundingBox和touchLocation,但我不知道如何替换
我在论坛上花了好几个晚上,但我仍然不明白如何让顶级精灵摇动…尝试类似于此的注意事项它是cctouch开始不是cctouch开始: 由于您的break语句,在selectSpriteForTouch中设置for循环的方式将导致仅选择DragableSprites中的第一个对象。使用此新代码,其边界框包含触摸的每个精灵都将设置动画。代码可能并不完美,因为我直接在Chrome中输入了它,但你明白了 另一个需要注意的重要事项是,不能在两个不同的精灵上运行相同的操作,如下所示:
id action = [CCScaleTo actionWithDuration:1 scale:1.0];
[someSprite runAction:action];
[someOtherSprite runAction:action];
[oneMoreSprite runAction:action];
此代码将无法按预期工作;只有最后一个精灵OneMoreSpite将设置动画。要对多个精灵重复使用CC动画,请使用以下代码:
id action = [CCScaleTo actionWithDuration:1 scale:1.0];
[someSprite runAction:action];
[someOtherSprite runAction:[[action copy] autorelease]];
[oneMoreSprite runAction:[[action copy] autorelease]];
我们制作了一个动作的副本,这样它就可以被另一个精灵运行,而无需从原始精灵中移除。然后,我们自动释放它,这样就不会出现内存泄漏
id action = [CCScaleTo actionWithDuration:1 scale:1.0];
[someSprite runAction:action];
[someOtherSprite runAction:[[action copy] autorelease]];
[oneMoreSprite runAction:[[action copy] autorelease]];