Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Game Development
  2. Programming
Gamedevelopment

Buat Permainan Asteroid Mudah Menggunakan Entitas Berbasis Komponen

by
Difficulty:IntermediateLength:LongLanguages:

Malay (Melayu) translation by Aisyah Arrafah (you can also view the original English article)

Dalam tutorial terdahulu, kami mencipta sistem Entity berasaskan komponen kosong. Sekarang kita akan menggunakan sistem ini untuk membuat permainan Asteroid mudah.


Preview Keputusan Akhir


Berikut adalah permainan Asteroid mudah yang akan kami buat dalam tutorial ini. Ia ditulis menggunakan Flash dan AS3, tetapi konsep umum digunakan untuk kebanyakan bahasa.

Kod sumber penuh boleh didapati di GitHub.


Gambaran Keseluruhan Kelas

Terdapat enam kelas:

  • AsteroidsGame, yang memanjangkan kelas permainan asas dan menambahkan logik khusus kepada ruang shoot-'em-up kami.
  • Kapal, yang merupakan perkara yang anda kendalikan.
  • Asteroid, yang merupakan perkara yang anda pancarkan.
  • Bullet, yang merupakan perkara yang anda api.
  • Gun, yang mencipta peluru itu.
  • EnemyShip, yang merupakan pengembara alien yang ada di sana untuk menambah sedikit variasi kepada permainan.
  • Mari kita melalui jenis entiti ini satu demi satu.


    Kelas Kapal

    Kami akan bermula dengan kapal pemain:

Terdapat sedikit butiran pelaksanaan di sini, tetapi perkara utama yang perlu diperhatikan ialah dalam pembina yang kita instantiate dan mengkonfigurasi komponen Body, Physics, Health, View dan Weapon. (Komponen Senjata sebenarnya adalah contoh Gun daripada kelas asas senjata.)

Saya menggunakan API lukisan grafik Flash untuk membuat kapal saya (garisan 29-32), tetapi kita boleh menggunakan imej bitmap dengan mudah. Saya juga membuat contoh kelas Gamepad saya - ini merupakan perpustakaan sumber terbuka yang saya tulis beberapa tahun lalu untuk membuat input keyboard lebih mudah dalam Flash.

Saya juga telah menindih fungsi kemas kini dari kelas asas untuk menambah beberapa tingkah laku tersuai: selepas mencetuskan semua kelakuan lalai dengan super.update () kami berputar dan mengetuk kapal berdasarkan input keyboard, dan api senjata jika kunci api ditekan.

Dengan mendengar isyarat komponen kesihatan yang mati, kami mencetuskan fungsi ondied jika pemain kehabisan mata. Apabila ini berlaku, kami hanya memberitahu kapal untuk memusnahkan dirinya.


The Gun Class

Kemudian mari kita api kelas Gun:

Ini adalah yang pendek! Kami hanya menimpa fungsi api () untuk membuat Bullet baru setiap kali kebakaran pemain. Selepas memadankan kedudukan dan putaran peluru ke kapal, dan mengusirnya ke arah yang betul, kami menghantar entitiCipta supaya ia boleh ditambah kepada permainan.

Satu perkara yang hebat tentang kelas Gun ini ialah ia digunakan oleh kedua-dua pemain dan kapal musuh.


Kelas Peluru

A Gun mewujudkan contoh kelas Bullet ini:

Pembina instantiates dan mengkonfigurasi badan, fizik dan pandangan. Dalam fungsi kemas kini, anda kini dapat melihat senarai yang dipanggil sasaran yang berguna, kerana kita melengkung melalui semua perkara yang kita mahu memukul dan melihat jika mana-mana daripada mereka memotong peluru.

Sistem perlanggaran ini tidak akan memberi skala kepada ribuan peluru, tetapi baik untuk kebanyakan permainan kasual.

Sekiranya peluru mendapat lebih daripada 20 bingkai yang lama, kita mula memudarkannya, dan jika ia lebih tua daripada 25 bingkai kita memusnahkannya. Seperti dengan Gun, Bullet digunakan oleh pemain dan musuh - contohnya hanya mempunyai senarai sasaran yang berbeza.

Bercakap tentang ...


Kelas EnemyShip

Sekarang mari kita lihat kapal musuh:

Seperti yang anda lihat, ia agak serupa dengan kelas kapal pemain. Satu-satunya perbezaan nyata adalah bahawa dalam fungsi update (), bukannya mempunyai kawalan pemain melalui papan kekunci, kami mempunyai beberapa 'kebodohan buatan' untuk membuat kapal bersiar-siar dan api secara rawak.


Kelas Asteroid

Jenis entiti lain yang pemain boleh menembak adalah asteroid itu sendiri:

Semoga anda membiasakan bagaimana kelas entiti ini kelihatan sekarang.

Dalam pembina kita memulakan komponen kita dan mengasingkan kedudukan dan halaju.

