производительность — 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

Результат

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

3

Решение

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

1.

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

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

2.

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]