BerandaComputers and TechnologySekilas tentang Touch Handling API di Game Engine

Sekilas tentang Touch Handling API di Game Engine

Sejak iPhone muncul pada tahun 2007, input sentuh telah menjadi yang terdepan dalam interaksi manusia dengan mesin. Tapi Game Engines telah ada untuk umur panjang yang wajar, sebelum ledakan seluler. Sentuhan sebagai sarana interaksi dengan dunia game di engine disediakan dengan berbagai cara. Di bawah ini, kita akan melihat berbagai API sentuh untuk melihat bagaimana mereka disediakan untuk mengaktifkan permainan di ponsel kita. Kemiringan, kamera, dan sensor lainnya akan diabaikan sehingga kita dapat fokus pada sentuhan.

Browser – Standar emas Touch API

Peramban bukan “mesin permainan” tetapi ada permainan yang berjalan di peramban dan memiliki penanganan yang kuat atas masukan sentuh yang digunakan di seluruh perangkat setiap hari dengan cara yang berbeda. Namun, sebagian besar ditangani melalui elemen DOM dan tidak secara langsung. Tapi mari kita lihat bagaimana penanganan langsung mereka dapat dilakukan.

Browser menangani 4 kejadian sentuh:

  • sentuh mulai: saat jari mulai menyentuh area konten browser
  • gerakan sentuh: jika jari bergerak setelah menyentuh area konten browser
  • ujung sentuh: apakah jari digerakkan atau tidak saat dilepaskan dari area konten browser
  • pembatalan sentuh: saat tab browser berubah, jari bergerak ke UI browser atau yang lainnya

Dalam kode, berlangganan acara ini memerlukan melewati fungsinya yang akan menangani mereka, dan boolean pada akhirnya memberikan informasi tentang caranya acara itu menyebar. Di browser juga dimungkinkan untuk menentukan elemen yang rentan terhadap peristiwa itu – ini tidak spesifik untuk sentuh tetapi berikan fungsionalitas yang menarik.

fungsi memulai  ( )   {    var   el  = dokumen .   getElementById   (  " kanvas") ;     el  .   addEventListener   (  "touchstart"  ,   handleStart  , Salah )  ;     el  .   addEventListener   (  "sentuhan"  ,   handleEnd  , Salah )  ;     el  .   addEventListener   (  "touchcancel"  ,   handleCancel  , Salah )  ;     el  .   addEventListener   (  "touchmove"  ,   handleMove  , Salah )  ;  }  

Setiap peristiwa melewati serangkaian Sentuhan , masing-masing dengan parameter berikut: pengenal , clientX , klienY , halamanX , halamanY , screenX , screenY , target . Lebih banyak elemen tersedia secara eksperimental tergantung pada browser. Properti pengenal adalah bilangan bulat unik untuk setiap sentuhan dan sisa konsisten untuk setiap peristiwa selama durasi setiap kontak jari dengan permukaan.

Browser desktop, meskipun layar sentuh tersedia, dapat menonaktifkan acara ini. Ada API berbeda untuk Pointer Events dan disarankan untuk digunakan sebagai gantinya, dan mencampur Input Mouse, Input sentuh, dan input Pena dalam jenis kejadian yang sama.


Unity – API terlengkap

Di Unity, Anda dapat memeriksa Input.touchCount untuk mengetahui berapa banyak titik kontak yang tersedia pada bingkai itu, dan mengambilnya masing-masing menggunakan Input.GetTouch (i) .

Setiap sentuhan akan memiliki properti berikut: fingerId , fase , posisi , deltaTime , radius , tekanan , rawPosition , deltaPosisi , azimuthAngle , altitudeAngle , tekanan maksimum yang mungkin , radiusVariance dan jenis (apakah sentuhan adalah jenis Langsung, Tidak Langsung (atau jarak jauh), atau Stylus).

Berikut ini adalah kemungkinan fase sentuh: Dimulai (Jari menyentuh layar), Dipindahkan (Sebuah jari digerakkan di layar), Stasioner (Sebuah jari menyentuh layar tetapi belum bergerak), Berakhir (Sebuah jari terangkat dari layar. Ini adalah fase terakhir dari sentuhan) atau Dibatalkan (Sistem membatalkan pelacakan untuk sentuhan).

Karena kedua indeks i digunakan dalam Input.GetTouch (i) dan fingerId adalah bilangan bulat, dalam beberapa API sentuh yang memerlukan penerusan bilangan bulat tidak jelas apa yang harus digunakan. Misalnya EventSystem.current.IsPointerOverGameObject (int) sebenarnya membutuhkan passing touch.fingerId .


GameMaker – Pendekatan beberapa mouse!

Game Maker memiliki dua API terpisah untuk menangani sentuhan. Satu sama dengan yang digunakan untuk masukan mouse, tetapi mereka bekerja dengan cara yang sama seperti PC akan bekerja jika memiliki beberapa mouse yang terpasang , yang membuatnya berbeda dari apa yang telah kita lihat sejauh ini. Anda lulus nomor perangkat yang berubah dari 0 ke n, di mana jumlah perangkat tersedia tampaknya 5 – tetapi saya tidak dapat menemukan fungsi yang mengambil nomor ini. Maka 0 adalah jari pertama yang menyentuh layar (atau mouse di komputer) dan 1 adalah yang kedua dan seterusnya, dan Anda dapat menggunakan file berfungsi seperti device_mouse_check_button (perangkat, tombol); untuk mengambil jika salah satu jari ditekan (dengan mencentang klik kiri) atau mouse mengklik, dengan perangkat menjadi nomor yang berkisar dari ini 0 sampai n.

