Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ipad 触摸检测的问题_Ipad_Cocos2d Iphone_Touch - Fatal编程技术网

Ipad 触摸检测的问题

Ipad 触摸检测的问题,ipad,cocos2d-iphone,touch,Ipad,Cocos2d Iphone,Touch,我正在学习Cocos2d和Objective-C,我在触摸检测方面遇到了一些问题 我在HelloWorldLayer中有几个精灵和一些DragableSprites NSMutableArray。两个可拖动精灵一个接一个地放置,底部的一个更大 然后我有一些代码可以让一个被触摸的精灵震动: - (void)selectSpriteForTouch:(CGPoint)touchLocation { CCSprite *touchSprite = nil; for (CCSprite

我正在学习Cocos2d和Objective-C,我在触摸检测方面遇到了一些问题

我在HelloWorldLayer中有几个精灵和一些DragableSprites NSMutableArray。两个可拖动精灵一个接一个地放置,底部的一个更大

然后我有一些代码可以让一个被触摸的精灵震动:

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