当前位置: 首页 > 知识库问答 >
问题:

Cocos2dx中的像素完美碰撞检测

史懿轩
2023-03-14

我试图在Cocos2d-x中移植像素完美冲突检测,原始版本是为Cocos2D制作的,可以在这里找到:http://www.cocos2d-iphone.org/forums/topic/pixel-perfect-collision-detection-using-color-blending/

这是我的Cocos2d-x版本代码

bool CollisionDetection::areTheSpritesColliding(cocos2d::CCSprite *spr1, cocos2d::CCSprite *spr2, bool pp, CCRenderTexture* _rt) {
    bool isColliding = false;
    CCRect intersection;
    CCRect r1 = spr1->boundingBox();
    CCRect r2 = spr2->boundingBox();
    intersection = CCRectMake(fmax(r1.getMinX(),r2.getMinX()), fmax( r1.getMinY(), r2.getMinY()) ,0,0);
    intersection.size.width = fmin(r1.getMaxX(), r2.getMaxX() - intersection.getMinX());
    intersection.size.height = fmin(r1.getMaxY(), r2.getMaxY() - intersection.getMinY());

    // Look for simple bounding box collision
    if ( (intersection.size.width>0) && (intersection.size.height>0) ) {
        // If we're not checking for pixel perfect collisions, return true
        if (!pp) {
            return true;
        }

        unsigned int x = intersection.origin.x;
        unsigned int y = intersection.origin.y;
        unsigned int w = intersection.size.width;
        unsigned int h = intersection.size.height;
        unsigned int numPixels = w * h;
        //CCLog("Intersection X and Y %d, %d", x, y);
        //CCLog("Number of pixels %d", numPixels);

        // Draw into the RenderTexture
        _rt->beginWithClear( 0, 0, 0, 0);

        // Render both sprites: first one in RED and second one in GREEN
        glColorMask(1, 0, 0, 1);
        spr1->visit();
        glColorMask(0, 1, 0, 1);
        spr2->visit();
        glColorMask(1, 1, 1, 1);

        // Get color values of intersection area
        ccColor4B *buffer = (ccColor4B *)malloc( sizeof(ccColor4B) * numPixels );
        glReadPixels(x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

        _rt->end();

        // Read buffer
        unsigned int step = 1;
        for(unsigned int i=0; i 0 && color.g > 0) {
                isColliding = true;
                break;
            }
        }

        // Free buffer memory
        free(buffer);
    }


    return isColliding;
}

如果我将“pp”参数发送为false,则我的代码工作正常。也就是说,如果我只进行边界框碰撞,但在需要像素完美碰撞的情况下,我无法使其正常工作。我认为opengl屏蔽代码没有按我的预期工作。

这是“rt”的代码

    _rt = CCRenderTexture::create(visibleSize.width, visibleSize.height);
    _rt->setPosition(ccp(origin.x + visibleSize.width * 0.5f, origin.y + visibleSize.height * 0.5f));
    this->addChild(_rt, 1000000);
    _rt->setVisible(true); //For testing

我认为我在实现这个CCRenderTexture时犯了一个错误

有人能指导我我做错了什么吗?

谢谢你的时间:)

共有2个答案

曹焱
2023-03-14

你没有正确地通过缓冲区。

// Read buffer
unsigned int step = 1;
for(unsigned int i=0; i<numPixels; i+=step)
{
    ccColor4B color = buffer;

    if (color.r > 0 && color.g > 0)
    {
        isCollision = YES;
        break;
    }
}

资料来源:http://www.cocos2d-iphone.org/forums/topic/pixel-perfect-collision-detection-using-color-blending/#post-337907

双志强
2023-03-14

终于解决了这个问题。必须使用自定义的opengl片段着色器将其中一个精灵完全着色为红色,另一个完全着色为蓝色,然后循环遍历glReadPixels值以找到同时具有红色和蓝色像素的任何像素。(混合也必须考虑,我们不想用另一个像素值替换一个像素值)

深入的信息可以在我的博客上找到http://blog.muditjaju.infiniteeurekas.in/?p=1

 类似资料:
  • 问题内容: 好的,我正在研究Android上的游戏。我需要实现像素完美碰撞检测。我已经在每个图像周围设置了边界框,每个边界框都进行了转换以匹配图像的当前旋转。一切都很好。我还将每个位图的像素数据存储在数组中。有人可以帮我找出检测像素是否重叠的最有效方法吗?在此先感谢您的帮助! 问题答案: 基本思想是为每个对象创建一个位掩码,您可以在每个像素中指示该对象是否实际存在。然后,比较两个对象的位掩码的每个

  • 问题内容: 我找到了像素完美碰撞检查的代码,并在我的代码中使用了它: 它运行完美,从来没有任何问题。直到我使用以下代码将图像设置为Config_Alpha_8为止(由于ram问题): 为什么什么都不会发生,它确实被CollisioDetected装入了,我已经检查了日志!但是它不会检测到冲突。有人可以使用config_alpha_8提供工作功能来检查位图的像素完美冲突吗? 问题答案: 在具有ALP

  • 我需要在iPad精灵游戏中生成8个随机精灵对象。这些对象相当大,并且大小不同。它们不应该叠加。如果场景中生成的对象叠加,它将被删除(可选地,它会删除底层对象)。我一直在为Sprite Kit寻找一个像素完美的冲突检测框架或帮助类。到目前为止,我还没有找到教程或类似的东西。大多数人使用普通的冲突检测,这没有任何帮助,因为我的对象很大。我测试了标准方法,但它创建了矩形,使我的情况下的精灵区域更大。这是

  • 问题内容: 如何使用Pygame的模块检测具有透明背景的两个精灵的碰撞,以便仅在实际的精灵(而不是透明背景)碰撞时返回? 问题答案: 使用该函数为您的精灵赋予属性。 然后,您可以将回调函数传递给sprite碰撞函数之一,例如,碰撞检测将是完美的像素。 这是一个完整的示例(当两个精灵碰撞时,标题会更改):

  • 我试图让我的游戏中的碰撞完全完美。我测试的是,如果你和玩家撞墙,你就会停下来。我只实现了当玩家撞墙左侧时(当墙在玩家右侧时)的碰撞代码。这是代码。 注意:如果我走得很慢,它会在我想要停止的地方停止玩家,但是走得很快,它不会按照我想要的方式进行碰撞 本质上,代码指出如果墙在右边,它将检查玩家矩形的右下角,减去墙的左下角,并检查两者之间的距离是否0.001. 0.001几乎是一个不明显的距离,因此我使

  • 我目前正在开发一个自上而下的射击游戏,在碰撞方面有一些问题。我的世界是瓷砖做的(64x64)。瓦片和实体是矩形。玩家以例如2.74的速度移动(为了更平滑的移动,不以像素为单位)。但是当涉及到玩家(一个实体)和墙之间的碰撞时,我有一些问题。为了检查是否有碰撞,我用我的球员的当前位置和他的移动速度来计算他的下一个位置和是否有碰撞。但我会检查途中的每个像素,所以即使移动速度非常快,我也无法跳过障碍。假设