C 我在SDL中显示精灵时遇到问题
我正在用SDL做一个平台游戏,但我有一个bug,我不知道如何修复它 我看了一张像这样的地图: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
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_纹理
以及硬件加速,这也可能会解决渲染问题。也许这也可能是渲染模式的问题。背景不错,但是稍微裁剪一下图像。另外,请把相关代码放在你的帖子里。考虑在你的文章中创建一个重点。好的背景,但是把图片裁剪一下。另外,请把相关代码放在你的帖子里。考虑在你的文章中创建一个重点。好的背景,但是把图片裁剪一下。另外,请把相关代码放在你的帖子里。考虑在你的文章中创建一个重点。好的背景,但是要剪裁图像。