2016-02-15 3 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); 
     } 

В исходном экземпляре примера игры обернут в выражении «using», но я не вижу никакой разницы с этим, одна вещь, которую я не могу сделать, - сделать глобальную игру, , почему я хочу? потому что я не могу понять, как обновить «i» в игровом экземпляре с помощью tk1.numbericUpDown1.value .... объяснение?

+1

Знаете ли вы, что означает 'использование' в вашем контексте? –

+1

установка i на уровне класса в качестве члена публичного экземпляра в классе игры? – 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 на числовое значение.) – doggy

+0

@doggy Это просто ключ к тому, как вы можете работать с I. Вы можете делать с я все, что ты хочешь. Я обновил ответ с примером, который обновляет i после каждого нажатия на numbericUpDown1. – Valentin

1

1.using оператор используется так, что Game объект правильно получает расположенный после использования (когда заканчивается использованием заявление).

Как правило, при использовании объекта IDisposable вы должны объявить и создать экземпляр в операторе using. Оператор using вызывает метод Dispose на объекте правильным образом, и (когда вы используете его , как показано выше), он также приводит к тому, что сам объект выходит из области , как только вызывается 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); 
     } 
} 
+0

+1! Я пробовал этот пример, отлично работает! (моя неудача, когда я сделал игру публичной), также спасибо за объяснение dispose, это очистит проблему, которую я замечал, работая с другими файлами класса, я буду использовать обратную связь, но не C# предположительно, чтобы утилизировать автоматически? – doggy

+1

@doggy Вы правы. У C# есть встроенная сборка мусора, но многие из них связаны с различными условиями, основанными на том, когда инфраструктура решила «собрать». См. Здесь для получения дополнительной информации: https://msdn.microsoft.com/en-us/library/ee787088(v=vs.110).aspx.Кроме того, если это вам помогло, и вы чувствуете, что на ваш вопрос ответили, пожалуйста, не забудьте принять ответ, нажав галочку :) –

+0

Еще раз спасибо ребятам! мои контрольные отметки будут отображаться для вас обоих после того, как я получу лучшее представление! ... нужно еще 2 часа! – doggy

Смежные вопросы