Только события огня в определенное время в C # - PullRequest
2 голосов
/ 24 ноября 2011

Я пишу видеоигру на C # и хотел бы обрабатывать определенные события (например, события клавиатуры / мыши) только в определенной точке моего игрового цикла. Например, есть ли способ написать что-то вроде следующего:

void gameLoop()
{
    // do updates
    handleAllEvents();
    render();
}

Если событие происходит в какой-то другой точке цикла, я хотел бы подождать, пока handleAllEvents() не обработает их. Под «событиями» я подразумеваю стандартную систему событий C #, например:

public event Action<object, KeyboardEventArgs> KeyPressed;

Пожалуйста, дайте мне знать, если вопрос не сформулирован четко. Спасибо!

Ответы [ 3 ]

5 голосов
/ 24 ноября 2011

Удалите вызов на Application.Run() и создайте свой собственный цикл сообщений.Например, вот так:

void GameLoop()
{
      while (!exitSignal)
      {
          Application.DoEvents();
          render();
      }
}

Затем вы должны убедиться, что рендер не будет оставаться там так долго.

Для получения дополнительной информации я предлагаю вам изучить класс Application, особеннометоды Run() и DoEvents().

1 голос
/ 24 ноября 2011

Если вы используете игровой цикл, вы, как правило, не будете обрабатывать события, вы будете опрашивать устройства ввода, когда они вам понадобятся (то есть в вашем методе handleAllEvents()). Некоторые исследователи быстро сказали мне, что в вы можете найти этот материал в пространстве имен OpenTK.Input и, в частности, в классе KeyboardDevice.

1 голос
/ 24 ноября 2011

Я считаю, что правильным способом сделать это в OpenTK было бы наследование от класса GameWindow, а затем переопределение OnUpdateFrame и OnRenderFrame.Существует решение QuickStart, включенное при извлечении соединительной линии, проверьте файл Game.cs.

[Изменить] Чтобы уточнить, класс OpenTK.GameWindow предоставляетKeyboard свойство (типа OpenTK.Input.KeyboardDevice ), которое следует читать внутри OnUpdateFrame.Нет необходимости обрабатывать события клавиатуры отдельно, так как это уже обрабатывается базовым классом.

/// <summary>
/// Called when it is time to setup the next frame. Add you game logic here.
/// </summary>
protected override void OnUpdateFrame(FrameEventArgs e)
{
    base.OnUpdateFrame(e);
    TimeSlice();

    // handle keyboard here
    if (Keyboard[Key.Escape])
    {
        // escape key was pressed
        Exit();
    }
}

Также, для более сложного примера, скачайте еще один стартовый комплект из ихстраница интернета.Класс должен выглядеть примерно так:

// Note: Taken from http://www.opentk.com
// Yet Another Starter Kit by Hortus Longus
// (http://www.opentk.com/project/Yask)
partial class Game : GameWindow
{        
    /// <summary>Init stuff.</summary>
    public Game()
      : base(800, 600, OpenTK.Graphics.GraphicsMode.Default, "My Game")
    { VSync = VSyncMode.On; }

    /// <summary>Load resources here.</summary>
    protected override void OnLoad(EventArgs e)
    {
      base.OnLoad(e);
      // load stuff
    }

    /// <summary>Called when your window is resized.
    /// Set your viewport/projection matrix here.
    /// </summary>
    protected override void OnResize(EventArgs e)
    {
      base.OnResize(e);
      // do resize stuff
    }

    /// <summary>
    /// Called when it is time to setup the next frame. Add you game logic here.
    /// </summary>
    protected override void OnUpdateFrame(FrameEventArgs e)
    {
      base.OnUpdateFrame(e);
      TimeSlice();
      // handle keyboard here
    }

    /// <summary>
    /// Called when it is time to render the next frame. Add your rendering code here.
    /// </summary>
    protected override void OnRenderFrame(FrameEventArgs e)
    {
      base.OnRenderFrame(e);
      // do your rendering here
    }

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        using (Game game = new Game())
        {
            game.Run(30.0);
        }
    }
}

Я бы порекомендовал вам загрузить Yask и проверить, как он там реализован.

...