这是我的游戏类的例子(打开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”.... 解释
答案 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);
}
}