Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Programming
Gamedevelopment

Memahami Kelakuan Berkendara: Beratur

by
Difficulty:IntermediateLength:MediumLanguages:
This post is part of a series called Understanding Steering Behaviors.
Understanding Steering Behaviors: Leader Following

Malay (Melayu) translation by Adjatay Bashroh Aldad (you can also view the original English article)

Bayangkan adegan permainan di mana sebuah bilik dipenuhi dengan entiti kawalan AI. Untuk sebab tertentu, mereka mesti meninggalkan bilik dan melalui pintu. Daripada membuat mereka berjalan di antara satu sama lain dalam aliran yang kacau, mengajar mereka bagaimana dengan sopan meninggalkan semasa berdiri sejajar. Tutorial ini mempersembahkan tingkah laku stereng giliran dengan pendekatan yang berbeza untuk membuat orang ramai bergerak sambil membentuk baris entiti.

Nota: Walaupun tutorial ini ditulis menggunakan AS3 dan Flash, anda harus menggunakan teknik dan konsep yang sama dalam hampir semua persekitaran pembangunan permainan. Anda mesti mempunyai pemahaman asas mengenai vektor matematik.


Pengenalan

Beratur, dalam konteks tutorial ini, adalah proses berdiri sejajar, membentuk deretan watak yang sabar menunggu untuk tiba di suatu tempat. Sebagai yang pertama dalam pergerakan baris, sisanya mengikuti, mewujudkan corak yang kelihatan seperti kereta api yang menarik kereta. Apabila menunggu, watak tidak boleh meninggalkan garis.

Untuk menggambarkan tingkah laku giliran dan menunjukkan perlaksanaan yang berbeza, demo yang memaparkan ''adegan giliran'' adalah cara terbaik untuk pergi. Satu contoh yang baik ialah bilik yang penuh sesak dengan entiti kawalan AI, semuanya cuba meninggalkan bilik dan melalui pintu:


Boids meninggalkan bilik dan melewati pintu tanpa tingkah laku giliran. Klik untuk menunjukkan daya.

Adegan ini dibuat dengan menggunakan dua tingkah laku yang digambarkan sebelum ini: mencari dan mengelakkan perlanggaran.

Pintu diperbuat daripada dua halangan segi empat tepat yang diposisikan bersebelahan dengan jurang antara mereka (pintu). Watak mencari titik yang terletak di belakangnya. Apabila di sana, watak-watak itu diletakkan semula di bahagian bawah skrin.

Kini, tanpa tingkah laku giliran, tempat kejadian kelihatan seperti gerombolan orang yang bertelanjang kaki melangkah ke kepala masing-masing untuk tiba di destinasi. Apabila kita selesai, orang ramai dengan lancar akan meninggalkan tempat itu, membentuk baris.


Melihat Hadapan

Keupayaan pertama watak yang mesti diperolehi sejajar adalah untuk mengetahui sama ada terdapat seseorang di hadapan mereka. Berdasarkan maklumat itu, ia boleh memutuskan sama ada untuk meneruskan atau berhenti bergerak.

Walaupun terdapat cara yang lebih canggih untuk memeriksa jiran-jiran di hadapan, saya akan menggunakan kaedah mudah berdasarkan jarak antara titik dan watak. Pendekatan ini digunakan dalam  mengelakkan perlanggaran untuk memeriksa halangan-halangan di hadapan:


Uji jiran dengan menggunakan titik hadapan.

Titik dipanggil ke hadapan diproyeksikan di hadapan watak. Jika jarak di antara titik itu dan watak jiran kurang daripada atau sama dengan MAX_QUEUE_RADIUS, bermakna ada seseorang di hadapan dan watak mesti berhenti bergerak.

Titik ke hadapan dikira seperti berikut (pseudo-code):

Halaju, yang juga memberi hala tuju aksara, dinormalisasi dan disingkat oleh MAX_QUEUE_AHEAD untuk menghasilkan vektor baru yang dipanggil qa. Apabila qa ditambahkan pada vektor posisi, hasilnya adalah titik di hadapan karakter, dan jarak dari MAX_QUEUE_AHEAD unit dari itu.

Semua ini boleh dibungkus dalam kaedah getNeighborAhead ():

Kaedah memeriksa jarak antara titik depan dan semua aksara lain, mengembalikan aksara pertama yang jaraknya kurang atau sama dengan MAX_QUEUE_AHEAD. Sekiranya tiada watak ditemui, kaedah pulangan null.


