[英]SFML/C++ Flashing hit effect on sf::Sprite
在寻找解决方案时,我仅意识到sfml处理sf :: Sprite对象上的setColor的方式。 它只是精灵中每个像素当前RGB值的乘积。
这样就不可能在子画面上产生“白色”闪烁击打效果。 通过闪烁的击中效果,我的意思是:当您击中敌人时,它将变成纯白色一秒钟,然后该效果迅速消失,直到精灵变成它的原始形式。
如何在SFML上产生白色闪烁的效果? (也许使用着色器?)
谢谢
似乎最好的解决方案是为此编写自己的着色器。 我已经通过这种方式解决了这个问题。 这是代码:
色彩片段
uniform sampler2D texture;
uniform vec4 flashColor;
void main()
{
vec4 pixel_color = texture2D(texture, gl_TexCoord[0].xy);
float percent = flashColor.a;
vec4 colorDifference = vec4(0,0,0,1);
colorDifference.r = flashColor.r - pixel_color.r;
colorDifference.g = flashColor.g - pixel_color.g;
colorDifference.b = flashColor.b - pixel_color.b;
pixel_color.r = pixel_color.r + colorDifference.r * percent;
pixel_color.g = pixel_color.g +colorDifference.g * percent;
pixel_color.b =pixel_color.b + colorDifference.b * percent;
gl_FragColor = pixel_color;
}
要使用tint.frag文件(这是一个着色器文件),您应该通过以下方式将flashColor值发送到sf :: Shader对象:
.cpp代码
flashColor.a = 1.0;//1.0 for 100% effect to 0.0 for 0% effect
shader.loadFromFile("shader/tint.frag", sf::Shader::Fragment);//use your own
//file path
shader.setUniform("flashColor", sf::Glsl::Vec4(1, 0, 0, 1));//from left to
//right: red,green,blue,alpha. Alpha is useless in this shader file.
//max is 1, not 255.
window.draw(yoursprite, &shader);
通过更改flashColor.a,可以更改着色效果。 0是原始颜色,1是使用所需颜色完全着色纹理。
我认为没有针对此问题的现成解决方案。
但是,您可以尝试使用具有想要制作动画的敌人大小的白色精灵来创建自己的精灵,然后跟随它。 在游戏过程中,将白色精灵的透明度设置为0以使其不可见(如您所提到的,使用setColor),当击中敌人时,将透明度值设置为255。然后可以随时间减小它的透明度, “淡出”效果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.