我想使用SDL创建一个模块化设计的游戏,但是我没有显示我的精灵。确切地说,我正在尝试实现tile集,它们是在一个PNG文件中收集的大小相同的精灵(在我的例子中)。
我的数据结构应该包含tile集中可用的sprite数组,然后可以使用draw(Tile *, Position, Layer);
等方法绘制。
如上所述,我希望以多层曲面为特色,以便稍后实现多个独立的背景图层和前景图层。同样地,我有一个图层数组,这些图层以预定义的顺序显示在screen
曲面(使用SDL_SetVideoMode
创建)上。
但是,我的代码中没有出现问题。 在加载图块集时,我可以成功地将当前加载的图块blit到图层表面上,就像在此片段中一样:
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
的部分blit到我的SDL_Surface *
结构所持有的Tile
以便稍后使用上。
但是,我无法使用此表面在图层上进行blit 。
第二个(测试)语句只是将tileset_graphic
的考虑区域复制到我的图层的最底部。此外,我在main
方法中执行了几个测试命令。
测试期间我的发现:
tileset_graphic
片段blit到一个图层并正确显示(见上文)我可以直接将Tile
blit到屏幕上:
SDL_BlitSurface(
tile->graphic,
nullptr,
(VideoController::the_instance)->screen,
&relative_position);
但是,无法将Tile
blit到图层上:
SDL_BlitSurface(
tile->graphic,
nullptr,
(VideoController::the_instance)->layers[0],
&relative_position);
更确切地说,当我试图整个tileset_graphic
进行测试时,然后将Tile
blit到由于此测试已经占用的区域,我可以部分看到我的精灵。但话说回来,我完全不知道为什么会这样......
要点:
我尝试将几个SDL_Surface
blit到另一个上,但似乎只是通过尝试这个(所需的)曲面链来失败:
graphic --> layer --> screen
有没有人知道可能出现的问题,或者能告诉我你们需要哪些其他信息?
修改
我能够发现初始化(SDL_CreateRGBSurface
)上的blitting,但仍然“未接触”的图层表面似乎以某种方式失败。当我在图层表面上使用SDL_FillRect
之前,将图块上的图块加入图层时,它会正确显示。但是,我正在以这种方式失去层的透明度......
答案 0 :(得分:0)
我找到了解决方案。
我必须通过执行
明确重置SDL_SRCALPHA
的{{1}}标记
graphic