我正在通过1.2-> 2.0转换,一次只有一个问题。到目前为止,我有声音,互动和屏幕,显示......好吧。
我确定问题是由于位深度和/或格式造成的。原始代码使用精灵的8位索引 SPR文件,将它们加载到一系列uint8 *buffu
中,然后将它们blit到显示器的Surface。
我移植了这个,按照指南和重大的试错(很多模式和开关根本无法在我的机器上工作),通过创建纹理和Surface,让旧代码blit进入Surface ,然后这样做......
SDL_UpdateTexture(sdltxtr, NULL, sdlsurf->pixels, 640 * sizeof (uint8));
SDL_RenderClear(sdlrend);
SDL_RenderCopy(sdlrend, sdltxtr, NULL, NULL);
SDL_RenderPresent(sdlrend);
结果是一个带有东西的屏幕,但它都是未对齐的。我认为这是因为Surface和Texture具有与精灵不同的位深度和格式......
sdltxtr = SDL_CreateTexture(sdlrend,
SDL_PIXELFORMAT_ARGB8888,
SDL_TEXTUREACCESS_STREAMING,
640, 480);
sdlsurf = SDL_CreateRGBSurface(0, 640, 480, 8, 0,0,0,0);
我已尝试从文档中进行各种设置,以尝试获取8位索引的曲面或纹理,但所有标记都会导致Surface或Texture为空。
有什么建议吗?
答案 0 :(得分:0)
你提到索引 8位图形。假设索引意味着 palettized ,您不能简单地使用像素缓冲区,因为这只是SDL_Surface相关调色板的条目列表。
话虽这么说,你需要创建一个缓冲区,实际上从调色板中保存正确的ARGB值,而不是与像素缓冲区关联的索引值。
您可以使用SDL_ConvertSurfaceFormat()将8位调色表面转换为32位ARGB曲面,并将其缓冲区放入SDL_Texture。您还可以创建一个自己的32位ARGB缓冲区,并通过查找正确的调色板代码自行完成转换(但在大多数情况下,第一个选项会更容易)。
在将8位SDL_Surface转换为32位SDL_Surface之前,应该将有效的调色板与它相关联(SDL_SurfaceSetPalette())。