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

Buat Permainan Hoki Ai dengan Menggunakan Kelakuan Berkendara: Yayasan

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Create AI for a Hockey Game Using Steering Behaviors.
Create a Hockey Game AI Using Steering Behaviors: Attack

Malay (Melayu) translation by Aeni Amalia (you can also view the original English article)

Terdapat pelbagai cara untuk membuat permainan tertentu.  Biasanya seorang pemaju memilih sesuatu yang sesuai dengan kepakarannya, menggunakan teknik yang sudah dia ketahui untuk menghasilkan hasil yang terbaik.  Kadang-kadang, orang tidak tahu bahawa mereka memerlukan teknik tertentu - mungkin lebih mudah dan lebih baik - hanya kerana mereka sudah tahu bagaimana membuat permainan.

Dalam siri tutorial ini, anda akan belajar bagaimana untuk membuat kecerdasan buatan untuk permainan hoki menggunakan gabungan teknik, seperti tingkah laku stereng , yang telah saya jelaskan sebagai konsep.

Nota: Walaupun tutorial ini ditulis menggunakan AS3 dan Flash, anda harus menggunakan teknik dan konsep yang sama dalam hampir semua persekitaran pembangunan permainan.


Pengenalan

Hoki adalah sukan yang menyeronokkan dan popular, dan seperti permainan video, permainan ini menggabungkan banyak topik gamedev, seperti corak pergerakan, kerja berpasukan (serangan, pertahanan), kecerdasan buatan, dan taktik.  Permainan hoki yang boleh dimainkan sangat sesuai untuk menunjukkan gabungan beberapa teknik berguna.

Untuk mensimulasikan mekanik hoki, dengan atlet berjalan dan bergerak, adalah satu cabaran dalam dirinya sendiri.  Sekiranya corak pergerakan telah ditentukan, walaupun dengan laluan yang berlainan, permainan menjadi mudah diramal (dan membosankan).  Bagaimanakah kita dapat melaksanakan persekitaran dinamik sedemikian ketika masih mengawal apa yang berlaku? Jawapannya ialah: menggunakan kelakuan stereng .

Tingkah laku pemanduan bertujuan untuk mencipta corak pergerakan yang realistik dengan navigasi improvisasi.  Mereka didasarkan pada kekuatan mudah yang digabungkan setiap kemas kini permainan, jadi ia sangat dinamik. Ini menjadikan mereka pilihan yang sempurna untuk melaksanakan sesuatu yang rumit dan dinamik seperti hoki atau permainan bola sepak.

Sapukan untuk Pekerjaan

Demi masa dan pengajaran, mari kita mengurangkan skop permainan sedikit. Permainan hoki kami hanya akan mengikuti satu set kecil peraturan sukan asal: dalam permainan kami tidak akan ada penalti penalti dan tiada penjaga gol, jadi atlet mana pun boleh bergerak di sekeliling arena:

Permainan hoki menggunakan peraturan yang dipermudahkan.

Setiap gawang akan digantikan dengan "dinding" kecil tanpa jaring.  Untuk menjaringkan gol, pasukan mesti menggerakkan puck (bola hoki) untuk menyentuh mana-mana pihak lawan sasaran.  Apabila seseorang mendapat skor, kedua-dua pasukan akan menyusun semulanya, dan puck akan diletakkan di tengah; Perlawanan akan disambung beberapa saat selepas itu.

Mengenai pengendalian keping: jika seorang atlet, contohnya seorang atlet mempunyai keping dan disentuh oleh lawan, kata atlet B, kemudian B mencapai keping dan A menjadi tidak bergerak selama beberapa saat.  Sekiranya puck meninggalkan arena, ia akan segera diletakkan di tengah arena.

Saya akan menggunakan enjin permainan Flixel untuk menjaga bahagian grafik kod.  Walau bagaimanapun, kod mesin akan dipermudahkan atau dihapuskan dalam contoh, untuk tetap fokus pada permainan itu sendiri.

