c#将变量传递给类

时间:2016-02-15 16:24:01

标签: c# using opentk game-loop

这是我的游戏类的例子(打开opentk图形窗口)

   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);
        }

在原始示例中,游戏实例包含在“using”语句中,但我认为没有区别,我不能做的一件事是让游戏全局化, 我为什么要这样?因为我无法弄清楚如何使用tk1.numbericUpDown1.value更新游戏实例中的“i”.... 解释

2 个答案:

答案 0 :(得分: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;
        }

答案 1 :(得分:1)

1。使用using语句,以便Game对象在使用后正确处理(当using语句结束时)。

  

通常,当您使用IDisposable对象时,您应该声明和   在using语句中实例化它。 using语句调用   以正确的方式处理对象上的方法,以及(当您使用它时)   如前所示)它也会导致对象本身超出范围   一旦调用Dispose就会。

建议正确配置您的游戏对象,否则很有可能会出现内存泄漏。如果您更新代码以使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);
        }
}