2012-03-04 3 views
0

Я хотел бы создать поддельный эффект «взрыва» в SDL. Для этого я хотел бы, чтобы экран шел от того, что он в настоящее время, и исчезает до белого.SDL Transparent Overlay

Первоначально я думал об использовании SDL_FillRect как так (где explosionTick является текущим значением альфа):

SDL_FillRect(screen , NULL , SDL_MapRGBA(screen->format , 255, 255 , 255, explosionTick)); 

Но вместо обратного замирания прямоугольника, он показывает совершенно белый не альфа. Другой метод, который я пытался участвовать, используя полноэкранный режим растрового изображения, заполненный прозрачным белым (с альфа-значением 1), и блитирования его один раз для каждого explosionTick так:

 for(int a=0; a<explosionTick; a++){ 
      SDL_BlitSurface(boom, NULL, screen, NULL); 
     } 

Но это закончилось тем, что замедлится до работать в режиме реального времени. Есть ли простой способ достичь этого эффекта без потери производительности? Спасибо за ваше время.

+0

Использовать значение альфа больше 1? Он будет менее плавным, но быстрее. – Alink

+0

Хотя использование альфа-приращения больше 1 будет работать для метода изображения, я надеялся, что существует другой метод, чем использование готового изображения. – Shalmezad

ответ

1

Ну, вам нужно смешивать и AFAIK, единственный способ, которым SDL делает это с SDL_Blitsurface. Так что вам просто нужно оптимизировать этот blit. Я предлагаю сравнить эти:

  • попытаться использовать SDL_SetAlpha для использования на поверхности альфа вместо пиксельной альфы. Теоретически, для SDL меньше работы, поэтому вы можете надеяться на некоторую скорость. Но я никогда не сравнивал его и имел некоторые проблемы с этим в прошлом.
  • вам действительно не нужен полноэкранный растровый рисунок, просто повторите толстую строку. Он должен быть менее интенсивным в памяти и, возможно, есть усиление кеша. Также вы, вероятно, можете подделать некоторую гладкость, выполняя половину строк на каждом проходе (меньше пикселей до blit и все равно должны выглядеть глобальным эффектом экрана).
  • для обеспечения оптимальной производительности, убедитесь, что ваше растровое изображение находится в формате отображения. Проверьте SDL_DisplayFormatAlpha или, возможно, SDL_DisplayFormat, если вы используете per-surface alpha
+0

Спасибо. Я надеялся, что было более элегантное решение, но похоже, что бьющий - это путь. – Shalmezad

+0

Чтобы быть полным, возможно, злоупотребление SDL_SetGamma может дать вам аналогичный эффект, но это плохая идея. Плюс в некоторых системах это ненадежно. – Alink