检测精灵cocos2d中的特定触摸位置

时间:2013-01-29 12:43:46

标签: ios objective-c cocos2d-iphone

enter image description here

在上图中,黄色表示比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;
}

2 个答案:

答案 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)与精灵条件相交,以获取精灵中心的方向和/或距离,以获得精确的触摸位置有关的精灵。