可以使用alpha蒙版将图像blit到透明表面上吗?

时间:2012-06-14 07:13:46

标签: c++ image sdl

我正在努力做到这一点。我的游戏中有各种爆炸瓦片的图像。我正在尝试预处理爆炸瓷砖并创建图像,然后将其blit到屏幕上。

以下是带有alpha蒙版的图块:Explosion

现在,我想要对它们进行blit并让它们将alpha透明度保持在我可以渲染的表面上。

这是我的代码:

SDL_Surface* SpriteManager::buildExplosion(int id, SDL_Surface* image, int size)
{
    // Create the surface that will hold the explosion image
    SDL_Surface* explosion = SDL_CreateRGBSurface(SDL_HWSURFACE, size * 32 , size * 32, 32, 0, 0, 0, 255 );

    // Our source and destination surfaces
    SDL_Rect srcrect;
    SDL_Rect dstrect;

    int parentX = sprites[id].x;
    int parentY = sprites[id].y;
    int middle = size / 2;

    // Create the first image
    srcrect.x = sprites[id].imgBlockX * 32; // default for now
    srcrect.y = sprites[id].imgBlockY * 32; // default for now
    srcrect.w = 32;
    srcrect.h = 32;

    // Get the location it should be applied to
    dstrect.x = middle * 32;
    dstrect.y = middle * 32;
    dstrect.w = 32;
    dstrect.h = 32;

    // Apply the texture
    SDL_BlitSurface(image, &srcrect, explosion, &dstrect);

    errorLog.writeError("Applying surface from x: %i y: %i to x: %i y:%i", srcrect.x, srcrect.y, dstrect.x, dstrect.y);

    // Iterate through each explosion
    for(int i = 0; i < sprites[id].children.size(); i++)
    {
        // Get the texture source
        srcrect.x = 0;  // default for now
        srcrect.y = 0;  // default for now
        srcrect.w = 32;
        srcrect.h = 32;

        // Get the location it should be applied to
        dstrect.x = sprites[id].children[i].x - parentX * 32;
        dstrect.y = sprites[id].children[i].y - parentY * 32;
        dstrect.w = 32;
        dstrect.h = 32;

        // Apply the texture
        SDL_BlitSurface(image, &srcrect, explosion, &dstrect);
    }

    //return img;
    return explosion;
}

我怀疑这与这条线有关,但我真的不知所措:

SDL_Surface* explosion = SDL_CreateRGBSurface(SDL_HWSURFACE, size * 32 , size * 32, 32, 0, 0, 0, 255 );

SDL_Surface被称为图像是我上面链接的图像,只是为了清楚。如果有人看到我的方式的错误,非常感谢!

我的问题:上面的代码会破坏一个完全不可见的表面或黑色表面上的图像。

我想我很好奇是否有可能做我上面描述的内容以及是否可以修改此代码以使其工作。

0 个答案:

没有答案