2012-07-15 74 views
1

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

这里是坐标变换我目前使用得到的触摸位置的代码:

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

让我知道如果您需要了解更多信息,并感谢您的阅读!

+0

嗯,我想你需要使用convertToWorldSpace那里,因为你想要的位置没有转换到图层的空间(这是缩放)。可能是错误的。 – LearnCocos2D 2012-07-15 22:43:51

回答

1

我想你应该随着规模

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

一倍边框有关转换点,如果我需要一个绝对屏幕点我总是用:

convertToWorldSpace:CGPointZero. 

我不是真的当然,为什么你需要在你的触摸位置上使用它,当我需要忽略它们在父节点中的位置时,我通常会在精灵上执行此操作。

其他然后是,如果你的游戏是不是真正的多点触控游戏你更好地使用ccTouchBegan而不是ccTouchesBegan。

0

使用此功能来获得精灵矩形。

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