我正在尝试用OpenTK编写游戏。 我想每次从GL课程中调用一些东西时检查错误。
所以,让我说,我有这个课程:
public static class GLCheck
{
public static void Call(function f)
{
// Call f function
CheckError();
}
public static void CheckError()
{
ErrorCode errorCode = GL.GetError();
if (errorCode != ErrorCode.NoError)
Console.WriteLine("Error!");
}
}
所以我可以这样调用函数:
GLCheck.Call(GL.ClearColor(Color.White));
GLCheck.Call(GL.MatrixMode(MatrixMode.Modelview));
GLCheck.Call(GL.PushMatrix());
我该怎么做? 感谢
----------------- 答案: -----------------
感谢您的回答! 我只是意识到所有答案都使用了委托(行动或 Func<> ) 在.NET 2.0上,这不可用,所以你必须创建自己的,这里是我的GLCheck类:
public static class GLCheck
{
public delegate void Action();
public delegate void Action<T1, T2>(T1 arg1, T2 arg2);
public delegate void Action<T1, T2, T3>(T1 arg1, T2 arg2, T3 arg3);
public delegate void Action<T1, T2, T3, T4>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
public delegate TResult Func<TResult>();
public delegate TResult Func<T, TResult>(T arg);
public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2);
public delegate TResult Func<T1, T2, T3, TResult>(T1 arg1, T2 arg2, T3 arg3);
public delegate TResult Func<T1, T2, T3, T4, TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
public static void Call(Action callback)
{
callback();
CheckError();
}
public static void Call<T>(Action<T> func, T parameter)
{
func(parameter);
CheckError();
}
}
再次感谢您的回答!
答案 0 :(得分:2)
它不会很整洁,但您可以使用Lambda函数轻松完成此操作:
GLCheck.Call(() => GL.ClearColor(Color.White));
GLCheck.Call(() => GL.MatrixMode(MatrixMode.Modelview));
GLCheck.Call(() => GL.PushMatrix());
Call
将被定义为:
public static void Call(Action a)
{
a();
CheckError();
}
对于没有参数的方法GL方法,您可以更干净地传递它们:
GLCheck.Call(GL.PushMatrix);
(请注意()
之后没有PushMatrix
。)
答案 1 :(得分:2)
您可以使用泛型来创建这样的内容:
private void Call<T> (Action<T> func, T parameter)
{
func(parameter);
CheckError();
}
其中T将是一个参数。或者您可以按照建议使用例外。
答案 2 :(得分:0)
也许您应该在GL之上编写自己的API,从而产生更清晰的代码。即
public class MyGL
{
private TypeHere GL = new TypeHere();
public void ClearColor(Color color)
{
GL.ClearColor(color);
CheckError();
}
private void CheckError()
{
ErrorCode errorCode = GL.GetError();
if (errorCode != ErrorCode.NoError)
Console.WriteLine("Error!");
}
}
因此,您可以使用更清晰易读的代码来调用它
MyGL.ClearColor(Color.White);