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

Pengekodan Pixel Terrain Destructible: Bagaimana Membuat Semua Meletup

by
Difficulty:IntermediateLength:LongLanguages:

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

Dalam tutorial ini, kami akan melaksanakan medan piksel destructible sepenuhnya, dalam gaya permainan seperti Cortex Command and Worms. Anda akan belajar bagaimana untuk membuat dunia meletup di mana sahaja anda menembak - dan bagaimana untuk membuat "habuk" menyelesaikan di tanah untuk mewujudkan tanah baru.

Nota: Walaupun tutorial ini ditulis dalam Pemprosesan dan disusun dengan Java, anda harus menggunakan teknik dan konsep yang sama dalam hampir semua persekitaran pembangunan permainan.


Preview Keputusan Akhir

Anda juga boleh memainkan demo itu sendiri. WASD untuk bergerak, klik kiri untuk menembak peluru letupan, klik kanan untuk menyembur piksel.


Langkah 1: Terrain

Di kotak pasir kami, kami akan menjadi mekanik utama permainan kami. Algoritma serupa sering mempunyai satu imej untuk tekstur rupa bumi, dan satu lagi sebagai topeng hitam dan putih untuk menentukan piksel yang padat. Dalam demo ini, rupa bumi dan teksturnya semuanya adalah satu imej, dan piksel adalah pepejal berdasarkan sama ada ia telus atau tidak. Pendekatan topeng akan lebih sesuai jika anda ingin menentukan sifat piksel masing-masing, seperti seberapa mungkin ia akan melepaskan atau melonggarkan piksel.

Untuk menjadikan medan, kotak pasir menarik piksel statik terlebih dahulu, maka piksel dinamik dengan segala yang lain di atas.

Medan juga mempunyai kaedah untuk mencari sama ada piksel statik di lokasi adalah pepejal atau tidak, dan kaedah untuk mengeluarkan dan menambah piksel. Mungkin cara yang paling berkesan untuk menyimpan imej adalah sebagai array 1 dimensi. Mendapatkan indeks 1D dari koordinat 2D cukup mudah:

Dalam usaha untuk piksel dinamik untuk melantun, kita perlu dapat mengetahui permukaan normal pada bila-bila. Gelung melalui kawasan persegi di sekitar titik yang dikehendaki, cari semua piksel padat di dekatnya dan purata kedudukan mereka. Ambil vektor dari kedudukan itu ke titik yang dikehendaki, sebaliknya dan ubah bentuknya. Ada biasa awak!

Garis hitam mewakili normal ke medan di pelbagai titik.

Inilah caranya dalam kod:


Langkah 2: Pixel Dinamik dan Fizik

"Terrain" itu sendiri menyimpan semua piksel statik yang tidak bergerak. Pics dinamik adalah piksel yang sedang bergerak, dan disimpan secara berasingan daripada piksel statik. Apabila medan meletup dan menetap, piksel dapat bertukar di antara negeri-negeri statik dan dinamik apabila mereka melepaskan dan bertembung. Setiap piksel ditakrifkan oleh beberapa sifat:

  • Kedudukan dan halaju (diperlukan untuk fizik untuk berfungsi).
  • Bukan hanya lokasi, tetapi juga lokasi sebelumnya piksel. (Kami boleh mengimbas antara dua mata untuk mengesan perlanggaran.)
  • Ciri-ciri lain termasuk warna pixel, kelenturan, dan kepantasan.

Dalam usaha untuk memindahkan piksel, kedudukannya perlu dikemukakan dengan halajunya. Integrasi Euler, sementara tidak tepat untuk simulasi kompleks, cukup mudah bagi kita untuk memindahkan zarah kita dengan cekap:

Masaberlalu adalah jumlah masa berlalu sejak kemas kini terakhir. Ketepatan setiap simulasi boleh dipecahkan sepenuhnya jika elapsedTime terlalu berubah atau terlalu besar. Ini tidak banyak masalah untuk piksel dinamik, tetapi ia akan menjadi skim pengesanan perlanggaran yang lain.

