1

我想使用 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到一个图层上,它可以正确显示(见上文)
  • 可以将 aTile直接粘贴到屏幕上:

    SDL_BlitSurface(
      tile->graphic,
      nullptr,
      (VideoController::the_instance)->screen,
      &relative_position);
    
  • 但是,我不能将aTile粘贴到图层上:

    SDL_BlitSurface(
      tile->graphic,
      nullptr,
      (VideoController::the_instance)->layers[0],
      &relative_position);
    

更准确地说,当我对整体进行 blittileset_graphic进行测试,然后将 aTile粘贴到由于该测试而已经被占用的区域时,我可以部分看到我的 sprite。但是话又说回来,我完全不知道为什么会这样......

概括:

我尝试将几个SDL_Surfaces 粘贴到另一个上,但似乎只能通过尝试这个(所需的)表面链来失败:

graphic --> layer --> screen

有谁知道可能出了什么问题,或者能够告诉我你们需要哪些额外信息?

编辑

我能够在初始化的SDL_CreateRGBSurface(当我SDL_FillRect在将瓷砖贴到图层上之前在图层表面上使用时,它会正确显示。但是,我以这种方式失去了图层的透明度......

4

1 回答 1

0

我想出了解决方案。

我必须通过这样做来明确重置我的SDL_SRCALPHA标志graphic

SDL_SetAlpha(this->graphic, 0, SDL_ALPHA_OPAQUE );
于 2013-07-15T11:35:35.713 回答