Поделиться через


Введение в OpenTK в Xamarin.Mac

OpenTK (Open набор средств) — это расширенная низкоуровневая библиотека C#, которая упрощает работу с OpenGL, OpenCL и OpenAL. OpenTK можно использовать для игр, научных приложений или других проектов, требующих трехмерной графики, аудио или вычислительной функциональности. В этой статье приводится краткое введение в использование OpenTK в приложении Xamarin.Mac.

Пример запуска приложения

В этой статье мы рассмотрим основы OpenTK в приложении Xamarin.Mac. Настоятельно рекомендуется сначала ознакомиться со статьей Hello, Mac , в частности в разделах "Введение в Xcode" и "Конструктор интерфейсов" и "Торговых точек" и "Действия ", поскольку рассматриваются основные понятия и методы, которые мы будем использовать в этой статье.

Вы можете ознакомиться с классами И методами C# вObjective-Cразделе документа Xamarin.Mac Internals, а также объяснить RegisterExport команды, используемые для подключения классов C# к Objective-C объектам и элементам пользовательского интерфейса.

О OpenTK

Как упоминалось выше, OpenTK (Open набор средств) — это расширенная низкоуровневая библиотека C#, которая упрощает работу с OpenGL, OpenCL и OpenAL. Использование OpenTK в приложении Xamarin.Mac предоставляет следующие возможности:

  • Быстрая разработка — OpenTK предоставляет надежные типы данных и встроенную документацию для улучшения рабочего процесса программирования и перехвата ошибок проще и быстрее.
  • Простая интеграция — OpenTK была разработана для легкой интеграции с приложениями .NET.
  • Разрешительная лицензия — OpenTK распространяется в соответствии с лицензиями MIT/X11 и полностью бесплатно.
  • Расширенные привязки type-Сейф — OpenTK поддерживает последние версии OpenGL, OpenGL|ES, OpenAL и OpenCL с автоматической загрузкой расширений, проверка проверка и встроенной документацией.
  • Гибкие параметры графического интерфейса — OpenTK предоставляет собственное, высокопроизводительные окно игры, разработанное специально для игр и Xamarin.Mac.
  • Полностью управляемый, CLS-совместимый код . OpenTK поддерживает 32-разрядные и 64-разрядные версии macOS без неуправляемых библиотек.
  • Трехмерные математические набор средств поставки QuaternionVectorMatrixOpenTK и Bezier структуры с помощью 3D-математических набор средств.

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

Дополнительные сведения см. на веб-сайте Open набор средств.

Краткое руководство по OpenTK

В качестве краткого руководства по использованию OpenTK в приложении Xamarin.Mac мы создадим простое приложение, которое открывает представление игры, отрисовывает простой треугольник в этом представлении и присоединяет представление игры к главному окну приложения Mac для отображения треугольника пользователю.

Запуск нового проекта

Запустите Visual Studio для Mac и создайте новое решение Xamarin.Mac. Выберите приложение Mac App General>Cocoa:>>

Добавление нового приложения Cocoa

Введите MacOpenTK имя проекта:

Задание имени проекта

Нажмите кнопку "Создать", чтобы создать новый проект.

Включение OpenTK

Прежде чем использовать Open TK в приложении Xamarin.Mac, необходимо включить ссылку на сборку OpenTK. В Обозреватель решений щелкните правой кнопкой мыши папку "Ссылки" и выберите "Изменить ссылки...".

Поместите проверка OpenTK и нажмите кнопку "ОК":

Изменение ссылок на проект

Использование OpenTK

Создав новый проект, дважды щелкните MainWindow.cs файл в Обозреватель решений, чтобы открыть его для редактирования. MainWindow Сделайте класс следующим образом:

using System;
using System.Drawing;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using OpenTK.Platform.MacOS;
using Foundation;
using AppKit;
using CoreGraphics;

