2016-02-15 127 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