我正在使用SDL进行平台游戏,但我有一个错误,我不知道如何解决它。
我读了一张如下所示的地图:
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。
这些是我的显示功能: https://github.com/vladydan/Darien_Reborn/blob/master/srcs/aff_map.c
我的问题是背景会覆盖我的角色精灵。 这是我开始时的显示,看起来不错:
当我移动太多时会发生这种情况:
如果我继续向右移动,显示屏将再次显示,但总会有一个时刻我的精灵会被覆盖。 我知道它来自哪里,但我不知道如何解决它,你有什么想法吗?
答案 0 :(得分:2)
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)
aff_sprite(game, pos);
pos.x += 100;
}
pos.y += 52;
}
SDL_Flip(game->sdl.screen);
return (0);
}
好像你只是在某种逻辑控制的顺序中任意渲染。我认为最好的办法是在你给我们的索引中按降序渲染,逐层渲染每一层,第一层作为背景。
您可能还想尝试使用SDL_Texture
来使用硬件加速,这也可能会解决渲染问题。也许它也可能是渲染模式问题。
答案 1 :(得分:1)
推测:当你进行直接像素访问时,就像在函数aff_background
中一样,你必须在硬件模式下锁定表面,尤其是。
检查这是否是您的问题(不是100%结论性)的简单方法是使用SDL_SetVideoMode
标志来调用SDL_SWSURFACE
。更好的检查SDL_MUSTLOCK
。
通常更喜欢将粗略的子图像写入原始像素写入。 blits可能是排队的,甚至是异步完成的,像素写入会中断绘制顺序。
祝你好运。编辑:在阅读完其他答案并仔细阅读您的代码之后,这里有一个可以为您提供所需结果的黑客,
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);