Aracılığıyla paylaş


Xamarin.Mac'te OpenTK'ye Giriş

OpenTK (Open Toolkit), OpenGL, OpenCL ve OpenAL ile çalışmayı kolaylaştıran gelişmiş, alt düzey bir C# kitaplığıdır. OpenTK, oyunlar, bilimsel uygulamalar veya 3B grafikler, ses veya hesaplama işlevselliği gerektiren diğer projeler için kullanılabilir. Bu makale, Xamarin.Mac uygulamasında OpenTK kullanımına kısa bir giriş niteliğindedir.

Örnek bir uygulama çalıştırması

Bu makalede, Xamarin.Mac uygulamasında OpenTK'nin temellerini ele alacağız. Bu makalede kullanacağımız temel kavramları ve teknikleri kapsarken öncelikle Hello, Mac makalesi, özellikle Xcode ve Interface Builder'a Giriş ve Çıkışlar ve Eylemler bölümleriyle çalışmanız önemle önerilir.

Xamarin.Mac Internals belgesinin C# sınıflarını / yöntemlerini kullanıma almaObjective-Cbölümüne de göz atmak isteyebilirsiniz. Bu belge, C# sınıflarınızı nesnelere ve UI Öğelerine Objective-C bağlamada kullanılan ve Export komutlarını açıklar.Register

OpenTK hakkında

Yukarıda belirtildiği gibi OpenTK (Open Toolkit), OpenGL, OpenCL ve OpenAL ile çalışmayı kolaylaştıran gelişmiş, alt düzey bir C# kitaplığıdır. Xamarin.Mac uygulamasında OpenTK kullanmak aşağıdaki özellikleri sağlar:

  • Hızlı Geliştirme - OpenTK, kodlama iş akışınızı geliştirmek ve hataları daha kolay ve daha erken yakalamak için güçlü veri türleri ve satır içi belgeler sağlar.
  • Kolay Tümleştirme - OpenTK, .NET uygulamalarıyla kolayca tümleştirmek için tasarlanmıştır.
  • İzinli Lisans - OpenTK, MIT/X11 Lisansları altında dağıtılır ve tamamen ücretsizdir.
  • Zengin, Tür Kasa Bağlamaları - OpenTK, otomatik uzantı yükleme, hata denetimi ve satır içi belgelerle OpenGL, OpenGL|ES, OpenAL ve OpenCL'nin en son sürümlerini destekler.
  • Esnek GUI Seçenekleri - OpenTK, oyunlar ve Xamarin.Mac için özel olarak tasarlanmış yerel, yüksek performanslı Oyun Penceresi sağlar.
  • Tam Olarak Yönetilen, CLS Uyumlu Kod - OpenTK, yönetilmeyen kitaplıkları olmayan macOS'un 32 bit ve 64 bit sürümlerini destekler.
  • 3B Matematik Araç Seti OpenTK, 3B Matematik Araç Seti aracılığıyla , MatrixQuaternion ve Bezier yapıları sağlarVector.

OpenTK, oyunlar, bilimsel uygulamalar veya 3B grafikler, ses veya hesaplama işlevselliği gerektiren diğer projeler için kullanılabilir.

Daha fazla bilgi için bkz . Araç Setini Açma web sitesi.

OpenTK Hızlı Başlangıcı

Xamarin.Mac uygulamasında OpenTK kullanmaya hızlı bir giriş olarak, bir Oyun Görünümü açan, bu görünümde basit bir üçgen oluşturan ve üçgeni kullanıcıya göstermek için Oyun Görünümü'nü Mac uygulamasının Ana Penceresine ekleyen basit bir uygulama oluşturacağız.

Yeni Proje Başlatma

Mac için Visual Studio başlatın ve yeni bir Xamarin.Mac çözümü oluşturun. Mac>Uygulaması>Genel>Cocoa Uygulaması'nı seçin:

Yeni Bir Cocoa Uygulaması Ekleme

Proje Adı için girinMacOpenTK:

Proje adını ayarlama

Yeni projeyi oluşturmak için Oluştur düğmesine tıklayın.

OpenTK dahil

Xamarin.Mac uygulamasında Open TK kullanabilmeniz için önce OpenTK derlemesine bir başvuru eklemeniz gerekir. Çözüm Gezgini, Başvurular klasörüne sağ tıklayın ve Başvuruları Düzenle... öğesini seçin.

OpenTK Onay kutusunu işaretleyin ve Tamam düğmesine tıklayın:

Proje başvurularını düzenleme

OpenTK kullanma

Yeni proje oluşturulduktan sonra, Çözüm Gezgini dosyaya çift tıklayarak MainWindow.cs düzenlemek üzere açın. Sınıfın MainWindow aşağıdaki gibi görünmesini sağlayın:

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
    }
}

Bu kodu aşağıda ayrıntılı olarak gözden geçirelim.

Gerekli API'ler

Xamarin.Mac sınıfında OpenTK kullanmak için çeşitli başvurular gerekir. Tanımın başlangıcında aşağıdaki using deyimleri eklemiş olduk:

using System;
using System.Drawing;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using OpenTK.Platform.MacOS;
using Foundation;
using CoreGraphics;

Bu minimum küme OpenTK kullanan tüm sınıflar için gerekli olacaktır.

Oyun Görünümü Ekleme

Ardından OpenTK ile tüm etkileşimimizi içerecek bir Oyun Görünümü oluşturmamız ve sonuçları görüntülememiz gerekiyor. Aşağıdaki kodu kullandık:

public MonoMacGameView Game { get; set; }
...

// Create new Game View and replace the window content with it
Game = new MonoMacGameView(ContentView.Frame);
ContentView = Game;

