我目前正在使用SDL2编写一个简单的程序,您可以将一些形状(正方形,圆形,三角形等)拖动到画布中并旋转它们并移动它们。每个形状都由SDL纹理直观表示,该纹理是从PNG文件创建的(使用SDL_image库中的IMG_LoadTexture函数)。
问题是我想知道纹理中的某个像素是否是透明的,所以当有人点击图像时我可以确定是否必须做一些动作(因为点击是在非透明区域) 或不。 因为这是一些学校作业,我面临一些限制,也就是说,只使用SDL2库,如果所讨论的像素是透明的,因为图像是经过二次选择的,所以我无法找到一些地图。此外,我考虑过使用SDL表面来完成这项任务,从原始图像中创建它们,但是由于这些形状正在旋转通过不起作用的纹理。
答案 0 :(得分:4)
您可以使用Render Targets完成此操作。
SDL_SetRenderTarget(renderer, target);
... render your textures rotated, flipped, translated using SDL_RenderCopyEx
SDL_RenderReadPixels(renderer, rect, format, pixels, pitch);
在最后一步中,您使用SDL_RenderReadPixels从渲染目标中读取像素,然后您必须确定所需像素的Alpha通道是否为零(透明)。您可以从渲染目标或整个纹理中只读取您想要的一个像素,您选择哪个选项取决于您必须执行的命中测试的数量,纹理旋转/移动的频率等等。
答案 1 :(得分:2)
您需要使用SDL_TEXTUREACCESS_STREAMING标志创建纹理,并在能够操作像素数据之前锁定纹理。要判断某个像素在纹理中是否透明,请确保调用
SDL_SetTextureBlendMode(t, SDL_BLENDMODE_BLEND);
这允许纹理识别alpha通道。
尝试这样的事情:
SDL_Texture *t;
int main()
{
// initialize SDL, window, renderer, texture
int pitch, w, h;
void *pixels;
SDL_SetTextureBlendMode(t, SDL_BLENDMODE_BLEND);
SDL_QueryTexture(t, NULL, &aw, &h);
SDL_LockTexture(t, NULL, &pixels, &pitch);
Uint32 *upixels = (Uint32*) pixels;
// you will need to know the color of the pixel even if it's transparent
Uint32 transparent = SDL_MapRGBA(SDL_GetWindowSurface(window)->format, r, g, b, 0x00);
// manipulate pixels
for (int i = 0; i < w * h; i++)
{
if (upixels[i] == transparent)
// do stuff
}
// replace the old pixels with the new ones
memcpy(pixels, upixels, (pitch / 4) * h);
SDL_UnlockTexture(t);
return 0;
}
如果您有任何疑问,请随时提出。虽然我不是这个主题的专家。
有关详细阅读和教程,请查看http://lazyfoo.net/tutorials/SDL/index.php。教程40具体涉及像素操作。
如果方法名称中有任何错误,我会道歉(我把它写在了我的头顶)。
希望这会有所帮助。