SFML / C ++闪存对sf :: Sprite的影响

时间:2018-01-31 17:40:05

标签: c++ shader sfml

当我搜索解决方案时,我只是意识到sfml在sf :: Sprite对象上处理setColor的方式。 它只是精灵中每个像素的当前RGB值的乘法。

这样就不可能对精灵产生“白色”闪烁效果。 通过闪烁命中效果,我的意思是:当你击中一个敌人时,它会变成纯白色一秒钟,然后这个效果很快消失,直到精灵是它的原始形态。

如何在SFML上实现这种白色闪烁命中效果? (也许使用着色器?)

感谢

2 个答案:

答案 0 :(得分:2)

似乎最好的解决方案是为此编写自己的着色器。 我用这种方式解决了这个问题。这是代码:

<强> tint.frag

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);

通过chaning flashColor.a,您可以更改着色效果。 0是原始颜色,1是用您想要的颜色完全着色纹理。

答案 1 :(得分:0)

我认为没有开箱即用的解决方案。

但是,您可以尝试通过创建一个与想要制作动画的敌人大小相关的白色精灵来创建您的动画。在游戏过程中,您将白色精灵的透明度设置为0以使其不可见(使用您提到的setColor),并且当击中敌人时,将透明度值设置为255.然后您可以随着时间的推移减少它“消失”效应。