SDL:拼贴和分层曲面的组合不起作用

时间:2013-07-13 16:36:34

标签: c++ sdl

我想使用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之前,将图块上的图块加入图层时,它会正确显示。但是,我正在以这种方式失去层的透明度......

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。

我必须通过执行

明确重置SDL_SRCALPHA的{​​{1}}标记
graphic