Menstrukturkan Alam Sekitar

Mari kita mulakan dengan persekitaran permainan, yang terdiri daripada arena, beberapa atlet, dan dua gawang.  Balap pacuan itu diperbuat daripada segi empat tepat diletakkan di sekitar kawasan ais; Segi empat tepat ini akan bertembung dengan segala yang menyentuh mereka, sehingga tiada siapa yang akan meninggalkan kawasan es.

Seorang atlet akan diterangkan oleh kelas Athlete :

Harta mBoid adalah turunan dari kelas Boid , suatu enkapsulasi logika matematik yang digunakan dalam litar tingkah stereng .  Contoh mBoid termasuk, vektor matematik yang menggambarkan arah semasa, daya stereng, dan kedudukan entiti.

Kaedah update() dalam kelas Athlete akan digunakan setiap kali kemas kini permainan.  Buat masa ini, kaedah ini hanya digunakan untuk membersihkan daya stereng yang aktif, menambah gaya bersiar - siar , dan akhirnya memanggil mBoid.update() .  Perintah sebelumnya mengemas kini semua logik tingkah stereng yang mBoid di mBoid , dengan itu menjadikan pergerakan atlet (menggunakan integrasi Euler ).

Kelas permainan yang bertanggungjawab untuk permainan gelung, akan dipanggil PlayState .  Kelas permainan ini mempunyai arena, dua kumpulan atlet (satu untuk setiap pasukan) dan dua gol:

Dengan mengandaikan bahawa seorang atlet ditambah ke perlawanan, setakat ini adalah hasil dari semua:

Berikutan Kursor Mouse

Atlet mesti mengikuti kursor tetikus, jadi pemain benar-benar boleh mengawal sesuatu.  Oleh kerana kursor tetikus mempunyai kedudukan di skrin, ia boleh menjadi tujuan untuk tingkah laku ketibaan .

Tingkah laku ketibaan akan membuat seorang atlet mencari kedudukan kursor, melambatkan dengan cepat apabila menghampiri kursor, dan akhirnya berhenti di sana.

Dalam kelas Athlete , mari kita ubah cara mengembara dengan tingkah laku ketibaan:

Hasilnya adalah seorang atlet yang boleh menggerakkan kursor tetikus.  Oleh kerana logik gerak didasarkan pada kelakuan stereng, atlet menavigasi arena dengan cara yang meyakinkan dan lancar.

Gunakan kursor tetikus untuk membimbing atlet dalam demo di bawah:

Menambah dan Mengawal Puck

Puck akan diwakili oleh kelas Puck .  Bahagian yang paling penting ialah kaedah update() dan mOwner :

Berikutan logik atletik yang sama, kaedah puck update() akan dipandu setiap kali permainan dikemas kini.  a Properti mOwner pembeli menentukan sama ada keping wujud dengan mana-mana atlet.  Sekiranya mOwner adalah null , ia bermakna "bebas", dan akan bergerak, akhirnya memantul arena yang sedang berjalan.

Sekiranya mOwner tidak null , itu bermakna puck sedang dibawa oleh seorang atlet.  Dalam kes ini, ia akan mengabaikan pemeriksaan perlanggaran dan akan ditempatkan secara paksa di hadapan atlet.  Ini boleh dicapai dengan menggunakan vektor velocity atlet, yang juga sesuai dengan arah atlet:

Penjelasan bagaimana kepingan itu diletakkan di hadapan atlet.

Vektor di ahead adalah salinan vektor velocity atlet, jadi ia membawa arah yang sama.  Apabila bahagian depan dinormalisasi, ia akan dipertingkatkan kepada apa-apa nilai-katakan 30 untuk mengawal sejauh mana keping itu akan diletakkan di hadapan atlet.

Akhirnya, posisi puck menerima posisi atlet yang ditambah ke bahagian depan , meletakkan keping di posisi yang dikehendaki.

