2016-02-15 123 views
-5

我這裏是我的遊戲類的(打開opentk圖形窗口)C#傳遞變量

class Game : GameWindow 
    { 
     public Game() : base(320, 240, OpenTK.Graphics.GraphicsMode.Default, "OpenTK Quick Start Sample") 
     { 
      VSync = VSyncMode.On; 
     }  
     protected override void OnLoad(EventArgs e) 
     { 
      base.OnLoad(e); 
      GL.ClearColor(0.1f, 0.2f, 0.5f, 0.0f); 
      GL.Enable(EnableCap.DepthTest); 
     } 
     protected override void OnRenderFrame(FrameEventArgs e) 
     { 
      int i =1; 
      //does stuff 
     } 

遊戲類開始是這樣的:

public partial class tk1 : Form 
    { 
     public tk1() 
     { 
      InitializeComponent(); 
     } 

     private void tk1_Load(object sender, EventArgs e) 
     { 
      Game game; 
      this.Show(); 
      game = new Game(); 
      game.Run(30.0); 
     } 

在原來的例子游戲實例被包裹在「使用」聲明中,但我看不出有什麼區別,我不能做的一件事就是讓遊戲全球化, 爲什麼我想要?因爲我無法弄清楚如何在tk1.numbericUpDown1.value中更新遊戲實例中的「我」...... 解釋?

+1

你知道在你的上下文中使用什麼? –

+1

在課堂級別將我設置爲Game類中的公共實例成員? – Viru

回答

1

您應該將您的i字段公開或將其設爲公共屬性,以便您可以從外部訪問它。

class Game : GameWindow 
    { 
     public int i; 

    public Game() : base(320, 240, OpenTK.Graphics.GraphicsMode.Default, "OpenTK Quick Start Sample") 
    { 
     VSync = VSyncMode.On; 
    }  
    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 
     GL.ClearColor(0.1f, 0.2f, 0.5f, 0.0f); 
     GL.Enable(EnableCap.DepthTest); 
    } 
    protected override void OnRenderFrame(FrameEventArgs e) 
    { 
     i =1; 
     //does stuff 
    } 
} 

然後你可以從tk1類訪問這個字段。

public partial class tk1 : Form 
    { 
     Game game; 
     public tk1() 
     { 
      InitializeComponent(); 
     } 

     private void tk1_Load(object sender, EventArgs e) 
     { 
      this.Show(); 
      game = new Game(); 
      game.Run(30.0); 
      game.i = 10; 
     } 

     private void numbericUpDown1_Click (object sender, EventArgs e) 
     { 
       game.i = tk1.numbericUpDown1; 
     } 
+0

謝謝,但雖然它通過,它只在一次加載過程中,沒有更新數字框更改(即使更改10後numericupdown.value) – doggy

+0

@ doggy這只是一個線索你如何能與我一起工作。你可以做我無論你想要什麼。我更新了答案,並在每次點擊numbericUpDown1後更新我的例子。 – Valentin

1

1.using語句用於使得Game對象適當地被佈置在使用後(當使用語句結束)。

通常,當您使用IDisposable對象時,您應聲明並在使用語句中將其實例化爲 。 using語句以正確的方式在對象上調用 Dispose方法,並且(如前所示使用 時)也會在調用Dispose後立即超出範圍 。

建議正確配置Game對象,否則很可能會發生內存泄漏。如果更新代碼以使Game變量是類範圍(而不是方法),則可以將其置於類的終結器中。

~tk1() 
{ 
    _game.Dispose(); 
} 

更多info

2.爲了實現你所需要的,你不想創建一個你的Game對象的本地實例,因爲無論何時該方法完成執行,它將不再可用於其他地方。相反,將您的Game對象移到類級別。

public partial class tk1 : Form 
    { 
     private Game _game; 

     public tk1() 
     { 
      InitializeComponent(); 
     } 

     private void tk1_Load(object sender, EventArgs e) 
     { 
      this.Show(); 
      if (_game == null) _game = new Game(); 
      _game.Run(30.0); 
     } 
} 
+0

+1!我試過這個例子很棒! (我的遊戲失敗時我公開)也感謝解釋的配置,這將清理一個問題,我一直在注意與其他類文件的工作,我會放回去使用,但不是c#會自動處置? – doggy

+1

@doggy你是對的。 C#確實有內置的垃圾收集功能,但是它的很多內容都與基於框架決定「收集」的不同條件有關。有關詳細信息,請參閱此處:https://msdn.microsoft.com/en-us/library/ee787088(v=vs.110).aspx。此外,如果這有助於您,並且您認爲您的問題得到解答,請不要忘記通過按複選標記接受答案:) –

+0

再次感謝您們!在我得到更好的代表後,我的複選標記將顯示給你們兩個人......只需要2個點! – doggy