C 我在SDL中显示精灵时遇到问题

C 我在SDL中显示精灵时遇到问题,c,sdl,C,Sdl,我正在用SDL做一个平台游戏,但我有一个bug,我不知道如何修复它 我看了一张像这样的地图: 0=sprites/background.jpeg 1=sprites/dirt.jpeg 2 sprites/ww_left.png sprites/ww_right.png 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

我正在用SDL做一个平台游戏,但我有一个bug,我不知道如何修复它

我看了一张像这样的地图:

0=sprites/background.jpeg
1=sprites/dirt.jpeg

2
sprites/ww_left.png
sprites/ww_right.png

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
我显示1和2只需简单地点击我的图片,我显示0从我的图片像素

以下是我的显示功能:

我的问题是背景会覆盖我的角色精灵。 这是我开始时的显示,它看起来正常:

这就是当我移动太多时会发生的情况:

如果我继续向右移动,显示将再次良好,但总有一刻我的精灵被覆盖。
我知道它是从哪里来的,但我不知道如何修复它,你有想法吗?

推测:当你直接访问像素时,就像在函数
aff_background
中一样,你必须锁定表面,尤其是在硬件模式下

检查这是否是您的问题(并非100%确定)的一种简单方法是使用
SDL\u SWSURFACE
标志调用
SDL\u SetVideoMode
。最好检查
SDL\u MUSTLOCK

一般来说,与原始像素写入相比,更喜欢分片子图像。有可能BLIT排队,甚至异步完成,并且像素写入会中断绘图顺序

祝你好运

编辑:在阅读了另一个答案并仔细阅读了您的代码之后,这里有一个黑客程序,它应该会给出您想要的结果

while (++i != 16)
  {
    pos.x = 0;
    j = -1;
    while (++j != 15)
      {
        if (game->map.map[i][j] == 1)
          SDL_BlitSurface(game->map.sprites[1], NULL, game->sdl.screen,
                          &pos);
        else if ((game->map.map[i][j] == 0 || game->map.map[i][j] == 2))
          aff_background(game, pos);
        if (game->map.map[i][j] == 2)
          // record sprite starting position from map entry.
          sprite_start_pos = pos;
        pos.x += 100;
      }
    pos.y += 52;
  }
// write sprite image after everything else.
aff_sprite(game, sprite_start_pos);
SDL_Flip(game->sdl.screen);

推测:当您直接访问像素时,如在函数
aff_background
中,您必须锁定曲面,尤其是在硬件模式下

检查这是否是您的问题(并非100%确定)的一种简单方法是使用
SDL\u SWSURFACE
标志调用
SDL\u SetVideoMode
。最好检查
SDL\u MUSTLOCK

一般来说,与原始像素写入相比,更喜欢分片子图像。有可能BLIT排队,甚至异步完成,并且像素写入会中断绘图顺序

祝你好运

编辑:在阅读了另一个答案并仔细阅读了您的代码之后,这里有一个黑客程序,它应该会给出您想要的结果

while (++i != 16)
  {
    pos.x = 0;
    j = -1;
    while (++j != 15)
      {
        if (game->map.map[i][j] == 1)
          SDL_BlitSurface(game->map.sprites[1], NULL, game->sdl.screen,
                          &pos);
        else if ((game->map.map[i][j] == 0 || game->map.map[i][j] == 2))
          aff_background(game, pos);
        if (game->map.map[i][j] == 2)
          // record sprite starting position from map entry.
          sprite_start_pos = pos;
        pos.x += 100;
      }
    pos.y += 52;
  }
// write sprite image after everything else.
aff_sprite(game, sprite_start_pos);
SDL_Flip(game->sdl.screen);

推测:当您直接访问像素时,如在函数
aff_background
中,您必须锁定曲面,尤其是在硬件模式下

检查这是否是您的问题(并非100%确定)的一种简单方法是使用
SDL\u SWSURFACE
标志调用
SDL\u SetVideoMode
。最好检查
SDL\u MUSTLOCK

