在上图中,黄色表示比iPad分辨率更大的精灵。我想在特定位置允许拖放功能,此处以白色表示。
我拥有的是: - CCActor继承CCSprite - targetedBoundingBox是根据精灵的白色圆圈的边界框。
我想要的: 我如何根据精灵获取touchLocation而不是屏幕?
我的代码:
-(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint touchLocation = [self convertTouchToNodeSpace:touch];
CCActor * newSprite = [self selectSpriteForTouch:touchLocation];
if(newSprite != NULL){
//touchLocation should be according to the sprite.
if (CGRectContainsPoint(newSprite.targetedBoundingBox, touchLocation)) {
[self spriteSelected:newSprite];
return YES;
}
return NO;
}
return NO;
}
答案 0 :(得分:2)
在我的脑海中,最简单的方法是计算触摸位置与精灵位置之间的差异,因此您的代码应如下所示:
首先在你班级的全球某处定义
CCPoint relativePosition;
然后从触摸代码内部只计算触摸位置和精灵位置之间的差异(仅在触摸实际位于精灵内部时才进行,这意味着你不会得到x = -100,y = -999如果你在精灵外面触摸)
-(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint touchLocation = [self convertTouchToNodeSpace:touch];
CCPoint actorPosition = [actor position];
if (CGRectContainsPoint(actor.targetedBoundingBox, touchLocation)) {
//You now have the touch position here:
relativePosition = ccpSub(touchLocation, actorPosition);
return YES;
}
return NO;
}
代码没有经过测试,只是把它写在我的头顶,我确定会出现错误,但它暗示你应该去哪个方向!,也取决于你在做什么,有更好的方法要处理此问题,请以this post为例
如果我没有意义,请纠正我:)
答案 1 :(得分:0)
根据您的描述,“我想要什么:如何根据精灵获取touchLocation而不是屏幕?”,首先您应该了解当前Cocos2D在层级集中处理所有触摸而不是精灵的水平。
因此,必须将UIView坐标中接收的触摸转换为图层(节点空间)坐标,然后检查触摸是否与相关的精灵相交。对于参考实现,您可以查看此tutorial。
如果我理解你的问题,你想更进一步,找出相关精灵中的确切坐标,那么它是一个基本的 directionDistance =(newSprite.x,newSprite.y) - 触摸内的(touchlocation.x,touchlocation.y)与精灵条件相交,以获取精灵中心的方向和/或距离,以获得精确的触摸位置有关的精灵。