【问题标题】:SDL and c++ -- More efficient way of leaving a trail behind the player?SDL 和 c++——在玩家身后留下痕迹的更有效方式?
【发布时间】:2013-12-11 02:09:13
【问题描述】:

所以我对 SDL 还很陌生,我正在尝试制作一个小型单板滑雪游戏。当玩家在下山时,我想在他身后留下一条淡色的雪迹。目前,我的工作方式是我有一个数组(包含 1000 个元素)来存储玩家的最后位置。然后每一帧,我都有一个循环 1000 次的 for 循环,以在玩家的所有这些最后 1000 个位置绘制轨迹纹理...

我觉得这非常低效,我正在寻找一些更好的替代方案!

代码:

void Player::draw()
{
    if (posIndex >= 1000)
    {
        posIndex = 0;
    }

    for (int i = 0; i < 1000; i++) // Loop through all the 1000 past positions of the player
    {
        // pastPlayerPos is an array of SDL_Rects that stores the players last 1000 positions
        // This line calculates teh location to draw the trail texture
        SDL_Rect trailRect = {pastPlayerPos[i].x, pastPlayerPos[i].y, 32, 8};
        // This draws the trail texture
        SDL_RenderCopy(Renderer, Images[IMAGE_TRAIL], NULL, &trailRect);
    }

    // This draws the player
    SDL_Rect drawRect = {(int)x, (int)y, 32, 32};
    SDL_RenderCopy(Renderer, Images[0], NULL, &drawRect);

    // This is storing the past position
    SDL_Rect tempRect = {x, y, 0, 0};
    pastPlayerPos[posIndex] = tempRect;

    posIndex++; // This is to cycle through the array to store the new position

这就是结果,这正是我想要完成的,但我只是在寻找一种更有效的方法。如果没有,我会坚持这个。

【问题讨论】:

    标签: c++ performance sdl trail


    【解决方案1】:

    有多种解决方案。我给你两个。

    1.

    创建屏幕大小的表面。用阿尔法填充它。在每个玩家移动时,将它的当前位置绘制到这个表面上——所以每个移动都会给你添加额外的数据到这个可能的掩码中。然后在屏幕上对该表面进行 blit(注意 blit 顺序)。在您的情况下,可以通过禁用 alpha 并最初用白色填充表面并首先对其进行 blitting 来改进它。顺便说一句,使用这种方法,您可以跳过翻转后的屏幕清除。

    我建议从这个开始。

    2.

    不容易,但可能更有效(这取决于)。保存玩家实际改变移动方向的数组点。之后,您需要在这些点之间绘制链线。然而,SDL 中没有用于绘制线条的内置函数;也许在 SDL_gfx 中有,我从未尝试过。如果您稍后使用 OpenGL 后端,这种方法可能会更好;使用 SDL(或任何其他普通的 2D 绘图库),它并没有太大用处。

    【讨论】:

    • 第一个选项听起来可能对我有用。但我有点失落。你是什​​么意思“将它的当前位置绘制到这个表面”?你还说我可以通过“禁用 alpha,并最初用白色填充表面,然后先将其 blitting”来跳过屏幕清除。这将如何工作?你的意思是我将它的当前位置绘制到表面上,而不是在这个表面上这样做?我想完成这个,但我有点困惑。你能详细说明一下吗?
    • 噢,刚刚意识到您正在使用 SDL2。它实际上确实有线条图,如果你需要的话。但回到第一个:如果是 SDL2,您将纹理设置为渲染目标(使用SDL_SetRenderTarget),因此您的绘图函数实际上将绘制到此纹理中。用白色填充它,因为你的背景是白色的。在每一帧上绘制具有当前玩家位置的矩形,就像你现在做的那样。然后将渲染目标重置回屏幕,在屏幕上复制生成的纹理并绘制树木和其他需要的东西。不再需要清屏了,因为它已经是白色的了。
    • 如果它仍然没有给您一个想法,您可以将您的源/图像上传到某个地方,这样我可以在有时间的时候查看并修改它。如果它不是太混乱或特定于 Windows。
    • 啊,好吧,这更有意义!我认为我应该能够以这种方式完成它。我明天试试(我现在有一个化学测试要学习:/),然后告诉你进展如何!
    • Ughhhh 我很难过...所以我创建了一个新纹理,将其设置为渲染目标,将轨迹渲染到屏幕上,效果很好,但是背景是漆黑的.我尝试使用 fillRect 但无论我是在轨迹之前还是之后绘制它,它都会覆盖它们!有什么关系?
    猜你喜欢
    • 2013-09-07
    • 1970-01-01
    • 2011-09-09
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多