一般来说,与原始像素写入相比,更喜欢分片子图像。有可能BLIT排队,甚至异步完成,并且像素写入会中断绘图顺序

祝你好运

编辑:在阅读了另一个答案并仔细阅读了您的代码之后,这里有一个黑客程序,它应该会给出您想要的结果

while (++i != 16)
  {
    pos.x = 0;
    j = -1;
    while (++j != 15)
      {
        if (game->map.map[i][j] == 1)
          SDL_BlitSurface(game->map.sprites[1], NULL, game->sdl.screen,
                          &pos);
        else if ((game->map.map[i][j] == 0 || game->map.map[i][j] == 2))
          aff_background(game, pos);
        if (game->map.map[i][j] == 2)
          // record sprite starting position from map entry.
          sprite_start_pos = pos;
        pos.x += 100;
      }
    pos.y += 52;
  }
// write sprite image after everything else.
aff_sprite(game, sprite_start_pos);
SDL_Flip(game->sdl.screen);

推测:当您直接访问像素时,如在函数
aff_background
中,您必须锁定曲面,尤其是在硬件模式下

检查这是否是您的问题(并非100%确定)的一种简单方法是使用
SDL\u SWSURFACE
标志调用
SDL\u SetVideoMode
。最好检查
SDL\u MUSTLOCK

一般来说,与原始像素写入相比,更喜欢分片子图像。有可能BLIT排队,甚至异步完成,并且像素写入会中断绘图顺序

祝你好运

编辑:在阅读了另一个答案并仔细阅读了您的代码之后,这里有一个黑客程序,它应该会给出您想要的结果

while (++i != 16)
  {
    pos.x = 0;
    j = -1;
    while (++j != 15)
      {
        if (game->map.map[i][j] == 1)
          SDL_BlitSurface(game->map.sprites[1], NULL, game->sdl.screen,
                          &pos);
        else if ((game->map.map[i][j] == 0 || game->map.map[i][j] == 2))
          aff_background(game, pos);
        if (game->map.map[i][j] == 2)
          // record sprite starting position from map entry.
          sprite_start_pos = pos;
        pos.x += 100;
      }
    pos.y += 52;
  }
// write sprite image after everything else.
aff_sprite(game, sprite_start_pos);
SDL_Flip(game->sdl.screen);
看起来你只是在以某种逻辑控制的顺序任意渲染。我认为最好的方法是按照你给我们的索引按降序渲染,以第一层为背景逐层渲染

您可能还想尝试使用
SDL_纹理
以及硬件加速,这也可能会解决渲染问题。也许这也可能是渲染模式问题

看起来你只是在以某种逻辑控制的顺序任意渲染。我认为最好的方法是按照你给我们的索引按降序渲染,以第一层为背景逐层渲染

您可能还想尝试使用
SDL_纹理
以及硬件加速,这也可能会解决渲染问题。也许这也可能是渲染模式问题

看起来你只是在以某种逻辑控制的顺序任意渲染。我认为最好的方法是按照你给我们的索引按降序渲染,以第一层为背景逐层渲染

您可能还想尝试使用
SDL_纹理
以及硬件加速,这也可能会解决渲染问题。也许这也可能是渲染模式问题

看起来你只是在以某种逻辑控制的顺序任意渲染。我认为最好的方法是按照你给我们的索引按降序渲染,以第一层为背景逐层渲染


您可能还想尝试使用
SDL_纹理
以及硬件加速,这也可能会解决渲染问题。也许这也可能是渲染模式的问题。

背景不错,但是稍微裁剪一下图像。另外,请把相关代码放在你的帖子里。考虑在你的文章中创建一个重点。好的背景,但是把图片裁剪一下。另外,请把相关代码放在你的帖子里。考虑在你的文章中创建一个重点。好的背景,但是把图片裁剪一下。另外,请把相关代码放在你的帖子里。考虑在你的文章中创建一个重点。好的背景,但是要剪裁图像。