Ú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.

Příklad spuštění aplikace

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 MatrixQuaternionBezier 3D 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:

Přidání nové aplikace Cocoa

Jako MacOpenTK název Project MacOpenTK:

Nastavení názvu projektu

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

Úprava odkazů na projekt

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:

Ukázka výstupu aplikací

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 LoadRenderFrame a .
  • 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 UpdateFrameRenderFrame metody MonoMacGameViewKeyUpKeyDown a
  • 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.CreateTranslation která ji načte v GL.LoadMatrixRenderFrame události.
  • Smyčka for slouží k vykreslení několika trojúhelníků v RenderFrame události.
  • Otočením fotoaparátu zobrazíte trojúhelník ve 3D prostoru. Nápověda: Pomocí metody Matrix4.CreateTranslation vytvořte matici překladu a zavolejte GL.LoadMatrix metodu , která ji načte. Třídy , a můžete použít také Vector2Vector3 pro Vector4Matrix4 manipulaci 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.