Cocos 2d-iphone 3.0。我正在使用此代码来检测是否触摸了单个精灵
-(void) touchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint location = [touch locationInView: [touch view]];
CGPoint convertedlocation = [[CCDirector sharedDirector] convertToGL: location];
CGPoint convertedNodeSpacePoint = [self convertToNodeSpace:convertedlocation];
if (CGRectContainsPoint([_sprite boundingBox],convertedNodeSpacePoint))
{
// Remove sprite
}
我里面有一些代码应该从父级删除一些其他的精灵。逻辑上,_sprite
,应用程序将崩溃,因为其他精灵已被删除。
我试图使用_sprite
使_sprite.userInteractionEnabled = NO;
无法触及,但这没有效果。
userInteractionEnabled
究竟是什么意思,以及如何使用它来促进精灵上的触摸检测。
在我的场景中处理精灵的最佳触摸方式是什么?
答案 0 :(得分:2)
无法禁用ccsprite上的交互。你应该做的是:
bool firstTimeClicked=false;
-(void) touchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
if(firstTimeClicked==true)
{
return NO;
}
CGPoint location = [touch locationInView: [touch view]];
CGPoint convertedlocation = [[CCDirector sharedDirector] convertToGL: location];
CGPoint convertedNodeSpacePoint = [self convertToNodeSpace:convertedlocation];
if (CGRectContainsPoint([_sprite boundingBox],convertedNodeSpacePoint)) {
firstTimeClicked=true; }
}
答案 1 :(得分:0)
在精灵上设置userInteractionEnabled=YES
时,意味着将调用用户交互回调。
例如,在你的场景中,如果你有userInteractionEnabled=NO
你的-(void) touchBegan:(UITouch *)touch withEvent:(UIEvent *)event
就不会被调用。
您正在检测场景中的触摸。然后你我们正在检查那个触摸位置下面的东西,所以如果有什么东西在那里就会被检测到。
您希望在自定义CCSprite
课程中处理这类行为,因为如果不是,您的场景touchBegan
将变成巨大的错误 if else switch
声明。
相信我,我一直在那里。
以下是此类的示例代码示例:
.h 文件
@interface SubclassedSprite : CCSprite
@end
.m 文件
@implementation SubclassedSprite
- (void) onEnter
{
[super onEnter];
self.userInteractionEnabled = YES;
}
- (void) touchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
CCLOG(@"Touch began on sprite");
// Your code when the Sprite was touched [self removeFromParentAndCleanup:YES];
}
@end
这是处理此问题的正确,可扩展的方式。
答案 2 :(得分:-1)
下面的代码没有额外的BOOL变量,它应该适合你:
-(void) touchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint location = [touch locationInView: [touch view]];
CGPoint convertedlocation = [[CCDirector sharedDirector] convertToGL: location];
CGPoint convertedNodeSpacePoint = [self convertToNodeSpace:convertedlocation];
if (CGRectContainsPoint([_sprite boundingBox],convertedNodeSpacePoint)) {
if(_sprite.userInteractionEnabled)//Here you can remove the children of _sprite. e.g.
{
//Here run some action or do what you want to do. For e.g.
CCFadeTo *fadeOut = [CCFadeTo actionWithDuration:0.5f opacity:0];
CCCallfuncN *clean = [CCCallFuncN actionWithTarget:self SEL:@selector(cleanSpriteChildren:)];
for(id item in _sprite.children)
if(item)
[item runAction:[CCSequence runActions:fadeOut, clean]];
}
else{//Do your own task while _sprite is untouchable}
}
}
-(void)cleanSpriteChildren:(id)sender
{
[item removeFromParentAndCleanUp:YES]
if(([_sprite children] count) == 0)
_sprite.userInteractionEnabled = YES; //Here make the _sprite touchable again
}