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.
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 ,
Matrix
Quaternion
veBezier
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:
Proje Adı için girinMacOpenTK
:
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:
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 MonoMacGameView
ile 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 API
iç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:
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ünLoad
arka plan rengini değiştirmeyi deneyin. - Kullanıcı ve
RenderFrame
olaylarında bir tuşa bastığındaUpdateFrame
üçgenin rengini değiştirin veya kendi özelMonoMacGameView
sınıfınızı oluşturun ve veKeyDown
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ınMatrix4.CreateTranslation
ve olayı yüklemek için yöntemini çağırınGL.LoadMatrix
RenderFrame
. - Olayda
RenderFrame
birkaç üçgen işlemek için birfor
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 ,Vector3
veVector4
Matrix4
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.