Fungsi berikut tersedia: device_mouse_check_button , device_mouse_check_button_pressed , device_mouse_check_button_released , device_mouse_x , device_mouse_y , device_mouse_raw_x , device_mouse_raw_y , device_mouse_x_to_gui , device_mouse_y_to_gui , Dan device_mouse_dbclick_enable .

API tambahan kedua tersedia yang memberikan akses ke semua gerakan sentuh yang umum dan membuatnya mudah digunakan. Ini termasuk tap, seret, jentik, cubit, dan putar aktivitas jari.


Godot – Pendekatan minimal

Godot memiliki InputEvent yang sangat ramping untuk sentuhan layar, dengan tiga parameter: indeks (angka dari 0 hingga n yang mengidentifikasi jari), posisi (titik x dan y di layar), dan boolean bernama ditekan itu salah saat jari dilepaskan.

Pada saat yang sama, karena ini adalah InputEvent, ini dapat menyebar melalui SceneTree mirip dengan cara browser mengizinkan penanganan peristiwa di elemen di DOM. Hal ini membuat pendekatan sederhana ini tetap sangat ampuh.

Selain itu, Godot juga menyediakan TouchScreenButton untuk mendesain tombol yang dimaksudkan untuk menerima sentuhan banyak jari.


Unreal – Tradisional dengan stempel waktu

Unreal TouchEvents mirip dengan yang kita lihat sejauh ini, sentuhannya Gagang yang unik per jari, ini terjadi di TouchLocation (posisi x, y), memiliki tipe (mirip dengan fase yang terlihat sebelumnya), ini memiliki float yang menunjukkan Force dan memiliki DeviceTimestamp sehingga Anda dapat mengetahui dengan tepat kapan sentuhan tertentu terjadi.

Jenis sentuhan dapat berupa salah satu dari nilai enum berikut Mulai , Pindah , Perlengkapan tulis, ForceChanged , FirstMove , Berakhir , NumTypes (digunakan saat melakukan iterasi pada tipe lain).

Secara keseluruhan, ini adalah API yang sangat standar. Acara juga tersedia untuk Saat Sentuhan Input Mulai , Pada Input Touch End dan lain-lain.


Ogre3D – Sangat mirip dengan SDL2

Ogre3D menyediakan TouchFingerEvent di mana setiap jari memiliki bilangan bulat unik fingerId , a jenis , sebuah x dan y posisi, dan tambahan dx dan dy disediakan untuk delta posisi tersebut.


Love 2D – Polling dan acara dan Lua

Love2D memungkinkan pemungutan suara untuk sentuhan pada pembaruan mesin atau menggunakan fungsi untuk bekerja dengan peristiwa sentuh.

Saat polling, love.touch.getTouches () mengambil tabel bernama sentuhan , yang memiliki daftar id untuk setiap sentuhan. Posisi sentuhan kemudian dapat diambil dengan menggunakan local x, y=love.touch.getPosition (id) untuk setiap id. Karena Love2D menggunakan Lua, polling menjadi sangat cepat.

Acara yang tersedia adalah love.touchpressed , love.touchmoved dan love.touchreleased . Di masing-masing, parameter yang diteruskan adalah id , x , y , dx , dy dan tekanan .


Ren’Py – Gestur

Menggunakan gerakan alih-alih menangani posisi sentuhan terjadi adalah pendekatan yang sangat berbeda, dokumen Ren’Py menjelaskan ini dengan rapi:

Pengenal isyarat pertama-tama mengklasifikasikan gesekan ke dalam 8 arah kompas, “ n “,” ne “,” e “,” se “,” s “,” sw “,” w “,” nw “. Utara dianggap mengarah ke atas layar. Ini kemudian menggabungkan gesekan menjadi string menggunakan “ _ “sebagai pembatas. Misalnya, jika pemain menggeser ke bawah dan ke kanan, string “ s_e “akan diproduksi.

Ini memungkinkan membangun isyarat dalam string, config.gestures tersedia sebagai kamus di mana string yang mewakili isyarat memetakan ke suatu fungsi (tindakan): definisikan config.gestures={"n_s_w_e_w_e": "progress_screen"}.


Kesimpulan

Ketika meneliti untuk topik ini saya melihat ke Tindakan HaxeFlixel , dan sementara tidak ada cara yang jelas untuk menangani sentuhan di sana selain mouse, ia memiliki sistem yang sangat menarik untuk mencocokkan masukan ke suatu fungsi yang akan mengeksekusi hasil gameplay-nya dan terlihat mirip dengan aslinya tersedia dalam gerakan premade Ren’Py dan Game Maker. Meski begitu, gestur handling di mesin sepertinya masih minoritas.

Melihat API sentuh dari sebagian besar mesin di atas, tampaknya mereka memutuskan untuk memberi Anda data bermakna yang tersedia sedekat masukan pengguna dan membiarkan Anda menangani dan menafsirkannya sesuai keinginan. Pada hari-hari awal multi-touch API, saya yakin saya melihat bahkan satu posisi x dan y per “piksel” yang disentuh sangat menuntut untuk dilalui. Dengan memberikan posisi per jari per bingkai, datanya dapat ditangani tanpa banyak usaha dan dari dokumentasi tampaknya apa yang tersedia di API saat ini. Namun, di beberapa mesin, posisinya adalah float yang dinormalisasi antara 0 dan 1 dan Anda sendirian untuk mengubahnya di koordinat dunia Anda.

Godot tampaknya bekerja dengan yang paling ramping hanya dengan ID per jari, posisi, dan informasi sehingga Anda dapat mengetahui kapan jari itu turun dan meninggalkan layar. Jika Anda mencari seminimal mungkin, Anda harus bekerja dengan perangkat seluler saat membangun game Anda, saya yakin itu cocok.

Read More

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments