2014-01-14 40 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

你可以做任何事情都有優點和缺點。你只需要考慮哪些是你的優先事項,快速的方式來做事或更多的控制。 –