Úvod do OpenTK v Xamarin.Mac
OpenTK (The Open Toolkit) je pokročilá a nízkoúrovňová knihovna C#, která usnadňuje práci s OpenGL, OpenCL a OpenAL. OpenTK lze použít pro hry, vědecké aplikace nebo jiné projekty, které vyžadují 3D grafiku, zvuk nebo výpočetní funkce. Tento článek obsahuje stručný úvod k používání OpenTK v aplikaci Xamarin.Mac.
V tomto článku se budeme zabývat základy OpenTK v aplikaci Xamarin.Mac. Důrazně doporučujeme, abyste si nejprve prošli článek Hello, Mac , konkrétně úvod do Xcode a Tvůrce rozhraní a výstupy a akce , protože se zabývá klíčovými koncepty a technikami, které budeme používat v tomto článku.
Možná se také budete chtít podívat na oddíly v dokumentu Interní dokumenty Xamarin.Mac pro zveřejnění tříd a metodObjective-Cjazyka C#. Vysvětluje také, které Register
příkazy a Export
které se používají k připojení tříd jazyka C# k Objective-C objektům a prvkům uživatelského rozhraní.
O openTK
Jak je uvedeno výše, OpenTK (The Open Toolkit) je pokročilá a nízkoúrovňová knihovna jazyka C#, která usnadňuje práci s OpenGL, OpenCL a OpenAL. Použití OpenTK v aplikaci Xamarin.Mac poskytuje následující funkce:
- Rychlý vývoj – OpenTK poskytuje silné datové typy a vloženou dokumentaci ke zlepšení pracovního postupu psaní kódu a snadnějšímu a rychlejšímu zachycení chyb.
- Snadná integrace – OpenTK byl navržen tak, aby se snadno integroval s aplikacemi .NET.
- Permissive License – OpenTK se distribuuje v rámci licencí MIT/X11 a je zcela zdarma.
- Bohaté vazby typu Sejf – OpenTK podporuje nejnovější verze OpenGL, OpenGL|ES, OpenAL a OpenCL s automatickým načítáním rozšíření, kontrolou chyb a vloženou dokumentací.
- Flexibilní možnosti grafického uživatelského rozhraní – OpenTK poskytuje nativní vysoce výkonné herní okno navržené speciálně pro hry a Xamarin.Mac.
- Plně spravovaný kód kompatibilní se specifikací CLS – OpenTK podporuje 32bitové a 64bitové verze systému macOS bez nespravovaných knihoven.
- 3D Math Toolkit OpenTK dodává ,
Vector
Matrix
Quaternion
aBezier
struktury prostřednictvím 3D Math Toolkit.
OpenTK lze použít pro hry, vědecké aplikace nebo jiné projekty, které vyžadují 3D grafiku, zvuk nebo výpočetní funkce.
Další informace najdete na webu Open Toolkit .
Rychlý start openTK
Jako rychlý úvod k použití OpenTK v aplikaci Xamarin.Mac vytvoříme jednoduchou aplikaci, která otevře herní zobrazení, vykreslí jednoduchý trojúhelník v tomto zobrazení a připojí herní zobrazení k hlavnímu okně aplikace Mac, aby se zobrazil trojúhelník uživateli.
Spuštění nového projektu
Spusťte Visual Studio pro Mac a vytvořte nové řešení Xamarin.Mac. Vyberte aplikaci Mac>General>Cocoa App:>
Zadejte MacOpenTK
název projektu:
Kliknutím na tlačítko Vytvořit sestavíte nový projekt.
Zahrnutí openTK
Než budete moct použít Open TK v aplikaci Xamarin.Mac, musíte zahrnout odkaz na sestavení OpenTK. V Průzkumník řešení klikněte pravým tlačítkem myši na složku Reference a vyberte Upravit odkazy....
Umístěte kontrolu a OpenTK
klikněte na tlačítko OK :
Použití OpenTK
Po vytvoření nového projektu poklikejte na MainWindow.cs
soubor v Průzkumník řešení ho otevřete pro úpravy. Udělejte třídu MainWindow
takto:
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
}
}
Pojďme si tento kód podrobně projít níže.
Požadovaná rozhraní API
K použití OpenTK ve třídě Xamarin.Mac je potřeba několik odkazů. Na začátku definice jsme zahrnuli následující using
příkazy:
using System;
using System.Drawing;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using OpenTK.Platform.MacOS;
using Foundation;
using CoreGraphics;
Tato minimální sada bude vyžadována pro všechny třídy používající OpenTK.
Přidání zobrazení hry
Dále musíme vytvořit zobrazení hry, které bude obsahovat všechny naše interakce s OpenTK a zobrazit výsledky. Použili jsme následující kód:
public MonoMacGameView Game { get; set; }
...
// Create new Game View and replace the window content with it
Game = new MonoMacGameView(ContentView.Frame);
ContentView = Game;
Tady jsme vytvořili zobrazení hry stejnou velikost jako hlavní okno Mac a nahradili zobrazení obsahu okna novým MonoMacGameView
. Vzhledem k tomu, že jsme nahradili existující obsah okna, změní se velikost zobrazení při změně velikosti hlavního okna automaticky.
Reakce na události
Existuje několik výchozích událostí, na které by každé zobrazení hry mělo reagovat. V této části se budeme zabývat hlavními požadovanými událostmi.
Událost načtení
Událost Load
je místo pro načtení prostředků z disku, jako jsou obrázky, textury nebo hudba. Pro naši jednoduchou testovací aplikaci nepoužíváme Load
událost, ale zahrnuli jsme ji pro referenci:
Game.Load += (sender, e) =>
{
// TODO: Initialize settings, load textures and sounds here
};
Událost změny velikosti
Událost Resize
by se měla volat při každé změně velikosti zobrazení hry. Pro naši ukázkovou aplikaci vytváříme GL Viewport stejnou velikost jako zobrazení hry (což je automaticky změněno hlavním oknem Mac) s následujícím kódem:
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);
};
Událost aktualizačního rámce
Událost UpdateFrame
se používá ke zpracování uživatelského vstupu, aktualizaci pozic objektů, spouštění fyziky nebo výpočtů umělé inteligence. Pro naši jednoduchou testovací aplikaci nepoužíváme UpdateFrame
událost, ale zahrnuli jsme ji pro referenci:
Game.UpdateFrame += (sender, e) =>
{
// TODO: Add any game logic or physics
};
Důležité
Implementace openTK Xamarin.Mac nezahrnuje Input API
rozhraní API, takže budete muset použít rozhraní API poskytovaná společností Apple pro přidání klávesnice a podpory myši. Volitelně můžete vytvořit vlastní instanci MonoMacGameView
a přepsat metody a KeyUp
metodyKeyDown
.
Událost RenderFrame
Událost RenderFrame
obsahuje kód, který slouží k vykreslení (kreslení) grafiky. V naší ukázkové aplikaci vyplňujeme zobrazení hry jednoduchým trojúhelníkem:
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();
};
Kód vykreslení obvykle bude s voláním GL.Clear
odebrat všechny existující prvky před vykreslením nových prvků.
Důležité
Pro verzi OpenTK Xamarin.Mac nevolajíSwapBuffers
metodu vaší MonoMacGameView
instance na konci kódu vykreslování. Tím dojde k rychlému strobe zobrazení hry místo zobrazení vykresleného zobrazení.
Spuštění zobrazení hry
Se všemi požadovanými událostmi definujeme a zobrazení hry připojené k hlavnímu okně Mac naší aplikace, přečteme si, abychom spustili zobrazení hry a zobrazili naši grafiku. Použijte následující kód:
// Run the game at 60 updates per second
Game.Run(60.0);
Předáváme požadovanou frekvenci snímků, na kterou chceme aktualizovat zobrazení hry, v našem příkladu jsme vybrali 60
snímky za sekundu (stejná frekvence aktualizace jako normální televize).
Pojďme spustit naši aplikaci a podívat se na výstup:
Pokud změníme velikost okna, bude se také nacházet zobrazení hry a trojúhelník se změní a aktualizuje se i v reálném čase.
Kde na další?
Se základy práce s OpenTk v aplikaci Xamarin.mac jsou hotové, tady je několik návrhů, co si vyzkoušet dál:
- Zkuste změnit barvu trojúhelníku a barvu pozadí herního zobrazení v
Load
událostech aRenderFrame
událostech. - Změňte barvu trojúhelníku, když uživatel stiskne klávesu v
UpdateFrame
událostech aRenderFrame
události nebo nastaví vlastníMonoMacGameView
třídu a přepíšeKeyUp
aKeyDown
metody. - Nastavte trojúhelník přes obrazovku pomocí kláves s vědomím
UpdateFrame
v události. Tip: PomocíMatrix4.CreateTranslation
metody vytvořte matici překladu a zavolejte metoduGL.LoadMatrix
RenderFrame
, která ji načte v události. for
Pomocí smyčky můžete vRenderFrame
události vykreslit několik trojúhelníků.- Otočte kameru, abyste získali jiný pohled na trojúhelníček ve 3D prostoru. Tip: Pomocí
Matrix4.CreateTranslation
metody vytvořte matici překladu a zavolejte metoduGL.LoadMatrix
, která ji načte. Můžete také použítVector2
,Vector3
Vector4
aMatrix4
třídy pro manipulaci s kamerou.
Další příklady najdete v úložišti GitHub s ukázkami OpenTK. Obsahuje oficiální seznam příkladů použití OpenTK. Tyto příklady budete muset přizpůsobit pro použití s verzí Xamarin.Mac openTK.
Shrnutí
Tento článek se rychle podíval na práci s OpenTK v aplikaci Xamarin.Mac. Viděli jsme, jak vytvořit herní okno, jak připojit herní okno k okně Mac a jak vykreslit jednoduchý obrazec v okně Hry.