Sdílet prostřednictvím


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

Příklad spuštění aplikace

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á , VectorMatrixQuaternion a Bezier 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:>

Přidání nové aplikace Cocoa

Zadejte MacOpenTK název projektu:

Nastavení názvu 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 :

Úprava odkazů na projekt

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 APIrozhraní 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:

Ukázka výstupu aplikací

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 a RenderFrame událostech.
  • Změňte barvu trojúhelníku, když uživatel stiskne klávesu v UpdateFrame událostech a RenderFrame události nebo nastaví vlastní MonoMacGameView třídu a přepíše KeyUp a KeyDown 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 metodu GL.LoadMatrixRenderFrame , která ji načte v události.
  • for Pomocí smyčky můžete v RenderFrame 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 metodu GL.LoadMatrix , která ji načte. Můžete také použít Vector2, Vector3Vector4 a Matrix4 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.