Pengantar OpenTK di Xamarin.Mac
OpenTK (Open Toolkit) adalah pustaka C# tingkat rendah tingkat lanjut yang membuat bekerja dengan OpenGL, OpenCL, dan OpenAL lebih mudah. OpenTK dapat digunakan untuk game, aplikasi ilmiah, atau proyek lain yang memerlukan grafis 3D, audio, atau fungsionalitas komputasi. Artikel ini memberikan pengenalan singkat tentang menggunakan OpenTK di aplikasi Xamarin.Mac.
Dalam artikel ini, kita akan membahas dasar-dasar OpenTK dalam aplikasi Xamarin.Mac. Sangat disarankan agar Anda bekerja melalui artikel Hello, Mac terlebih dahulu, khususnya bagian Pengenalan Xcode dan Penyusun Antarmuka dan Outlet dan Tindakan , karena mencakup konsep dan teknik utama yang akan kita gunakan dalam artikel ini.
Anda mungkin ingin melihat kelas / metode Exposing C# keObjective-Cbagian dari dokumen Xamarin.Mac Internals juga, ini menjelaskan Register
perintah dan Export
yang digunakan untuk menyambungkan kelas C# Anda ke Objective-C objek dan Elemen UI.
Tentang OpenTK
Seperti yang dinyatakan di atas, OpenTK (Open Toolkit) adalah pustaka C# tingkat rendah canggih yang membuat bekerja dengan OpenGL, OpenCL, dan OpenAL lebih mudah. Menggunakan OpenTK di aplikasi Xamarin.Mac menyediakan fitur-fitur berikut:
- Pengembangan Cepat - OpenTK menyediakan jenis data yang kuat dan dokumentasi sebaris untuk meningkatkan alur kerja pengkodan Anda dan menangkap kesalahan lebih mudah dan lebih cepat.
- Integrasi Mudah - OpenTK dirancang untuk dengan mudah diintegrasikan dengan aplikasi .NET.
- Lisensi Permisif - OpenTK didistribusikan berdasarkan Lisensi MIT/X11 dan benar-benar gratis.
- Pengikatan Brankas Jenis yang Kaya - OpenTK mendukung versi terbaru OpenGL, OpenGL|ES, OpenAL, dan OpenCL dengan pemuatan ekstensi otomatis, pemeriksaan kesalahan, dan dokumentasi sebaris.
- Opsi GUI Fleksibel - OpenTK menyediakan Game Window asli berperkinerja tinggi yang dirancang khusus untuk game dan Xamarin.Mac.
- Kode yang Dikelola Penuh dan Sesuai CLS - OpenTK mendukung macOS versi 32-bit dan 64-bit tanpa pustaka yang tidak dikelola.
- Toolkit Matematika 3D OpenTK memasok
Vector
, ,Matrix
Quaternion
danBezier
struktur melalui Toolkit Matematika 3D-nya.
OpenTK dapat digunakan untuk game, aplikasi ilmiah, atau proyek lain yang memerlukan grafis 3D, audio, atau fungsionalitas komputasi.
Untuk informasi selengkapnya, silakan lihat situs web Open Toolkit .
Mulai Cepat OpenTK
Sebagai pengantar cepat untuk menggunakan OpenTK di aplikasi Xamarin.Mac, kita akan membuat aplikasi sederhana yang membuka Tampilan Game, merender segitiga sederhana dalam tampilan itu dan melampirkan Tampilan Game ke Jendela Utama aplikasi Mac untuk menampilkan segitiga kepada pengguna.
Memulai Proyek Baru
Mulai Visual Studio untuk Mac dan buat solusi Xamarin.Mac baru. Pilih Aplikasi Kakao Umum>Mac>App>:
Masukkan MacOpenTK
untuk Nama Proyek:
Klik tombol Buat untuk membuat proyek baru.
Termasuk OpenTK
Sebelum Anda dapat menggunakan Open TK dalam aplikasi Xamarin.Mac, Anda perlu menyertakan referensi ke rakitan OpenTK. Di Penjelajah Solusi, klik kanan folder Referensi dan pilih Edit Referensi....
Lakukan pemeriksaan oleh OpenTK
dan klik tombol OK :
Menggunakan OpenTK
Dengan proyek baru dibuat, klik MainWindow.cs
dua kali file di Penjelajah Solusi untuk membukanya untuk pengeditan. Buat kelas MainWindow
terlihat seperti berikut:
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
}
}
Mari kita membahas kode ini secara rinci di bawah ini.
API yang diperlukan
Beberapa referensi diperlukan untuk menggunakan OpenTK di kelas Xamarin.Mac. Pada awal definisi, kami telah menyertakan pernyataan berikut using
:
using System;
using System.Drawing;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using OpenTK.Platform.MacOS;
using Foundation;
using CoreGraphics;
Set minimal ini akan diperlukan untuk kelas apa pun menggunakan OpenTK.
Menambahkan Tampilan Permainan
Selanjutnya kita perlu membuat Tampilan Game untuk berisi semua interaksi kita dengan OpenTK dan menampilkan hasilnya. Kami menggunakan kode berikut:
public MonoMacGameView Game { get; set; }
...
// Create new Game View and replace the window content with it
Game = new MonoMacGameView(ContentView.Frame);
ContentView = Game;
Di sini kami telah membuat Tampilan Game berukuran sama dengan Jendela Mac Utama kami dan mengganti Tampilan Konten jendela dengan yang baru MonoMacGameView
. Karena kami mengganti konten jendela yang ada, Tampilan Yang Diberikan akan diubah ukurannya secara otomatis saat Windows Utama diubah ukurannya.
Menanggapi Peristiwa
Ada beberapa peristiwa default yang harus direspons oleh setiap Tampilan Game. Di bagian ini akan mencakup peristiwa utama yang diperlukan.
Peristiwa Pemuatan
Acara Load
ini adalah tempat untuk memuat sumber daya dari disk seperti gambar, tekstur, atau musik. Untuk aplikasi pengujian sederhana kami, kami tidak menggunakan peristiwa, Load
tetapi telah menyertakannya untuk referensi:
Game.Load += (sender, e) =>
{
// TODO: Initialize settings, load textures and sounds here
};
Peristiwa Mengubah Ukuran
Kejadian Resize
harus dipanggil setiap kali Tampilan Game diubah ukurannya. Untuk aplikasi sampel kami, kami membuat GL Viewport berukuran sama dengan Tampilan Game kami (yang diubah ukurannya secara otomatis oleh Jendela Utama Mac) dengan kode berikut:
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);
};
Peristiwa UpdateFrame
Peristiwa UpdateFrame
ini digunakan untuk menangani input pengguna, memperbarui posisi objek, menjalankan fisika atau perhitungan AI. Untuk aplikasi pengujian sederhana kami, kami tidak menggunakan peristiwa, UpdateFrame
tetapi telah menyertakannya untuk referensi:
Game.UpdateFrame += (sender, e) =>
{
// TODO: Add any game logic or physics
};
Penting
Implementasi Xamarin.Mac dari OpenTK tidak menyertakan Input API
, sehingga Anda harus menggunakan API yang disediakan Apple untuk menambahkan keyboard dan dukungan Mouse. Secara opsional Anda dapat membuat instans kustom dan MonoMacGameView
mengambil KeyDown
alih metode dan KeyUp
.
Peristiwa RenderFrame
Peristiwa RenderFrame
berisi kode yang digunakan untuk merender (menggambar) grafik Anda. Untuk contoh aplikasi kami, kami mengisi Tampilan Game dengan segitiga sederhana:
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();
};
Biasanya kode render akan dengan panggilan ke GL.Clear
untuk menghapus elemen yang ada sebelum menggambar elemen baru.
Penting
Untuk OpenTK versi Xamarin.Mac, jangan panggil SwapBuffers
metode instans Anda MonoMacGameView
di akhir kode penyajian Anda. Melakukannya akan menyebabkan Tampilan Game terhenti dengan cepat alih-alih menampilkan tampilan yang Anda render.
Menjalankan Tampilan Permainan
Dengan semua peristiwa yang diperlukan mendefinisikan dan Tampilan Game yang dilampirkan ke Jendela Mac Utama aplikasi kami, kami dibaca untuk menjalankan Tampilan Game dan menampilkan grafik kami. Gunakan kode berikut:
// Run the game at 60 updates per second
Game.Run(60.0);
Kami meneruskan kecepatan bingkai yang diinginkan yang kami inginkan untuk diperbarui oleh Tampilan Game, misalnya kami telah memilih 60
bingkai per detik (kecepatan refresh yang sama dengan TV normal).
Mari kita jalankan aplikasi kita dan lihat outputnya:
Jika kita mengubah ukuran jendela, Tampilan Game juga akan berada dan segitiga juga akan diubah ukurannya dan diperbarui secara real time.
Di mana Berikutnya?
Dengan dasar-dasar bekerja dengan OpenTk dalam aplikasi Xamarin.mac yang dilakukan, berikut adalah beberapa saran tentang apa yang harus dicoba berikutnya:
- Coba ubah warna segitiga dan warna latar belakang Tampilan Game dalam
Load
peristiwa danRenderFrame
. - Buat warna perubahan segitiga saat pengguna menekan tombol dalam
UpdateFrame
peristiwa danRenderFrame
atau membuat kelas kustomMonoMacGameView
Anda sendiri dan mengambil alihKeyUp
metode danKeyDown
. - Buat segitiga bergerak melintasi layar menggunakan kunci sadar dalam peristiwa tersebut
UpdateFrame
. Petunjuk: gunakanMatrix4.CreateTranslation
metode untuk membuat matriks terjemahan dan panggilGL.LoadMatrix
metode untuk memuatnya dalam peristiwa.RenderFrame
- Gunakan perulangan
for
untuk merender beberapa segitiga dalam peristiwa tersebutRenderFrame
. - Putar kamera untuk memberikan tampilan segitiga yang berbeda dalam ruang 3D. Petunjuk: gunakan
Matrix4.CreateTranslation
metode untuk membuat matriks terjemahan dan panggilGL.LoadMatrix
metode untuk memuatnya. Anda juga dapat menggunakanVector2
kelas ,Vector3
,Vector4
danMatrix4
untuk manipulasi kamera.
Untuk contoh selengkapnya, silakan lihat repositori GitHub Sampel OpenTK. Ini berisi daftar resmi contoh penggunaan OpenTK. Anda harus menyesuaikan contoh-contoh ini untuk digunakan dengan OpenTK versi Xamarin.Mac.
Ringkasan
Artikel ini telah melihat sekilas bekerja dengan OpenTK dalam aplikasi Xamarin.Mac. Kami melihat cara membuat Jendela Game, cara melampirkan Jendela Game ke Jendela Mac dan cara merender bentuk sederhana di Jendela Game.