Berikut ialah kod untuk kesemuanya:

Di dalam kelas PlayState , terdapat ujian perlanggaran untuk memeriksa sama ada puck itu bertindih dengan mana-mana atlet.  Jika ya, atlet yang hanya menyentuh keping itu menjadi pemilik barunya.  Hasilnya adalah satu "tongkat" kepada atlet.  Dalam demo di bawah, aturkan atlet untuk menyentuh keping di tengah arena untuk melihat tindakan ini:


Membuat Puck

Sudah tiba masanya untuk membuat puck bergerak akibat terkena batang. Terlepas dari atlet yang membawa puck, semua yang diperlukan untuk mensimulasikan pemukul oleh tongkat adalah untuk mengira vektor halaju baru.  Kelajuan baru akan bergerak ke arah destinasi yang dikehendaki.

Halaju vektor boleh dihasilkan oleh satu vektor kedudukan lain; vektor yang baru dijana akan bergerak dari satu kedudukan ke tempat lain.  Itulah yang diperlukan untuk mengira kepalan halaju halaju baru selepas dipukul:

Pengiraan kelajuan puck baru selepas dilanggar oleh kayu.

Dalam gambar di atas, titik destinasi adalah kursor tetikus.  Kedudukan puck semasa boleh digunakan sebagai titik permulaan, manakala titik di mana cip harus selepas ia telah dilanggar oleh batang boleh digunakan sebagai titik akhir.

Kod pseudo di bawah menunjukkan pelaksanaan goFromStickHit() , satu kaedah dalam kelas Puck yang melaksanakan logik yang diterangkan dalam imej di atas:

The new_velocity vektor beralih dari kedudukan puck semasa ke sasaran ( theDestination ).  Selepas itu, ia dinormalisasi dan diselaraskan oleh theSpeed , yang mentakrifkan magnitud (panjang) new_velocity .  Operasi, dalam erti kata lain, menentukan berapa cepat keping akan bergerak dari kedudukannya sekarang ke destinasi.  Akhirnya, vektor  velocity digantikan dengan new_velocity .

Dalam kelas PlayState , kaedah goFromStichHit() digunakan setiap kali pemain mengklik pada skrin.  Apabila itu berlaku, kursor tetikus digunakan sebagai matlamat pemukul.  Hasilnya dapat dilihat dalam demo ini:

Menambah AI

Setakat ini, kami hanya mempunyai seorang atlet yang bergerak di sekitar arena.  Apabila lebih banyak atlet ditambah, AI perlu dilaksanakan untuk menjadikan semua atlet ini kelihatan seperti mereka hidup dan berfikir.

Untuk mencapai matlamat ini, kami akan menggunakan enjin yang berdasarkan berasaskan stack yang berasaskan stack (pendek berasaskan stack).  Seperti yang dinyatakan sebelum ini , FSM sangat serba boleh dan berguna untuk melaksanakan AI dalam permainan.

Untuk permainan hoki kami, hartanah bernama mBrain akan ditambahkan kepada kelas Athlete :

Harta ini adalah contoh StackFSM , kelas yang digunakan sebelum ini dalam tutorial FSM .  Ia menggunakan tindanan untuk mengawal kedudukan AI entiti. Setiap kedudukan digambarkan sebagai kaedah; Apabila kedudukan ditolak ke dalam longgokan, ia menjadi kaedah yang aktif dan akan muncul setiap permainan dikemas kini.

Setiap kedudukan akan melakukan tugas tertentu, seperti menggerakkan atlet ke puck.  Setiap kedudukan akan bertanggungjawab untuk menamatkan dirinya sendiri, yang bermaksud ia bertanggung jawab untuk muncul dari longgokan.

Atlet dapat dikendalikan oleh pemain atau oleh AI sekarang, sehingga kaedah update() dalam kelas Athlete harus diubahsuai untuk memeriksa keadaan:

