【问题标题】:SFML/C++ Flashing hit effect on sf::SpriteSFML/C++ 对 sf::Sprite 的闪烁命中效果
【发布时间】:2018-01-31 17:40:05
【问题描述】:

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

这样就不可能在精灵上制作“白色”闪烁的命中效果。 闪烁的命中效果是指:当你击中一个敌人时,它会变成纯白色的一秒钟,然后这种效果会迅速消失,直到精灵变成原来的样子。

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

谢谢

【问题讨论】:

  • sfml-dev.org/tutorials/2.4/graphics-shader.php 是的 - 着色器可以解决这个问题
  • 谢谢,但是还有其他方法吗?喜欢这项工作的 sfml 课程吗?
  • 你也可以为每个精灵使用一个精灵表——当然,这可能最终需要更多的工作,这取决于有多少精灵必须拥有该动画......
  • 是的,适用于 3-5 个精灵,但对于当前有 100 多个敌人的项目来说,这是不可能的。

标签: c++ shader sfml


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我认为没有现成的解决方案。

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

    【讨论】:

    • 感谢您的回复,但这是不可能或有效的,因为会有 100 + 个敌人
    猜你喜欢
    • 2012-04-05
    • 2017-04-22
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多