Burada Oyun Görünümü'nü Ana Mac Penceremizle aynı boyutta yaptık ve pencerenin İçerik Görünümü'nü yeni MonoMacGameViewile değiştirdik. Mevcut pencere içeriğini değiştirdiğimizden, Ana Pencereler yeniden boyutlandırıldığında Gave View'umuz otomatik olarak yeniden boyutlandırılır.

Olaylara Yanıt Verme

Her Oyun Görünümü'nde yanıt vermesi gereken birkaç varsayılan olay vardır. Bu bölümde, gereken ana olaylar ele alınacaktır.

Yükleme Olayı

Olay Load , görüntüler, dokular veya müzik gibi diskten kaynak yüklenecek yerdir. Basit, test uygulamamız için olayı kullanmıyoruz Load , ancak başvuru için dahil ettik:

Game.Load += (sender, e) =>
{
    // TODO: Initialize settings, load textures and sounds here
};

Yeniden Boyutlandırma Olayı

Resize Oyun Görünümü yeniden boyutlandırıldığı her durumda etkinlik çağrılmalıdır. Örnek uygulamamız için GL Viewport'u Oyun Görünümümüzle aynı boyutta (Mac Ana Penceresi tarafından otomatik olarak yeniden boyutlandırılır) aşağıdaki kodla yapıyoruz:

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 Olayı

Olay UpdateFrame kullanıcı girişini işlemek, nesne konumlarını güncelleştirmek, fizik veya yapay zeka hesaplamalarını çalıştırmak için kullanılır. Basit, test uygulamamız için olayı kullanmıyoruz UpdateFrame , ancak başvuru için dahil ettik:

Game.UpdateFrame += (sender, e) =>
{
    // TODO: Add any game logic or physics
};

Önemli

OpenTK'nin Xamarin.Mac uygulaması , Input APIiçermez, bu nedenle klavye ve Fare desteği eklemek için Apple tarafından sağlanan API'leri kullanmanız gerekir. İsteğe bağlı olarak öğesinin MonoMacGameView özel bir örneğini oluşturabilir ve ve KeyUp yöntemlerini geçersiz kılabilirsinizKeyDown.

RenderFrame Olayı

Olay RenderFrame , grafiklerinizi işlemek (çizmek) için kullanılan kodu içerir. Örnek uygulamamız için Oyun Görünümü'nü basit bir üçgenle dolduruyoruz:

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();

};

Genellikle işleme kodu, yeni öğeleri çekmeden önce var olan öğeleri kaldırmak için GL.Clear çağrısıyla birlikte olur.

Önemli

OpenTK'nin Xamarin.Mac sürümü için işleme kodunuzun sonunda örneğinizin MonoMacGameView yöntemini çağırmayınSwapBuffers. Bunun yapılması, işlenmiş görünümünüzü görüntülemek yerine Oyun Görünümünün hızla strobemasına neden olur.

Oyun Görünümünü Çalıştırma

Tüm gerekli olaylar tanımlandığında ve oyun görünümü uygulamamızın Ana Mac Penceresine eklendiğinde, Oyun Görünümü'nü çalıştırmak ve grafiklerimizi görüntülemek için okunuruz. Aşağıdaki kodu kullanın:

// Run the game at 60 updates per second
Game.Run(60.0);

Oyun Görünümü'nü güncelleştirmek istediğimiz kare hızını geçiririz. Örneğimizde saniye başına kareler (normal TV ile aynı yenileme hızı) seçtik 60 .

Şimdi uygulamamızı çalıştıralım ve çıkışı görelim:

Uygulama çıkışı örneği

Penceremizi yeniden boyutlandırırsak, Oyun Görünümü de yer alır ve üçgen yeniden boyutlandırılır ve gerçek zamanlı olarak güncelleştirilir.

Nereden sonrakine?

Xamarin.mac uygulamasında OpenTk ile çalışmanın temelleri tamamlandıktan sonra deneyebileceğiniz bazı öneriler şunlardır:

  • ve RenderFrame olaylarında üçgenin rengini ve Oyun Görünümünün Load arka plan rengini değiştirmeyi deneyin.
  • Kullanıcı ve RenderFrame olaylarında bir tuşa bastığında UpdateFrame üçgenin rengini değiştirin veya kendi özel MonoMacGameView sınıfınızı oluşturun ve ve KeyDown yöntemlerini geçersiz kılınKeyUp.
  • Olaydaki farkında olan tuşları kullanarak üçgenin ekranda hareket etmesini UpdateFrame sağlayın. İpucu: bir çeviri matrisi oluşturmak için yöntemini kullanın Matrix4.CreateTranslation ve olayı yüklemek için yöntemini çağırın GL.LoadMatrixRenderFrame .
  • Olayda RenderFrame birkaç üçgen işlemek için bir for döngü kullanın.
  • 3B alanda üçgenin farklı bir görünümünü vermek için kamerayı döndürün. İpucu: bir çeviri matrisi oluşturmak ve yüklemek için yöntemini çağırmak GL.LoadMatrix için yöntemini kullanınMatrix4.CreateTranslation. Kamera işlemeleri için , Vector3ve Vector4Matrix4 sınıflarını da kullanabilirsinizVector2.

Daha fazla örnek için lütfen OpenTK Örnekleri GitHub deposuna bakın. OpenTK kullanımına yönelik örneklerin resmi bir listesini içerir. Bu örnekleri OpenTK'nin Xamarin.Mac sürümüyle kullanmak üzere uyarlamanız gerekir.

Özet

Bu makalede, Xamarin.Mac uygulamasında OpenTK ile çalışma konusuna hızlıca göz atılmıştır. Oyun Penceresi oluşturmayı, Oyun Penceresini mac penceresine eklemeyi ve Oyun Penceresi'nde basit bir şekli işlemeyi gördük.