1

在此处输入图像描述

在上图中,黄色代表一个大于 iPad 分辨率的精灵。我想允许在此处以白色表示的特定位置上的拖放功能。

我所拥有的是:-CCActor 继承 CCSprite-targetedBoundingBox 是根据精灵的白色圆圈的边界框。

我想要什么:如何根据精灵而不是屏幕来获取触摸位置?

我的代码:

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

2 回答 2

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

代码没有经过测试,只是从头顶写下来,我确定有错误,但它暗示了你应该往哪个方向走!,也取决于你在做什么,有更好的方法来处理这个,以本帖为例

如果我没有意义,请纠正我:)

于 2013-01-29T12:57:52.780 回答
0

根据您的描述,“我想要什么:如何根据精灵而不是屏幕来获取touchLocation?”,首先您应该了解,目前Cocos2D在图层级别集中处理所有触摸,而不是在精灵级别。

因此,在 UIView 坐标中接收到的触摸必须转换为层(节点空间)坐标,然后检查触摸是否与相关精灵相交。对于参考实现,您可以查看本教程

如果我正确理解了您的问题,您想更进一步并确定相关精灵中的确切坐标,那么它是一个基本的方向距离 = (newSprite.x,newSprite.y) -(touchlocation.x,touchlocation.y) inside touch intersects sprite 条件,以获取与 sprite 中心的方向和/或距离,以到达相关 sprite 内的确切触摸位置。

于 2013-01-29T19:30:28.290 回答