在cocos2d中检测精灵上的透明部分?

时间:2012-09-08 19:33:45

标签: objective-c cocos2d-iphone

我是Cocos2d的初学者。我有一个精灵,我想忽略那个精灵的透明区域的触摸。

我知道这个答案Cocos2d 2.0 - Ignoring touches to transparent areas of layers/sprites,还有这篇精彩的文章http://www.learn-cocos2d.com/2011/12/fast-pixelperfect-collision-detection-cocos2d-code-1of2/

我能够使它与KKPixelMaskSprite一起使用,但只有在文件中使用sprite时才能使用,但不能从批处理节点使用sprite。每当我使用批处理节点(Sprite表)时,为了获得精灵,它就会停止工作。

我彼此有不同的精灵,我想用这种方式检测 - >如果touch在当前的sprite边界框中,那个部分在sprite上是透明的还是没有?

P.S.I' m使用cocos2d 1.0。我现在不想使用任何物理引擎,我只想忽略精灵透明区域的触摸(使用批处理节点创建)。我该怎么做?或者可能有任何工具可以帮助吗?

提前多多感谢。

3 个答案:

答案 0 :(得分:3)

您可以使用CGMutablePathRef进行非矩形精灵碰撞检测。

//检查

    CGPoint loc =[mySprite convertToNodeSpace:touchPoint];

    if([mySprite isPointInsideMap:loc]) 
    {
         //touched inside..
    }

//Add this method in your MySprite class derived from CCSprite.
-(bool)isPointInsideMap:(CGPoint)inPoint
{
    if (CGPathContainsPoint(mCollisionPath, NULL, inPoint, NO) ) 
    {
        return true;
    }

    return false;
}

////创建路径

CGMutablePathRef  mCollisionPath = CGPathCreateMutable();
CGPathMoveToPoint(mCollisionPath,    NULL,  0, 0 );
CGPathAddLineToPoint(mCollisionPath, NULL,   11, 82 );
CGPathAddLineToPoint(mCollisionPath, NULL,   42, 152 );
CGPathAddLineToPoint(mCollisionPath, NULL,   86, 202 );
CGPathAddLineToPoint(mCollisionPath, NULL,   169, 13 );
CGPathCloseSubpath(mCollisionPath);

答案 1 :(得分:2)

这个答案比你想象的更加分散,因为我不会给你一个代码示例,但这就是我实现这个的方法:

你有精灵的边界框的位置(精灵的一角,包括透明区域,如果适用),以及触摸屏幕的位置。使用此信息,您可以计算精灵中触摸内部的位置。换句话说,您可以找到触摸的像素,与游戏画面无关。

现在您有了像素位置(x和y),打开图像(可能是PNG),并获得该像素的RGB [A]值。每个PNG都有一个透明度键。这是alpha通道如果PNG的内部像素颜色位于(x; y)==透明度键那么该像素是透明的

如果您可以获得相关像素的alpha值,如果它等于0,则像素是透明的。

编辑:语义(“alpha channel”)

答案 2 :(得分:1)

我会尝试为我改变你的触摸边界框,并为不同的精灵减少它...