Úvod do OpenTK v Xamarin.Macu
OpenTK (Open Toolkit) je pokročilá knihovna jazyka C# nízké úrovně, která usnadňuje práci s OpenGL, OpenCL a OpenAL. OpenTK je možné 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 probýme základy OpenTK v aplikaci Xamarin.Mac. Důrazně doporučujeme, abyste si nejprve prošli článek Hello, Mac, konkrétně oddíly Úvod do Xcode a Interface Builder a Výstupy a Akce, protože se zabývá klíčovými koncepty a technikami, které budeme v tomto článku používat.
Možná se budete chtít podívat i na část dokumentu Exposing C# classes / methods to Objective-CExposing C# classes / methods to Objective-C která vysvětluje příkazy a používané k připojení tříd jazyka C# k objektům a prvkům uživatelského RegisterExportObjective-C rozhraní.
Informace o OpenTK
Jak je uvedeno výše, OpenTK (Open Toolkit) je pokročilá knihovna jazyka C# nízké úrovně, 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 vnořenou dokumentaci ke zlepšení pracovního postupu psaní kódu a snadnějšímu a rychlejšímu zachycení chyb.
- Snadná integrace – OpenTK je navržený tak, aby se snadno integruje s aplikacemi .NET.
- Oprávnění licence – OpenTK se distribuuje v rámci licencí MIT/X11 a je zcela zdarma.
- Bohaté Type-Safe – OpenTK podporuje nejnovější verze OpenGL, OpenGL|ES, OpenAL a OpenCL s automatickým načítáním rozšíření, kontrolou chyb a vkládanou dokumentací.
- Flexibilní možnosti grafického uživatelského rozhraní – OpenTK poskytuje nativní a vysoce výkonné herní okno navržené speciálně pro hry a Xamarin.Mac.
- Plně spravovaná CLS-Compliant Code – OpenTK podporuje 32bitové a 64bitové verze macOS bez nespravovaných knihoven.
- 3D math Toolkit OpenTK dodává , a struktury prostřednictvím svých
MatrixQuaternionBezier3D matematických Toolkit.
OpenTK je možné 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 The Open Toolkit.
Rychlý start pro OpenTK
Jako rychlý úvod do používání OpenTK v aplikaci Xamarin.Mac vytvoříme jednoduchou aplikaci, která otevře herní zobrazení, vykreslí v tomto zobrazení jednoduchý trojúhelník a připojí herní zobrazení k hlavnímu oknu aplikace pro Mac, aby se uživateli zobrazí trojúhelník.
Spuštění nového Project
Začněte Visual Studio pro Mac a vytvořte nové řešení Xamarin.Mac. Vyberte MacAppGeneralCocoa App:
Jako MacOpenTK název Project MacOpenTK:
Kliknutím na tlačítko Vytvořit sestavte nový projekt.
Zahrnutí OpenTK
Než budete moci 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 na složku Odkazy a vyberte Upravit odkazy....
Zaškrtněte políčko a OpenTK klikněte na OpenTK
Použití OpenTK
Po vytvoření nového projektu poklikejte na soubor v Průzkumník řešení MainWindow.cs a otevřete ho pro úpravy. MainWindow.cs Aby MainWindow třída vypadala 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;
// 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
}
}
Podívejme se na tento kód podrobněji 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 zahrnou 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í herního zobrazení
Dále musíme vytvořit herní zobrazení, které bude obsahovat všechny naše interakce s OpenTK a zobrazí 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 nastavení Herního zobrazení udělali stejnou velikost jako v hlavním okně Macu a nahradili jsme zobrazení obsahu okna novým MonoMacGameView . Vzhledem k tomu, že jsme nahradili existující obsah okna, změní se při změně velikosti hlavního zobrazení automaticky Windows zobrazení.
Reakce na události
Existuje několik výchozích událostí, na které by mělo každé herní zobrazení reagovat. V této části najdete informace o hlavních požadovaných událostech.
Událost načtení
Událost Load je místo, kde můžete načítat prostředky z disku, jako jsou obrázky, textury nebo hudba. Pro naši jednoduchou testovací aplikaci událost nevyu používáme, ale přidali Load jsme ji pro referenci:
Game.Load += (sender, e) =>
{
// TODO: Initialize settings, load textures and sounds here
};
Událost Resize
Událost Resize by měla být volána při každé změně velikosti herního zobrazení. Pro naši ukázkovou aplikaci zvětšuje zobrazení GL stejnou velikost jako herní zobrazení (které se automaticky mění podle hlavního okna Macu) 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 UpdateFrame
Tato UpdateFrame událost se používá ke zpracování uživatelského vstupu, aktualizaci pozic objektů, spouštění fyziky nebo výpočtů AI. Pro naši jednoduchou testovací aplikaci událost nevyu používáme, ale přidali UpdateFrame jsme ji pro referenci:
Game.UpdateFrame += (sender, e) =>
{
// TODO: Add any game logic or physics
};
Důležité
Implementace OpenTK v Xamarin.Mac nezahrnuje , takže k přidání podpory klávesnice a myši budete muset použít rozhraní API poskytovaná Input API Applem. Volitelně můžete vytvořit vlastní instanci a MonoMacGameView přepsat metody KeyDown a KeyUp .
Událost RenderFrame
Událost RenderFrame obsahuje kód, který se používá k vykreslení (vykreslení) grafiky. Pro naši příkladovou aplikaci vyplníme herní zobrazení 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í bude obvykle s voláním metody , která odebere všechny existující GL.Clear prvky před vykreslení nových prvků.
Důležité
Verze Xamarin.Mac OpenTK nevolá na konci kódu pro vykreslování metodu vaší MonoMacGameView instance. To způsobí, že se herní zobrazení rychle posouží místo zobrazení vykreslené hry.
Spuštění herního zobrazení
Když jsou všechny požadované události definovány a herní zobrazení připojené k hlavnímu oknu Mac naší aplikace, načítáme informace pro spuštění herního zobrazení a zobrazení naší grafiky. Použijte následující kód:
// Run the game at 60 updates per second
Game.Run(60.0);
Předáme požadovanou snímkovou frekvenci, kterou má herní zobrazení aktualizovat. V našem příkladu jsme zvolili snímky za sekundu (stejnou obnovovací frekvenci jako 60 normální TV).
Pojďme spustit naši aplikaci a podívat se na výstup:
Pokud změníme velikost okna, bude se nacházet také herní zobrazení a v reálném čase se změní i velikost trojúhelníku.
Kde dál?
Základní informace o práci s OpenTk v aplikaci Xamarin.mac jsou hotové tady:
- Zkuste změnit barvu trojúhelníku a barvu pozadí herního zobrazení v událostech
LoadRenderFramea . - Nastavení barvy trojúhelníku, když uživatel stiskne klávesu v událostech a nebo když si má vytvořit vlastní třídu a přepsat
UpdateFrameRenderFramemetodyMonoMacGameViewKeyUpKeyDowna - Proveďte přesunutí trojúhelníku přes obrazovku pomocí klíčů, které v události
UpdateFramečekáte. Nápověda: Pomocí metody vytvořte matici překladu a zavolejte metodu ,Matrix4.CreateTranslationkterá ji načte vGL.LoadMatrixRenderFrameudálosti. - Smyčka
forslouží k vykreslení několika trojúhelníků vRenderFrameudálosti. - Otočením fotoaparátu zobrazíte trojúhelník ve 3D prostoru. Nápověda: Pomocí metody
Matrix4.CreateTranslationvytvořte matici překladu a zavolejteGL.LoadMatrixmetodu , která ji načte. Třídy , a můžete použít takéVector2Vector3proVector4Matrix4manipulaci s fotoaparátem.
Další příklady najdete v tématu Ukázky OpenTK GitHub. Obsahuje oficiální seznam příkladů použití OpenTK. Tyto příklady budete muset přizpůsobit pro použití s OpenTK ve verzi Xamarin.Mac.
Složitější příklad implementace OpenTK v Xamarin.Macu najdete v naší ukázce MonoMacGameView.
Souhrn
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 oknu Mac a jak v herním okně vykreslit jednoduchý tvar.