Kami akan menggunakan waktu tamat bersaiz tetap, dengan mengambil masa yang berlalu dan memecahnya ke dalam ketinggian bersaiz yang tetap. Setiap bahagian adalah "kemas kini" penuh kepada fizik, dengan mana-mana yang dibiarkan dihantar ke kerangka seterusnya.


Langkah 3: Pengesanan Perlanggaran

Mengesan perlanggaran untuk piksel terbang kami semudah menggambar beberapa baris.

Algoritma garis Bresenham telah dibangunkan pada tahun 1962 oleh seorang lelaki bernama Jack E. Bresenham. Sehingga hari ini, ia digunakan untuk melukis garis alias mudah dengan cekap. Algoritma ini melekat dengan ketat kepada bilangan bulat dan menggunakan kebanyakan penambahan dan penolakan agar garis plot efficeintly. Hari ini kita akan menggunakannya untuk tujuan yang lain: pengesanan perlanggaran.

Saya menggunakan kod yang dipinjam dari artikel di gamedev.net. Walaupun sebahagian besar pelaksanaan algoritma garis Bresenham mengatasi pesanan susunan, ini membolehkan kita untuk sentiasa mengimbas dari awal hingga akhir. Perintah ini penting untuk pengesanan perlanggaran, jika tidak, kita akan mengesan perlanggaran di hujung yang salah dari laluan piksel.

Lereng adalah bahagian penting dari algoritma garis Bresenham. Algoritma ini berfungsi dengan memisahkan cerun ke dalam komponen "naik" dan "menjalankan"nya. Jika, contohnya, cerun garis adalah 1/2, kita boleh merancang garis dengan meletakkan dua titik secara mendatar, naik (dan kanan) satu, dan kemudian dua lagi.

Algoritma yang saya tunjukkan di sini menyumbang semua senario, sama ada garisan mempunyai lereng positif atau negatif atau jika ia menegak. Penulis menerangkan bagaimana dia memperolehnya di gamedev.net.


Langkah 4: Penanganan Perlanggaran

Piksel dinamik boleh melakukan salah satu daripada dua perkara semasa perlanggaran.

  • Jika ia bergerak dengan perlahan, piksel dinamik dikeluarkan dan satu statik ditambah ke medan di mana ia bertembung. Melekat akan menjadi penyelesaian yang paling mudah. Dalam algoritma garis Bresenham, adalah lebih baik untuk menjejaki titik sebelumnya dan titik semasa. Apabila suatu perlanggaran dikesan, "titik semasa" akan menjadi piksel padat pertama yang menyentuh sinar, manakala "titik terdahulu" adalah ruang kosong sebelum itu. Titik sebelumnya adalah betul-betul wehre lokasi yang kita perlukan untuk melekat pada piksel.
  • Jika ia bergerak terlalu cepat, maka kita akan melantunkannya di medan. Inilah di mana algoritma biasa permukaan kita masuk! Menggambarkan halaju awal bola secara normal untuk melantunkannya.
  • Sudut kedua-dua sisi normal adalah sama.


Langkah 5: Peluru dan Letupan!

Peluru bertindak sama seperti pixel dinamik. Gerakan terintegrasi dengan cara yang sama, dan pengesanan perlanggaran menggunakan algoritma yang sama. Satu-satunya perbezaan kami ialah pengendalian perlanggaran

Selepas perlanggaran dikesan, peluru meletup dengan membuang semua piksel statik dalam jejari, dan kemudian meletakkan piksel dinamik di tempat mereka dengan halaju mereka menunjuk ke luar. Saya menggunakan fungsi untuk mengimbas kawasan persegi di sekitar radius letupan untuk mengetahui piksel mana yang akan dilepaskan. Selepas itu, jarak piksel dari pusat digunakan untuk menubuhkan kelajuan.


Langkah 6: Pemain

