Answers:
最简单的方法是为其创建一个着色器(请参见下面的代码)。将所有内容绘制到渲染目标,然后使用着色器将其绘制到后台缓冲区
在玩家死后的游戏代码记录中,然后在后续渲染中,根据
CurrentTime-DeadTime / FadeTime
float ColourAmount;
Texture coloredTexture;
sampler coloredTextureSampler = sampler_state
{
texture = <coloredTexture>;
};
float4 GreyscalePixelShaderFunction(float2 textureCoordinate : TEXCOORD0) : COLOR0
{
float4 color = tex2D(coloredTextureSampler, textureCoordinate);
float3 colrgb = color.rgb;
float greycolor = dot(colrgb, float3(0.3, 0.59, 0.11));
colrgb.rgb = lerp(dot(greycolor, float3(0.3, 0.59, 0.11)), colrgb, ColourAmount);
return float4(colrgb.rgb, color.a);
}
technique Grayscale
{
pass GreyscalePass
{
PixelShader = compile ps_2_0 GreyscalePixelShaderFunction();
}
}
使用0.3、0.59和0.11的原因是因为人眼无法平等地对待颜色,因此这些值可以提供更好的灰度图像。
编辑
考虑一下之后,如果您不对任何事物进行任何着色,而是使用图形原始颜色,则可以将所有绘制对象的颜色(如我声明的那样)设置为声明的Color变量,并将其设置为白色。(Color NoTint = Color.White;),然后使玩家生存的Lerp等于零。使用NoTint Color绘制的每个对象都将缓慢变化(根据下面提到的插值速率),变为您要对其进行设置的对象。
但是,如果您对不同的对象有不同的色彩,则下面的foreach循环可能会起作用。
结束编辑
以我的有限知识,我会尝试这种方法:声明绘制特定对象时使用的颜色,例如。颜色catColor = Color.Brown,然后将所有游戏颜色添加到列表中。
public static Color catColor = Color.Brown;
List<Color> colorList = new List<Color>(){ catColor }; // and other colors
float interpolation = 0f;
float interpolationRate = .01f;
.
.
.
if(playerLives == 0)
{
interpolation += interpolationRate;
if (interpolation >= 1)
{interpolation = 1;}
foreach(Color c in colorList)
{
Color.Lerp(c, Color.Gray, interpolation);
}
}
您甚至可以对不带颜色绘制的项目执行此操作,然后将Color.White转换为Color.Gray。(将其命名为Color NoTint = Color.White,然后将其放在所有绘制的对象上)
也许有更好的方法,不管我希望这会有所帮助!