Mewujudkan Kaedah Beratur

Seperti semua tingkah laku yang lain, gaya antrian dikira dengan kaedah bernama(queue):

Hasil getNeighborAhead() dalam disimpan di jiran variabel. Jika jiran != Null ia bermakna ada seseorang di hadapan; jika tidak, laluan itu jelas.

Baris(), seperti semua kaedah tingkah laku lain, mesti mengembalikan daya yang menjadi daya stereng yang berkaitan dengan kaedah itu sendiri. baris() akan mengembalikan daya tanpa magnitud buat masa ini, jadi ia tidak menghasilkan sebarang kesan.

Kaedah kemas kini() semua watak dalam adegan pintu, sehingga sekarang, adalah (pseudo-code): 

Oleh kerana barisan() mengembalikan daya null, aksara akan terus bergerak tanpa membentuk baris. Sudah tiba masanya untuk membuat mereka mengambil tindakan apabila jiran dikesan terus ke hadapan.


Beberapa Perkataan Mengenai Pergerakan Berhenti

Tingkah laku pemanduan adalah berdasarkan kekuatan yang sentiasa berubah, jadi keseluruhan sistem menjadi sangat dinamik. Bergantung pada pelaksanaan, lebih banyak daya yang terlibat, semakin sukar untuk menentukan dan membatalkan vektor daya tertentu.

Pelaksanaan yang digunakan dalam siri tingkah stereng ini menambah semua daya bersama. Sebagai akibatnya, untuk membatalkan daya, ia mesti dikira semula, terbalik dan ditambah lagi kepada vektor daya pemandu semasa.

Itu cukup banyak yang berlaku dalam tingkah laku ketibaan, di mana halaju dibatalkan untuk membuat watak berhenti bergerak. Tetapi apa yang berlaku apabila lebih banyak daya bertindak bersama, seperti mengelakkan perlanggaran, melarikan diri, dan banyak lagi?

Bahagian berikut membentangkan dua idea untuk membuat watak berhenti bergerak. Yang pertama menggunakan pendekatan ''berhenti keras'' yang bertindak secara langsung pada vektor halaju, mengabaikan semua daya stereng lain. Yang kedua menggunakan vektor daya, bernama brek, untuk membatalkan semua daya stereng lain, akhirnya membuat watak berhenti bergerak.


Stopping Movement: ''Stop Hard''

Beberapa daya stereng didasarkan pada vektor halaju watak. Sekiranya vektor itu berubah, semua daya lain akan terjejas apabila ia dikira semula. Idea ''berhenti keras'' agak mudah: jika terdapat watak ke hadapan, kita "mengecut" vektor halaju:

Dalam kod di atas, vektor halaju dikecilkan kepada 30% daripada magnitud semasa (panjang) manakala watak di hadapan. Sebagai akibatnya, pergerakan tersebut secara drastik berkurang, tetapi akhirnya akan kembali kepada magnitud normalnya apabila watak yang menghalang cara bergerak.

Itu lebih mudah difahami dengan menganalisis bagaimana pergerakan dikira setiap kemas kini:

Sekiranya daya halaju terus mengecut, begitu juga dengan daya pemandu, kerana ia berdasarkan daya halaju. Ia mewujudkan kitaran ganas yang akan berakhir dengan nilai yang sangat rendah untuk halaju. Itulah ketika watak berhenti bergerak.

Apabila proses mengecut berakhir, setiap kemas kinian permainan akan meningkatkan vektor halaju sedikit, menjejaskan daya stereng juga. Akhirnya beberapa kemas kini selepas akan membawa kedua-dua halaju dan vektor stereng kembali ke magnitud normal mereka.

Pendekatan ''berhenti keras'' menghasilkan keputusan berikut:


Tingkah laku beratur dengan pendekatan ''berhenti keras''. Klik untuk menunjukkan daya.

Walaupun keputusan ini agak meyakinkan, ia terasa seperti hasil ''robot''. Orang ramai biasanya tidak mempunyai ruang kosong di antara ahli-ahlinya.


Menghentikan Pergerakan: Angkatan Braking

Pendekatan kedua untuk menghentikan pergerakan cuba menghasilkan hasil yang kurang "robotik" dengan membatalkan semua daya stereng yang aktif menggunakan daya gerak:

Daripada mencipta kuasa brek dengan mengira semula dan membalikkan setiap daya stereng yang aktif, brek dikira berdasarkan vektor stereng semasa, yang memegang semua daya stereng yang ditambah pada masa ini:


Perwakilan kuasa brek.

Daya brek menerima kedua-dua komponen x dan y dari daya stereng, tetapi terbalik dan dengan skala 0.8. Ini bermakna brek mempunyai 80% daripada magnitud stereng dan mata dalam arah yang bertentangan.

Petua: Menggunakan daya stereng secara langsung berbahaya. Jika giliran() adalah tingkah laku pertama untuk digunakan pada watak, daya stereng akan ''kosong''. Akibatnya, giliran() mesti digunakan selepas semua kaedah stereng lain, supaya ia boleh mengakses kuasa stereng lengkap dan terakhir.

Kekuatan brek juga perlu membatalkan halaju watak. Itu dilakukan dengan menambah -ketelusan kepada daya brek. Selepas itu, giliran kaedah() boleh mengembalikan daya brek akhir.

Hasil menggunakan kekuatan brek adalah berikut:


Tingkah laku beratur menggunakan pendekatan kekerasan brek. Klik untuk menunjukkan daya.

Mengurangkan Karakter Bertindih

Pendekatan pengereman menghasilkan keputusan yang lebih semula jadi berbanding dengan ''robot'' yang lama, kerana semua watak cuba mengisi ruang kosong. Walau bagaimanapun, ia memperkenalkan masalah baru: aksara bertindih.

Untuk membetulkannya, pendekatan brek dapat dipertingkatkan dengan versi yang agak diubahsuai dari pendekatan ''berhenti keras'':

Ujian baru digunakan untuk memeriksa jiran berdekatan. Kali ini bukannya menggunakan titik hadapan untuk mengukur jarak, ujian baru memeriksa jarak antara vektor posisi watak:


Semak jiran berdekatan dalam radius MAX_QUEUE_RADIUS yang berpusat pada kedudukan dan bukan titik depan.

Ujian baru ini memeriksa sama ada terdapat sebarang aksara berdekatan dalam lingkungan MAX_QUEUE_RADIUS, tetapi kini ia berpusat pada vektor kedudukan. Sekiranya seseorang berada dalam jarak, ia bermakna kawasan sekitar menjadi terlalu ramai dan watak-watak mungkin mula bertindih.

Tumpahannya dikurangkan dengan mengukur vektor halaju kepada 30% daripada magnitud semasanya setiap kemas kini. Sama seperti pendekatan 'berhenti keras', mengecutkan vektor halaju secara drastik mengurangkan pergerakan itu.

Hasilnya kelihatan kurang ''robotik'', tetapi itu tidak ideal, kerana watak-watak masih bertindih di pintu:


Tingkah laku beratur dengan ''hentian keras'' dan kekuatan brek digabungkan. Klik untuk menunjukkan daya.

Menambah Pengasingan

Walaupun watak-watak cuba untuk mencapai pintu dengan cara yang meyakinkan, mengisi semua ruang yang kosong apabila jalan menjadi sempit, mereka semakin dekat antara satu sama lain di pintu.

Ini boleh diselesaikan dengan menambahkan daya pemisah:

Sebelum digunakan dalam pemimpin yang mengikuti tingkah laku, daya pemisah yang ditambahkan kepada daya brek akan membuat huruf berhenti bergerak pada masa yang sama mereka cuba untuk menjauhkan diri dari satu sama lain.

Hasilnya adalah orang ramai yang meyakinkan cuba mencapai pintu:


Tingkah laku beratur dengan ''hentian keras'', daya brek dan pemisahan digabungkan. Klik untuk menunjukkan daya.

Kesimpulan

Tingkah laku beratur membolehkan watak-watak bertanding dan menunggu dengan sabar untuk tiba di destinasi. Sekali selaras, watak tidak akan cuba untuk ''menipu'' dengan melompat jawatan; ia akan bergerak hanya apabila watak yang betul di depannya bergerak.

Adegan pintu yang digunakan dalam tutorial ini menunjukkan betapa serba boleh dan tweakable tingkah laku ini. Beberapa perubahan menghasilkan keputusan yang berbeza, yang boleh diubah suai dengan pelbagai situasi. Tingkah laku juga boleh digabungkan dengan orang lain, seperti mengelakkan perlanggaran.

Saya harap anda menyukai tingkah laku baru ini dan mula menggunakannya untuk menambah orang ramai yang bergerak ke permainan anda!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.