namespace MacOpenTK
{
    public partial class MainWindow : NSWindow
    {
        #region Computed Properties
        public MonoMacGameView Game { get; set; }
        #endregion

        #region Constructors
        public MainWindow (IntPtr handle) : base (handle)
        {
        }

        [Export ("initWithCoder:")]
        public MainWindow (NSCoder coder) : base (coder)
        {
        }
        #endregion

        #region Override Methods
        public override void AwakeFromNib ()
        {
            base.AwakeFromNib ();

            // Create new Game View and replace the window content with it
            Game = new MonoMacGameView(ContentView.Frame);
            ContentView = Game;
            Game.OpenGLContext.View = Game;

            // Wire-up any required Game events
            Game.Load += (sender, e) =>
            {
                // TODO: Initialize settings, load textures and sounds here
            };

            Game.Resize += (sender, e) =>
            {
                // Adjust the GL view to be the same size as the window
                GL.Viewport(0, 0, Game.Size.Width, Game.Size.Height);
            };

            Game.UpdateFrame += (sender, e) =>
            {
                // TODO: Add any game logic or physics
            };

            Game.RenderFrame += (sender, e) =>
            {
                // Setup buffer
                GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
                GL.MatrixMode(MatrixMode.Projection);

                // Draw a simple triangle
                GL.LoadIdentity();
                GL.Ortho(-1.0, 1.0, -1.0, 1.0, 0.0, 4.0);
                GL.Begin(BeginMode.Triangles);
                GL.Color3(Color.MidnightBlue);
                GL.Vertex2(-1.0f, 1.0f);
                GL.Color3(Color.SpringGreen);
                GL.Vertex2(0.0f, -1.0f);
                GL.Color3(Color.Ivory);
                GL.Vertex2(1.0f, 1.0f);
                GL.End();

            };

            // Run the game at 60 updates per second
            Game.Run(60.0);
        }
        #endregion
    }
}

Давайте рассмотрим этот код подробно ниже.

Обязательные API

Для использования OpenTK в классе Xamarin.Mac требуется несколько ссылок. В начале определения мы включили следующие using инструкции:

using System;
using System.Drawing;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using OpenTK.Platform.MacOS;
using Foundation;
using CoreGraphics;

Этот минимальный набор будет необходим для любого класса с помощью OpenTK.

Добавление представления игры

Затем необходимо создать представление игры, чтобы содержать все наше взаимодействие с OpenTK и отобразить результаты. Мы использовали следующий код:

public MonoMacGameView Game { get; set; }
...

// Create new Game View and replace the window content with it
Game = new MonoMacGameView(ContentView.Frame);
ContentView = Game;

Здесь мы сделали представление игры таким же размером, как наше главное окно Mac и заменили представление содержимого окна новым MonoMacGameView. Так как мы заменили существующее содержимое окна, представление "Дал" будет автоматически изменено при изменении размера основного окна.

Реагирование на события

Существует несколько событий по умолчанию, на которые должен отвечать каждый игровой вид. В этом разделе рассматриваются основные события, необходимые.

Событие загрузки

Событие Load — это место для загрузки ресурсов из диска, таких как изображения, текстуры или музыка. Для нашего простого тестового приложения мы не используем Load событие, но включили его для справки:

Game.Load += (sender, e) =>
{
    // TODO: Initialize settings, load textures and sounds here
};

Событие изменения размера

Resize Событие должно вызываться при каждом изменении размера представления игры. В нашем примере приложения мы делаем GL Viewport таким же размером, как и представление игры (которое автоматически изменяется в главном окне Mac) со следующим кодом:

Game.Resize += (sender, e) =>
{
    // Adjust the GL view to be the same size as the window
    GL.Viewport(0, 0, Game.Size.Width, Game.Size.Height);
};

Событие UpdateFrame

Событие UpdateFrame используется для обработки входных данных пользователей, обновления позиций объектов, выполнения вычислений физики или ИИ. Для нашего простого тестового приложения мы не используем UpdateFrame событие, но включили его для справки:

