Введение в 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, а также объяснить Register
Export
команды, используемые для подключения классов 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 без неуправляемых библиотек.
- Трехмерные математические набор средств поставки
Quaternion
Vector
Matrix
OpenTK иBezier
структуры с помощью 3D-математических набор средств.
OpenTK можно использовать для игр, научных приложений или других проектов, требующих трехмерной графики, аудио или вычислительной функциональности.
Дополнительные сведения см. на веб-сайте Open набор средств.
Краткое руководство по OpenTK
В качестве краткого руководства по использованию OpenTK в приложении Xamarin.Mac мы создадим простое приложение, которое открывает представление игры, отрисовывает простой треугольник в этом представлении и присоединяет представление игры к главному окну приложения Mac для отображения треугольника пользователю.
Запуск нового проекта
Запустите Visual Studio для Mac и создайте новое решение Xamarin.Mac. Выберите приложение Mac App General>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
метода для его загрузки. Вы также можете использоватьVector2
Vector3
Vector4
классы иMatrix4
классы для манипуляций с камерой.
Дополнительные примеры см. в репозитории GitHub "Примеры OpenTK". Он содержит официальный список примеров использования OpenTK. Эти примеры необходимо адаптировать для использования с версией Xamarin.Mac OpenTK.
Итоги
В этой статье описано, как работать с OpenTK в приложении Xamarin.Mac. Мы узнали, как создать окно игры, как подключить окно игры к окну Mac и как отобразить простую фигуру в окне игры.