SDL и C++ - более эффективный способ оставить след позади игрока?

Так что я довольно новичок в SDL и пытаюсь сделать небольшую игру на сноуборде. Когда игрок движется вниз по склону, я хочу оставить след из неокрашенного снега позади него. В настоящее время у меня есть способ работы с массивом (с 1000 элементами), в котором хранятся последние позиции игроков. Затем в каждом кадре у меня есть цикл for, который повторяется 1000 раз, чтобы нарисовать текстуру следа во всех этих последних 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

Результат

Это результат, которого я и пытаюсь достичь, но я просто ищу более эффективный путь. Если нет, я буду придерживаться этого.

1 ответ

Решение

Есть несколько решений. Я дам тебе два.

1.

Создать экран размером с поверхность. Заполните его альфа. При каждом движении игрока нарисуйте его текущую позицию на этой поверхности - поэтому каждое движение будет добавлять вам дополнительные данные к этой потенциальной маске. Затем блики этой поверхности на экране (остерегайтесь порядка бликов). В вашем случае это можно было бы улучшить, отключив альфа-канал и первоначально заполнив поверхность белым, и сначала растоптав его, прежде чем что-либо еще. При таком подходе вы можете пропустить очистку экрана после переворота, кстати.

Я рекомендую начать с этого.

2.

Непростой, но может быть более эффективным (это зависит). Сохранить массив точек, где игрок фактически изменил направление движения. После этого вам нужно нарисовать цепочку между этими точками. Однако в SDL нет встроенных функций для рисования линий; возможно, есть в SDL_gfx, я никогда не пробовал. Этот подход может быть лучше, если вы будете использовать OpenGL позже; с SDL (или любой другой обычной библиотекой 2D-рисования) это не слишком полезно.

Другие вопросы по тегам