我想使用 SDL 创建一个模块化设计的游戏,但我无法显示我的精灵。准确地说,我正在尝试实现平铺集,它们是收集在一个单独的 PNG 文件中的一堆大小相同的精灵(在我的例子中)。
我的数据结构应该包含一个可用的 tile 集合中的 sprite 数组,然后可以使用方法绘制,例如draw(Tile *, Position, Layer);
.
如前所述,我想展示多层表面,以便稍后实现多个独立的背景层和前景层。同样,我有一个图层数组,这些图层以预定义的顺序排列到我的screen
表面(使用 创建)。SDL_SetVideoMode
但是,我不明白我的代码出了什么问题。加载瓦片集时,我可以成功地将当前加载的瓦片粘贴到图层表面,就像在这个片段中一样:
this->graphic = SDL_CreateRGBSurface(SDL_HWSURFACE | SDL_SRCALPHA,
tile_widths, tile_heights, bit_depth,
rmask, gmask, bmask, amask);
SDL_BlitSurface(tileset_graphic, &tile_position, this->graphic, nullptr);
SDL_BlitSurface(tileset_graphic, &tile_position,
((VideoController::get_instance())->layers)[0], &tile_position);
在第一行中,我尝试将tileset_graphic
对应于 sprite 的部分 blit 到SDL_Surface *
我的结构所持有的Tile
稍后使用的部分。
但是,我不能使用这个表面来 blit 到 layer 上。第二个(测试)语句只是将考虑的区域复制tileset_graphic
到我的图层的最底部。此外,我在我的main
方法中执行了几个测试命令。
我在测试过程中的发现:
- 我可以将一块拼贴
tileset_graphic
到一个图层上,它可以正确显示(见上文) 我可以将 a
Tile
直接粘贴到屏幕上:SDL_BlitSurface( tile->graphic, nullptr, (VideoController::the_instance)->screen, &relative_position);
但是,我不能将a
Tile
粘贴到图层上:SDL_BlitSurface( tile->graphic, nullptr, (VideoController::the_instance)->layers[0], &relative_position);
更准确地说,当我对整体进行 blittileset_graphic
进行测试,然后将 aTile
粘贴到由于该测试而已经被占用的区域时,我可以部分看到我的 sprite。但是话又说回来,我完全不知道为什么会这样......
概括:
我尝试将几个SDL_Surface
s 粘贴到另一个上,但似乎只能通过尝试这个(所需的)表面链来失败:
graphic --> layer --> screen
有谁知道可能出了什么问题,或者能够告诉我你们需要哪些额外信息?
编辑
我能够在初始化的SDL_CreateRGBSurface
(当我SDL_FillRect
在将瓷砖贴到图层上之前在图层表面上使用时,它会正确显示。但是,我以这种方式失去了图层的透明度......