所以我有MonoGame提供的两个类:Color和Vector4。这两个类可以解释为同一事物:Vector4可以存储Color的值R,G,B和A。我正在尝试编写一个隐式(如果需要,也可以使用显式)转换运算符,以从Color转换为Vector4。不用写MonoGame的源代码怎么办?
尝试在不相关的类中定义一个将导致令人恐惧的“用户定义的转换必须转换为封闭类型或从封闭类型转换”,并且在名称空间本身(而不是类)中进行转换会导致更可怕的错误。
这是我要潜入某个地方的一个示例:
public static explicit operator Vector4(Color color)
{
return new Vector4(color.R, color.G, color.B, color.A);
}
我将如何潜入上述代码?如果不可能,是否有解决方法?
答案 0 :(得分:3)
最可能获得的是每种要转换类型的扩展方法。
public static class Extensions
{
public Vector4 ToVector4(this Color color)
{
return //do conversion to vector4
}
public Color ToColor(this Vector4 vector)
{
return //do conversion to Color
}
}
那并不是所有的Vector4
都可能代表@Camilo Terevinto指出的颜色。
答案 1 :(得分:0)
MonoGame的Color
类已经包含一个.ToVector4()
实例方法。
请参见MonoGame源git中的Color.cs。
它返回一个Vector4
,其值在0到1之间。
返回行程Vector4 to Color
由Color
构造函数提供,该构造函数将Vector4
作为其唯一参数。
该值可以直接传递给着色器函数。
我知道您正在为此寻求明确的演员表。
这是一个非常简单的过程:
在MonoGame.Framework / Color.cs的类中添加以下行
public static explicit operator Vector4(Color color)
{
return new Vector4(color.R / 255f, color.G / 255f, color.B / 255f, color.A / 255f);
}
为每个目标平台编译框架。
如果您使用的是Visual Studio,则将MonoGame项目作为解决方案的一部分包含在其中,然后将其添加到项目的References(同时删除现有的MonoGame References)会更容易。
将Framework Dll复制到目标目录中现有的Dll上。
重建项目。在某些情况下,您可能必须重复步骤4。