Альфа-смешивание в SDL сбрасывается после изменения размера окна

Я хотел реализовать альфа-смешивание в своем классе текстур. Это работает почти полностью. Я использую следующие функции для манипулирования альфа-значением:

SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
SDL_SetTextureAlphaMod(texture, alpha);

Единственная проблема, с которой я столкнулся, заключается в том, что манипулируемые текстуры сбрасываются до нормального альфа-значения 255, когда я изменяю размер или увеличиваю окно. Я проверил альфа-значение и понял, что это все еще значение, которым я манипулировал, чтобы быть раньше. Таким образом, значение не равно 255. Почему средство визуализации отображает его так, как если бы значение альфа было 255?

Информация о том, как и когда я использую эти функции:

В основном игровом цикле я изменяю альфа-значение текстуры с помощью открытого метода моего класса Texture:

Texture::setAlphaValue(int alpha)

Там приватная альфа-переменная класса Texture изменяется.

В методе Draw моего класса Texture текстура рисуется, и я вызываю

 SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
SDL_SetTextureAlphaMod(texture, alpha);

до

 SDL_RenderCopyEx(renderer, texture, &sourceRectangle, &destinationRectangle, 0, 0, SDL_Flip);

Информация о том, как я изменяю размер окна:

Я просто установил режим окна в окно с изменяемым размером при инициализации SDL. Тогда обработка этого как любое нормальное окно возможна:

SDL_CreateWindow(window_Title, x_Position, y_Position, window_Width, window_Height, SDL_WINDOW_RESIZABLE);

Моя основная область цикла:

Это основной игровой цикл:

 void Game::Render()
{
// set color and draw window

SDL_SetRenderDrawColor(renderer, windowColor.R(), windowColor.G(), windowColor.B(), 0);

SDL_RenderClear(renderer);

texture.setAlphaValue(100);
texture.Draw(SDL_FLIP_NONE);

// present/draw renderer

SDL_RenderPresent(renderer);
}

Протестируйте мой проект:

Я также загрузил свой тестовый проект альфа-смешивания в Dropbox. В этом проекте я все упростил, больше нет даже класса текстур. Так что код действительно прост, но ошибка все еще есть. Вот ссылка на проект Visual Studio: http://www.dropbox.com/s/zaipm8751n71cq7/Alpha.rar

0

Решение

SDL_SetTextureBlendMode (текстура, SDL_BLENDMODE_BLEND);

Вы должны напрямую изменить альфа в этой области.

пример: альфа = 100;

SDL_SetTextureAlphaMod (текстура, альфа); // помните, что альфа является int

SDL_RenderCopy (рендер, текстура, NULL, &Прямоугольник);

Постскриптум Если вы собираетесь использовать эффект постепенного исчезновения / постепенного увеличения, изменение размера временно приостановит альфа-изменения (в случае, если вы использовали SDL_GetTicks () и сделали float для медленного уменьшения / увеличения альфа с течением времени. Это потому, что окна приостанавливает рендеринг внутри программы, но после прекращения изменения размера она возобновляется.

Еще один П.С. Поскольку вы изменяете размер окна, убедитесь, что значения w и h назначены не как числа, а как произведения или динамические числа (умножение выполняется быстрее, чем деление, но вы также можете использовать деление).
Назначение статических чисел приведет к изменению размера окна, но текстуры внутри не изменят размер.

Удачного кодирования 🙂

0

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

Окей, это похоже на ошибку. Я не единственный, у кого есть эта проблема: кто-то уже сообщил об этом как об ошибке багтрекеру. Вот ссылка: https://bugzilla.libsdl.org/show_bug.cgi?id=2202.

Надеюсь, команда SDL это исправит!

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector