我很擅长在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;
}
}
如果您需要更多信息并感谢阅读,请告诉我们!
答案 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;
}
}
}