2014-01-14 37 views
1

的调用方法(使用任何参数)我想用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

这听起来像一个可怕的想法调用它。阅读关于例外 –

+0

如果OpenTK围绕错误代码,那么他可以做的事情就不多了。他当然可以在CheckError中引发异常。 –

+0

@ LasseV.Karlsen没错。我没有考虑到这一点。 * Sheepish * –

回答

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后)。

+0

谢谢,这个工作! – SirusDoma

2

您可以使用泛型这样创造的东西:

private void Call<T> (Action<T> func, T parameter) 
{ 
    func(parameter); 
    CheckError(); 
} 

其中T是一个参数。或者你可以按照建议使用异常。

+0

谢谢,这也工作! – SirusDoma

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

谢谢你的回复,但..哇...这个疯狂的,有很多方法,我打电话.. – SirusDoma

+0

你可以做任何事情都有优点和缺点。你只需要考虑哪些是你的优先事项,快速的方式来做事或更多的控制。 –