Game.UpdateFrame += (sender, e) =>
{
    // TODO: Add any game logic or physics
};

Внимание

Реализация OpenTK Xamarin.Mac не включает в себя Input API, поэтому вам потребуется использовать предоставленные API Apple для добавления поддержки клавиатуры и мыши. При необходимости можно создать пользовательский экземпляр MonoMacGameView и переопределить KeyDown методы.KeyUp

Событие RenderFrame

Событие RenderFrame содержит код, используемый для отрисовки (рисования) графики. В нашем примере приложения мы заполняем представление игры простым треугольником:

Game.RenderFrame += (sender, e) =>
{
    // Setup buffer
    GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
    GL.MatrixMode(MatrixMode.Projection);

    // Draw a simple triangle
    GL.LoadIdentity();
    GL.Ortho(-1.0, 1.0, -1.0, 1.0, 0.0, 4.0);
    GL.Begin(BeginMode.Triangles);
    GL.Color3(Color.MidnightBlue);
    GL.Vertex2(-1.0f, 1.0f);
    GL.Color3(Color.SpringGreen);
    GL.Vertex2(0.0f, -1.0f);
    GL.Color3(Color.Ivory);
    GL.Vertex2(1.0f, 1.0f);
    GL.End();

};

Обычно код отрисовки будет вызывать GL.Clear удаление существующих элементов перед рисованием новых элементов.

Внимание

Для версии Xamarin.Mac OpenTK метод экземпляра MonoMacGameView не вызывается SwapBuffers в конце кода отрисовки. Это приведет к быстрому просмотру игры вместо отображения отображаемого представления.

Запуск игрового представления

При определении всех необходимых событий и представлении игры, присоединенном к главному окну Mac приложения, мы читаем, чтобы запустить представление игры и отобразить нашу графику. Используйте следующий код:

// Run the game at 60 updates per second
Game.Run(60.0);

Мы передаваем нужную частоту кадров, которую мы хотим, чтобы представление игры обновлялось, например, мы выбрали 60 кадры в секунду (ту же частоту обновления, что и обычный телевизор).

Давайте запустите наше приложение и просмотрите выходные данные:

Пример выходных данных приложений

Если изменить размер окна, представление игры также будет находиться, и треугольник будет изменен и обновлен в режиме реального времени.

Где дальше?

С основами работы с OpenTk в приложении Xamarin.mac ниже приведены некоторые рекомендации по работе с OpenTk:

  • Попробуйте изменить цвет треугольника и фоновый цвет представления игры в Load и RenderFrame событиях.
  • Измените цвет треугольника, когда пользователь нажимает клавишу в UpdateFrame событиях или RenderFrame делает собственный пользовательский MonoMacGameView класс и переопределяет KeyUp методы.KeyDown
  • Сделайте треугольник перемещаться по экрану с помощью знают ключи в событии UpdateFrame . Указание. Используйте Matrix4.CreateTranslation метод для создания матрицы перевода и вызова GL.LoadMatrix метода для его загрузки в событии RenderFrame .
  • for Используйте цикл для отрисовки нескольких треугольников в событииRenderFrame.
  • Поворот камеры для предоставления другого представления треугольника в трехмерном пространстве. Указание. Используйте Matrix4.CreateTranslation метод для создания матрицы перевода и вызова GL.LoadMatrix метода для его загрузки. Вы также можете использовать Vector2Vector3Vector4 классы и Matrix4 классы для манипуляций с камерой.

Дополнительные примеры см. в репозитории GitHub "Примеры OpenTK". Он содержит официальный список примеров использования OpenTK. Эти примеры необходимо адаптировать для использования с версией Xamarin.Mac OpenTK.

Итоги

В этой статье описано, как работать с OpenTK в приложении Xamarin.Mac. Мы узнали, как создать окно игры, как подключить окно игры к окну Mac и как отобразить простую фигуру в окне игры.