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

Membuat Permainan Asteroid Sederhana Menggunakan Entitas Berbasis Komponen

by
Difficulty:IntermediateLength:LongLanguages:

Indonesian (Bahasa Indonesia) translation by Ari Ana (you can also view the original English article)

Dalam tutorial sebelumnya, kita membuat sistem Entity berbasis komponen dasar. Sekarang kita akan menggunakan sistem ini untuk membuat permainan Asteroid sederhana.


Pratinjau Hasil Akhir


Inilah permainan Asteroid sederhana yang akan kita buat dalam tutorial ini. Ini ditulis menggunakan Flash dan AS3, tetapi konsep umumnya berlaku untuk sebagian besar bahasa.

Kode sumber lengkap tersedia di GitHub.


Tinjauan Kelas

Ada enam kelas:

  • AsteroidsGame, yang memperluas kelas permainan dasar dan menambahkan logika khusus untuk shoot-'em-up luar angkasa kita.
  • Ship, yang merupakan hal yang Anda kendalikan.
  • Asteroid, yang merupakan benda yang Anda tembak.
  • Bullet, yang merupakan benda yang Anda tembakkan.
  • Gun, yang menciptakan peluru itu.
  • EnemyShip, yang merupakan alien pengembara yang baru saja ada untuk menambahkan sedikit variasi ke permainan.
  • Mari kita telusuri jenis-jenis entitas ini satu per satu.


    Kelas Ship

    Kita akan memulai dengan pesawat pemain:

Ada sedikit detail implementasi di sini, tetapi hal utama yang perlu diperhatikan adalah bahwa dalam constructor yang kita instansiasi dan mengkonfigurasi komponen Body, Physics, Health, View dan Weapon. (Komponen Weapon sebenarnya adalah instance dari Gun daripada kelas dasar weapon.)

Saya menggunakan API gambar grafis dari Flash untuk membuat pesawat saya (baris 29-32), tapi kita bisa dengan mudah menggunakan gambar bitmap. Saya juga membuat instance kelas Gamepad saya -- ini adalah perpustakaan open source yang saya tulis beberapa tahun yang lalu untuk mempermudah masukan keyboard di Flash.

Saya juga mengganti fungsi update dari kelas dasar untuk menambahkan beberapa perilaku khusus: setelah memicu semua perilaku default dengan super.update() kita memutar dan mendorong kapal berdasarkan masukan keyboard, dan menembakkan senjata jika kunci penembakan ditekan.

Dengan mendengarkan Signal died dari komponen health, kita memicu fungsi onDied jika pemain kehabisan poin hit. Ketika ini terjadi, kita hanya memberitahu pesawat untuk menghancurkan dirinya sendiri.


Kelas Gun

Selanjutnya mari kita jalankan kelas Gun itu:

Ini adalah kelas pendek yang bagus! Kita hanya mengganti fungsi fire() untuk membuat Bullet baru setiap kali pemain menembak. Setelah mencocokkan posisi dan rotasi peluru ke kapal, dan menusukkannya ke arah yang benar, kita mengirim entityCreated sehingga dapat ditambahkan ke permainan.

Hal yang hebat tentang kelas Gun ini adalah bahwa ini digunakan oleh pesawat pemain dan musuh.


Kelas Bullet

Gun menciptakan instance dari kelas Bullet ini:

Constructor melakukan instansiasi dan mengkonfigurasi body, physics dan view. Dalam fungsi pembaruan, Anda sekarang dapat melihat daftar yang disebut targets menjadi sangat berguna, karena kita melakukan perulangan semua hal yang ingin kita tekan dan melihat apakah ada dari mereka yang berpotongan.

Sistem tabrakan ini tidak akan mencapai ribuan peluru, tetapi bagus untuk sebagian besar permainan kasual.

Jika peluru menjadi lebih dari 20 frame kita mulai memudarkannya, dan jika lebih dari 25 frame kita menghancurkannya. Seperti halnya Gun, Bullet digunakan oleh pemain dan musuh -- instance hanya memiliki daftar target yang berbeda.

Ngomong-ngomong soal...


Kelas EnemyShip

Sekarang mari kita lihat pesawat musuh itu:

Seperti yang Anda lihat, ini cukup mirip dengan kelas ship pemain. Satu-satunya perbedaan nyata adalah bahwa dalam fungsi update(), daripada memiliki kontrol pemain melalui keyboard, kita memiliki beberapa "kebodohan buatan" untuk membuat pesawat mengembara dan menembak secara acak.


Kelas Asteroid

Jenis entitas lain yang dapat ditembaki pemain adalah asteroid itu sendiri:

Semoga Anda terbiasa dengan bagaimana kelas entitas ini terlihat sekarang.

Dalam constructor kita menginisialisasi komponen kita dan mengacak posisi dan kecepatan.

Dalam fungsi update() kita memeriksa tabrakan dengan daftar target kita -- yang dalam contoh ini hanya akan memiliki satu item -- pesawat pemain. Jika kita menemukan tabrakan kita merusak target dan kemudian menghancurkan asteroid. Di sisi lain, jika asteroid itu sendiri rusak (mis. ia terkena peluru pemain), kita mengecilkannya dan membuat asteroid kedua, menciptakan ilusi bahwa asteroid itu telah hancur menjadi dua bagian. Kita tahu kapan harus melakukan ini dengan mendengarkan Signal "hurt" dari komponen Health.


Kelas AsteroidsGame

Akhirnya, mari kita lihat kelas AsteroidsGame yang mengontrol seluruh pertunjukannya:

Kelas ini cukup panjang (yah, lebih dari 100 baris!) karena ia melakukan banyak hal.

Di startGame() ia membuat dan mengkonfigurasi 10 asteroid, pesawat dan pesawat musuh, dan juga membuat pesan "CLICK TO START".

Fungsi start() membatalkan permainan dan menghapus pesan, sedangkan fungsi gameOver menjeda permainan lagi dan mengembalikan pesannya. Fungsi restart() melakukan listen klik mouse pada layar Game Over - ketika ini terjadi, permainan akan berhenti dan mulai lagi.

Fungsi update() melakukan perulangan melalui semua musuh dan mencakup semua yang telah keluar dari layar, serta memeriksa kondisi menang, yaitu bahwa tidak ada musuh yang tersisa dalam daftar musuh.


Mengambil Lebih Lanjut

Ini adalah mesin yang sangat sederhana dan permainan sederhana, jadi sekarang mari kita pikirkan cara-cara untuk mengembangkannya.

  • Kita dapat menambahkan nilai prioritas untuk setiap entitas, dan mengurutkan daftar sebelum setiap pembaruan, sehingga kita dapat memastikan bahwa beberapa jenis Entity selalu diperbarui setelah jenis lainnya.
  • Kita dapat menggunakan object pooling sehingga kita menggunakan kembali obyek yang mati (mis. peluru), alih-alih hanya membuat ratusan obyek baru.
  • Kita dapat menambahkan sistem kamera sehingga kita dapat menggulir dan memperbesar tampilan. Kita dapat memperluas komponen Body dan Physics untuk menambahkan dukungan untuk Box2D atau mesin fisika lainnya.
  • Kita dapat membuat komponen inventaris, sehingga entitas dapat membawa barang.

Selain memperluas masing-masing komponen, kadang-kadang kita perlu memperluas antarmuka IEntity untuk membuat tipe khusus Entity dengan komponen khusus.

Misalnya, jika kita membuat permainan platform, dan kita memiliki komponen baru yang menangani semua hal yang sangat spesifik yang dibutuhkan oleh karakter permainan platform -- apakah mereka ada di tanah, apakah mereka menyentuh dinding, sudah berapa lama mereka di udara, dapatkah mereka melompat dua kali, dll. -- entitas lain mungkin juga perlu mengakses informasi ini. Tetapi ini bukan bagian dari API Entity inti, yang sengaja dibuat sangat umum. Jadi kita perlu mendefinisikan antarmuka baru, yang menyediakan akses ke semua komponen entitas standar, tetapi menambahkan akses ke komponen PlatformController.

Untuk ini, kita akan melakukan sesuatu seperti:

Entitas apa pun yang membutuhkan fungsionalitas "platforming" kemudian mengimplementasikan antarmuka ini, memungkinkan entitas lain untuk berinteraksi dengan komponen PlatformController.


Kesimpulan

Dengan bahkan berani menulis tentang arsitektur permainan, saya khawatir saya mengaduk-aduk pendapat yang rumit -- tapi itu (kebanyakan) selalu merupakan hal yang baik, dan saya harap setidaknya saya membuat Anda berpikir tentang bagaimana Anda mengatur kode Anda.

Pada akhirnya, saya tidak percaya Anda harus memutuskan tentang bagaimana Anda menyusun berbagai hal; apa pun yang berhasil bagi Anda untuk menyelesaikan permainan adalah strategi terbaik. Saya tahu ada sistem yang jauh lebih maju yang saya uraikan di sini, yang memecahkan berbagai masalah di luar yang telah saya bahas, tetapi mereka cenderung mulai tampak sangat asing jika Anda terbiasa dengan arsitektur tradisional berbasis pewarisan.

Saya suka pendekatan yang saya sarankan di sini karena memungkinkan kode untuk diatur dengan sengaja, ke dalam kelas-kelas kecil yang difokuskan, sambil memberikan antarmuka yang diketik secara statis, dapat diperluas dan tanpa mengandalkan fitur bahasa dinamis atau pencarian String. Jika Anda ingin mengubah perilaku komponen tertentu, Anda dapat memperluas komponen itu dan mengganti metode yang ingin Anda ubah. Kelas cenderung tetap sangat singkat, jadi saya tidak pernah menemukan diri saya menelusuri ribuan baris untuk menemukan kode yang saya cari.

Yang terbaik dari semuanya, saya dapat memiliki satu mesin yang cukup fleksibel untuk digunakan di semua permainan yang saya buat, menghemat banyak waktu.

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.