Sekiranya AI aktif, mBrain akan dikemas kini, yang menimbulkan kaedah kedudukan semasa yang aktif, menjadikan atlet berkelakuan dengan sewajarnya.  Jika pemain berada dalam keadaan terkawal, maka mBrain akan diabaikan secara serentak dan atlet bergerak seolah-olah dipandu oleh pemain.

Mengenai kedudukan yang ditekan ke otak: sekarang mari kita menggunakan dua keadaan.  Kedudukan akan membiarkan seorang atlet mempersiapkan diri untuk perlawanan; Apabila bersiap untuk perlawanan, seorang atlet akan bergerak ke kedudukannya di arena dan berdiri diam, menatap kepalanya. jawatan lain akan membuat atlet berdiri diam dan melihat poketnya.

Dalam bahagian seterusnya, kami akan memohon kedudukan ini.

Kedudukan senyap

Jika atlet itu idle , dia akan berhenti bergerak dan melihat kepalanya.  Keadaan ini digunakan apabila atlet sudah berada dalam kedudukan di arena dan sedang menunggu sesuatu berlaku, seperti permulaan permainan.

Kedudukan ini akan dikodkan dalam kelas Athlete , dengan kaedah idle() :

Oleh kerana kaedah ini tidak muncul dari timbunan, ia akan kekal aktif selama-lamanya.  Pada peringkat seterusnya, kedudukan ini akan kelihatan untuk memberi ruang untuk kedudukan lain, seperti serangan , tetapi untuk sekarang, ini memang silap.

Kaedah stopAndStareAt() mengikuti prinsip yang sama yang digunakan untuk mengira halaju puck selepas pukulan.  Satu vektor dari kedudukan atlet ke posisi puck dikira oleh thePoint - mBoid.position dan digunakan sebagai vektor halaju baru atlet.

Vektor halaju baru akan memindahkan atlet ke arah puck.  Untuk memastikan bahawa atlet tidak bergerak, vektor adalah skala 0,01 , "mengecilkan" panjang kepada hampir sifar.  Ia menjadikan atlet berhenti bergerak, tetapi masih membuatnya melihat kepalanya.

Bersedia untuk Pertandingan

Jika atlet berada dalam keadaan prepareForMatch , ia akan bergerak ke kedudukan asalnya, berhenti lancar di sana.  Kedudukan permulaan adalah di mana atlet harus betul sebelum permainan bermula.  Kerana atlet mesti berhenti di destinasi, kaedah tingkah laku ketibaan boleh digunakan lagi:

Kedudukannya menggunakan kaedah tingkah laku ketibaan untuk memindahkan atlet ke kedudukan permulaan.  Sekiranya jarak antara atlet dan kedudukan permulaan adalah kurang daripada , bermakna atlet telah mencapai tempat yang diingini.  Apabila ini berlaku, prepareForMatch akan muncul dari timbunan dan menolak ia idle , menjadikannya keadaan aktif yang baru.

Berikut adalah hasil menggunakan FSM berasaskan stack untuk mengawal atlet berganda.  Tekan untuk menempatkannya dalam kedudukan rawak di arena, menolak kedudukan prepareForMatch :


Kesimpulannya

Tutorial ini membentangkan asas-asas untuk memohon permainan hoki menggunakan kelakuan stereng dan mesin keadaan terhingga berasaskan stack .  Dengan menggunakan gabungan konsep-konsep ini, seorang atlet boleh bergerak di arena, mengikuti kursor tetikus.  Atlet juga boleh memukul puck ke arah destinasinya.

 Dengan menggunakan dua buatan dan buasir berasaskan FSM, para atlet boleh menyusun semula dan bergerak ke kedudukan mereka di arena, untuk mempersiapkan perlawanan. 

Dalam tutorial seterusnya, anda akan belajar bagaimana untuk membuat atlet menyerang, membawa puck ke arah gawang sambil mengelakkan lawan.

Sumber

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.