适用于iPhone的cocos2d - 刻度后触摸不再正常工作

时间:2012-07-15 22:27:21

标签: iphone objective-c ios ios5 cocos2d-iphone

我很擅长在iPhone上使用Cocos2d,而且我遇到触控位置问题。目前我只是试图在屏幕上触摸并移动一个精灵,当图层不动时以及我翻译图层(在我的情况下改变X方向的self.position)时,这种方法很好,但是当我缩放时我的图层(例如:self.scale = .5)触摸不再移动精灵。我做了很多论坛搜索/谷歌搜索,我认为我的问题与我的坐标转换(节点空间/世界空间等)有关但我不是100%肯定。我注意到,当我缩放时,如果我点击精灵没有刻度的位置,那么我可以移动精灵。这让我相信我的变换没有考虑到比例。

以下是我目前用于获取触摸位置的坐标转换代码:

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *myTouch = [touches anyObject];
    CGPoint location = [myTouch locationInView:[myTouch view]];
    location = [self convertToNodeSpace:location];
    location = [[CCDirector sharedDirector] convertToGL:location];
}

这是检查位置(与上面相同的位置变量)是否正在触摸精灵的代码,尽管我对这段代码更加有信心,谁知道呢!

for (CCSprite *sprite in movableSprites) {
    if (CGRectContainsPoint(sprite.boundingBox, touchLocation)) {
        NSLog(@"Woohoo, you touched a sprite!");
        break;
    }
}

如果您需要更多信息并感谢阅读,请告诉我们!

2 个答案:

答案 0 :(得分:1)

我认为你应该使用比例

加倍边界框
   for (CCSprite *sprite in movableSprites) {
    if (CGRectContainsPoint(sprite.boundingBox*sprite.scale, touchLocation)) {
       //touch sprite action
    }
}

关于转换点,如果我需要绝对的屏幕点,我总是使用:

convertToWorldSpace:CGPointZero. 

我不确定你为什么在你的触摸位置需要这个,当我需要忽略它们在父节点中的位置时,我通常会在sprite上执行此操作。

除此之外,如果你的游戏不是真正的多点触控游戏,你最好使用ccTouchBegan而不是ccTouchesBegan。

答案 1 :(得分:0)

使用此功能获取sprite rect。

-(CGRect)getSpriteRect:(CCNode *)inSprite
{
    CGRect sprRect = CGRectMake(
                                inSprite.position.x - inSprite.contentSize.width*inSprite.anchorPoint.x,
                                inSprite.position.y - inSprite.contentSize.height*inSprite.anchorPoint.y,
                                inSprite.contentSize.width, 
                                inSprite.contentSize.height
                                ); 

    return sprRect;
}



- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *myTouch = [touches anyObject];
    CGPoint location = [myTouch locationInView:[myTouch view]];
    location = [[CCDirector sharedDirector] convertToGL:location];

    for (CCSprite *sprite in movableSprites) 
    {
       CGRect rect = [self getSpriteRect:sprite];
       if (CGRectContainsPoint(rect, location)) 
       {
           NSLog(@"Woohoo, you touched a sprite!");
           break;
       }
   }
}