Dalam fungsi kemas kini () kami memeriksa perlanggaran dengan senarai sasaran kami - yang dalam contoh ini hanya akan mempunyai satu item - kapal pemain. Sekiranya kita menemui perlanggaran, kita akan merosakkan sasaran dan kemudian memusnahkan asteroid tersebut. Sebaliknya, jika asteroid itu sendiri rosak (iaitu dilanggar oleh peluru pemain), kami mengecilkannya dan mencipta asteroid kedua, mewujudkan ilusi bahawa ia telah diletupkan menjadi dua keping. Kami tahu bila melakukan ini dengan mendengar isyarat 'sakit' komponen Kesihatan.


Kelas AsteroidsGame

Akhirnya, mari kita lihat kelas AsteroidsGame yang mengawal keseluruhan pertunjukan:

Kelas ini agak panjang (lebih baik, lebih daripada 100 baris!) Kerana ia banyak perkara.

Dalam startGame () ia mencipta dan mengkonfigurasi 10 asteroid, kapal dan kapal musuh, dan juga mencipta mesej 'CLICK TO START'.

Fungsi start () berfungsi tidak membuang-buang permainan dan menghilangkan mesej, sementara fungsi GameOver menjeda permainan sekali lagi dan memulihkan mesej. Fungsi restart () untuk klik mouse pada skrin Permainan Over - apabila ini berlaku ia menghentikan permainan dan memulakannya sekali lagi.

Kemas kini () fungsi gelung melalui semua musuh dan meledingkan apa-apa yang telah hanyut dari skrin, serta memeriksa keadaan menang, iaitu bahawa tidak ada musuh yang tersisa dalam senarai musuh.


Mengambil Lagi

Ini adalah enjin tulang yang cukup telanjang dan permainan yang mudah, jadi sekarang mari kita berfikir tentang cara kita dapat mengembangkannya.

  • Kami boleh menambah nilai keutamaan bagi setiap entiti, dan menyusun senarai sebelum setiap kemas kini, supaya kami dapat memastikan bahawa beberapa jenis Entiti sentiasa kemas kini selepas jenis lain.
  • Kita boleh menggunakan penggabungan objek supaya kita menggunakan semula objek mati (cth. Peluru) dan bukan hanya membuat beratus-ratus yang baru.
  • Kita boleh menambah sistem kamera supaya kita dapat menatal dan zum tempat kejadian. Kami boleh melanjutkan komponen Body dan Physics untuk menambah sokongan untuk Box2D atau enjin fizik lain.
  • Kita boleh membuat komponen inventori, supaya entiti boleh membawa barang-barang.

Serta memperluas komponen individu, kita mungkin kadang-kadang perlu melanjutkan antara muka IEntity untuk membuat Entity jenis khas dengan komponen khusus.

Sebagai contoh, jika kita membuat permainan platform, dan kita mempunyai komponen baru yang mengendalikan semua perkara yang sangat khusus yang diperlukan oleh watak permainan platform - apakah mereka berada di tanah, adakah mereka menyentuh dinding, berapa lama mereka telah di udara, boleh mereka melompat-lompat, dan sebagainya - entiti lain mungkin juga perlu mengakses maklumat ini. Tetapi ia bukan sebahagian daripada teras Entity API, yang disimpan secara sengaja sangat umum. Oleh itu, kita perlu menentukan antara muka baru yang menyediakan akses kepada semua komponen entiti standard, tetapi menambah akses kepada komponen PlatformController.

Untuk ini, kami akan melakukan sesuatu seperti:

Mana-mana entiti yang memerlukan fungsi 'platforming' kemudian melaksanakan antara muka ini, membolehkan entiti lain berinteraksi dengan komponen PlatformController.


Conclusionsnounkesimpulanconclusion, deduction

Malah dengan berani untuk menulis tentang seni bina permainan, saya takut saya mengaduk sarang pendapat - tetapi itu (kebanyakannya) selalu menjadi perkara yang baik, dan saya harap sekurang-kurangnya saya telah membuat anda berfikir tentang bagaimana anda mengatur anda kod.

Pada akhirnya, saya tidak percaya anda harus terlalu bergantung pada bagaimana anda menyusun sesuatu; apa-apa yang bekerja untuk anda untuk mendapatkan permainan anda adalah strategi terbaik. Saya tahu terdapat sistem yang jauh lebih maju yang saya gariskan di sini, yang menyelesaikan pelbagai isu di luar yang saya telah dibincangkan, tetapi mereka mungkin akan mula kelihatan sangat tidak dikenali jika anda terbiasa dengan seni bina berasaskan warisan tradisional.

Saya suka pendekatan yang saya dicadangkan di sini kerana ia membolehkan kod itu dianjurkan dengan tujuan, ke dalam kelas kecil yang difokuskan, sambil menyediakan antara muka yang ditafsirkan secara statik, diperluaskan dan tanpa bergantung pada ciri bahasa dinamik atau pencarian String. Jika anda ingin mengubah tingkah laku komponen tertentu, anda boleh memperluas komponen itu dan mengatasi kaedah yang ingin anda ubah. Kelas cenderung untuk kekal pendek, jadi saya tidak pernah mendapati diri saya menatal melalui ribuan talian untuk mencari kod yang saya cari.

Paling penting, saya dapat mempunyai satu enjin tunggal yang cukup fleksibel untuk digunakan di semua permainan yang saya buat, menjimatkan saya sejumlah besar masa.

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.