Я хотел реализовать альфа-смешивание в своем классе текстур. Это работает почти полностью. Я использую следующие функции для манипулирования альфа-значением:
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
SDL_SetTextureBlendMode (текстура, SDL_BLENDMODE_BLEND);
Вы должны напрямую изменить альфа в этой области.
пример: альфа = 100;
SDL_SetTextureAlphaMod (текстура, альфа); // помните, что альфа является int
SDL_RenderCopy (рендер, текстура, NULL, &Прямоугольник);
Постскриптум Если вы собираетесь использовать эффект постепенного исчезновения / постепенного увеличения, изменение размера временно приостановит альфа-изменения (в случае, если вы использовали SDL_GetTicks () и сделали float для медленного уменьшения / увеличения альфа с течением времени. Это потому, что окна приостанавливает рендеринг внутри программы, но после прекращения изменения размера она возобновляется.
Еще один П.С. Поскольку вы изменяете размер окна, убедитесь, что значения w и h назначены не как числа, а как произведения или динамические числа (умножение выполняется быстрее, чем деление, но вы также можете использовать деление).
Назначение статических чисел приведет к изменению размера окна, но текстуры внутри не изменят размер.
Удачного кодирования 🙂
Окей, это похоже на ошибку. Я не единственный, у кого есть эта проблема: кто-то уже сообщил об этом как об ошибке багтрекеру. Вот ссылка: https://bugzilla.libsdl.org/show_bug.cgi?id=2202.
Надеюсь, команда SDL это исправит!