【发布时间】:2015-04-04 16:55:50
【问题描述】:
我想在我的 Texture 类中实现 alpha 混合。它几乎完全有效。我使用以下函数来操作 alpha 值:
SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
SDL_SetTextureAlphaMod(texture, alpha);
我遇到的唯一问题是,当我调整或最大化窗口时,已操作的纹理似乎重置为正常的 alpha 值 255。我检查了 alpha 值,发现它仍然是我之前操纵它的值。所以这个值不是 255。为什么渲染器会渲染它,就好像 alpha 值是 255 一样呢?
有关我如何以及何时使用这些功能的信息:
在主游戏循环中,我使用 Texture 类的公共方法更改纹理的 alpha 值:
Texture::setAlphaValue(int alpha)
Texture 类的私有 alpha 变量已更改。
在我的 Texture 类的 Draw 方法中,纹理被绘制,我调用
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);
}
测试我的项目:
我还将我的 alpha 混合测试项目上传到了 Dropbox。在这个项目中,我简化了一切,甚至不再有纹理类。所以代码真的很简单,但是bug还是存在的。这是 Visual Studio 项目的链接:http://www.dropbox.com/s/zaipm8751n71cq7/Alpha.rar
【问题讨论】:
-
如何调整窗口大小?
-
@Zammalad 我将窗口模式设置为 SDL_WINDOW_RESIZABLE 然后它就像任何程序一样只是一个普通窗口,可以通过将鼠标移动到它的边框来调整大小。
-
所以你调用
SDL_SetTextureBlendMode和SDL_SetTextureAlphaMod每一帧,即在调用中绘制纹理。您的纹理类是否存储值alpha或者是您传递给Draw函数的参数。 -
您使用的是哪个版本的 SDL?
-
看起来很奇怪。我现在忙于很多工作,但在周末我会尝试将一个基本的应用程序放在一起来反映你正在做的事情,看看我是否能得到同样的效果。听起来你做的一切都是正确的。我还建议在 SDL 论坛上发帖询问是否有人也看过此内容。
标签: c++ sdl alpha sdl-2 blending