Pemain ini bukan sebahagian teras dari mekanik rupa bumi yang destructable, tetapi ia melibatkan beberapa pengesanan perlanggaran yang pasti akan berkaitan dengan masalah yang akan tiba di masa depan. Saya akan menerangkan bagaimana pertembungan dikesan dan dikendalikan dalam demo untuk pemain.

  1. Untuk setiap tepi, gelung dari satu sudut ke sebelah, periksa setiap piksel.
  2. Jika piksel itu pepejal, mulakan di tengah pemain dan imbas ke piksel itu ke dalam anda memukul piksel padat.
  3. Pindahkan pemain dari piksel padat pertama yang anda tekan.

Langkah 7: Mengoptimumkan

Beribu-ribu piksel ditangani sekaligus, menyebabkan sedikit ketegangan pada enjin fizik. Seperti apa-apa lagi, untuk membuat ini cepat saya akan mengesyorkan menggunakan bahasa yang agak cepat. Demo disusun di Jawa.

Anda boleh melakukan perkara untuk mengoptimumkan pada tahap algoritma juga. Sebagai contoh, bilangan zarah dari letupan boleh dikurangkan dengan mengurangkan resolusi pemusnahan. Biasanya kita mencari setiap piksel dan menjadikannya piksel dinamik 1x1. Sebaliknya, imbas setiap 2x2 piksel, atau 3x3, dan melancarkan piksel dinamik saiz itu. Dalam demo kami menggunakan 2x2 piksel.

Jika anda menggunakan Java, pengumpulan sampah akan menjadi masalah. JVM akan secara berkala mencari objek dalam memori yang tidak digunakan lagi, seperti piksel dinamik yang dibuang sebagai pertukaran untuk pixel statik, dan cuba dan menyingkirkan mereka untuk memberi ruang untuk objek yang lebih banyak. Memadamkan objek, tan objek, mengambil masa walaupun, dan setiap kali JVM melakukan pembersihan, permainan kami akan membeku sebentar.

Satu penyelesaian yang mungkin untuk menggunakan sesetengah cache. Daripada membuat/memusnahkan objek sepanjang masa, anda boleh memegang objek mati (seperti piksel dinamik) untuk digunakan semula nanti.

Gunakan primitif sekiranya mungkin. Sebagai contoh, menggunakan objek untuk kedudukan dan halaju akan membuat perkara menjadi lebih sukar untuk pengumpulan sampah. Lebih baik jika anda dapat menyimpan semuanya sebagai primitif dalam tatasusunan satu dimensi.


Langkah 8: Membuatnya Sendiri

Terdapat banyak arahan yang berbeza yang boleh anda ambil dengan mekanik permainan ini. Ciri-ciri boleh ditambah dan disesuaikan untuk memadankan sebarang gaya permainan yang anda mahukan.

Sebagai contoh, perlanggaran antara pixel dinamik dan statik boleh dikendalikan dengan cara yang berbeza. Satu topeng perlanggaran di bawah medan boleh digunakan untuk menentukan ketumpatan, kelantangan, dan kekuatan pixel statik, atau kemungkinan terjatuh oleh letupan.

Terdapat pelbagai perkara yang boleh anda lakukan untuk senjata api juga. Peluru boleh diberikan "kedalaman penembusan," untuk membolehkan ia bergerak melalui begitu banyak piksel sebelum meletup. Mekanisme pistol tradisional juga boleh digunakan, seperti kadar kebakaran yang pelbagai atau, seperti senapang patah, pelbagai peluru boleh dipecat sekaligus. Anda juga boleh, seperti untuk zarah melenting, mempunyai peluru melantun dari piksel logam.


Kesimpulan

Permaidani bumi 2D tidak sepenuhnya unik. Sebagai contoh, Worms dan Tangki klasik mengeluarkan bahagian-bahagian bumi pada letupan. Perintah Cortex menggunakan zarah melenting yang sama yang kami gunakan di sini. Permainan lain mungkin juga, tetapi saya belum pernah mendengarnya. Saya berharap melihat apa yang akan dilakukan oleh pemaju lain dengan mekanik ini.

Kebanyakan apa yang saya jelaskan di sini dilaksanakan sepenuhnya dalam demo. Sila lihat pada sumbernya jika ada yang kelihatan samar atau mengelirukan. Saya telah menambah komen kepada sumber untuk menjadikannya lebih jelas. Terima kasih untuk membaca!

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.