Tutorial Game Platformer

Panduan untuk mengimplementasikan platformer 2D

Empat Cara Implementasi

Tipe # 1: Berbasis ubin (murni)

Gerakan karakter terbatas pada ubin, jadi Anda tidak akan pernah bisa berdiri di antara dua ubin. Animasi dapat digunakan untuk menciptakan ilusi gerakan halus, tetapi sejauh menyangkut logika permainan, pemain selalu tepat di atas ubin tertentu. Ini adalah cara termudah untuk mengimplementasikan gim platform, tetapi memberlakukan batasan besar pada kontrol karakter, membuatnya tidak cocok untuk platformer berbasis aksi tradisional. Namun, ini populer dengan platformer teka-teki dan “sinematografi”.

Kilas balik, ditunjukkan dengan batas ubin

Contoh: Pangeran Persia, Toki Tori, Lode Runner, Flashback

Bagaimana itu bekerja

Peta adalah kotak ubin, masing-masing menyimpan informasi seperti apakah itu penghalang atau tidak, gambar apa yang digunakan, suara langkah kaki apa yang digunakan, dan sebagainya. Pemain dan karakter lain diwakili oleh satu set atau lebih ubin yang bergerak bersama. Dalam Lode Runner, misalnya, pemain adalah ubin tunggal. Di Toki Tori, pemain adalah 2 × 2 ubin. Dalam Flashback, yang tidak biasa karena ukuran ubinnya yang lebih kecil, pemain memiliki lebar dua ubin dan tinggi lima ubin (lihat gambar di atas) saat berdiri, tetapi hanya tiga ubin yang tinggi saat berjongkok.

Dalam permainan seperti ini, pemain jarang akan – jika pernah – bergerak secara diagonal, tetapi, jika dia, gerakannya dapat diuraikan dalam dua langkah terpisah. Demikian juga, ia kemungkinan hanya akan memindahkan satu ubin sekaligus, tetapi gerakan multi-ubin dapat dilakukan sebagai beberapa langkah dari satu ubin, jika diperlukan (dalam Flashback, Anda selalu memindahkan dua ubin sekaligus). Algoritma tersebut adalah sebagai berikut:

  1. Buat salinan karakter tempat ia ingin pindah (misalnya, jika memindahkan satu ubin ke kanan, buat salinan di mana setiap ubin karakter digeser 1 ubin ke kanan)
  2. Periksa salinan itu untuk persimpangan dengan latar belakang dan karakter lain.
  3. Jika persimpangan ditemukan, gerakan karakter diblokir. Bereaksi sesuai itu.
  4. Kalau tidak, jalannya jelas. Pindahkan karakter ke sana, secara opsional memainkan animasi sehingga transisi terlihat mulus.

Gerakan semacam ini sangat tidak cocok untuk lompatan berbentuk busur tradisional – sehingga permainan dalam genre ini sering tidak memiliki lompatan sama sekali (Toki Tori, Lode Runner), atau hanya memungkinkan lompatan vertikal atau horizontal (Prince of Persia, Flashback), yang tidak lain adalah kasus khusus dari pergerakan linier.

Keuntungan dari sistem ini termasuk kesederhanaan dan ketepatan. Karena gim lebih deterministik, kemungkinan gangguan lebih kecil, dan pengalaman gim lebih terkontrol, dengan sedikit kebutuhan untuk mengubah nilai tergantung pada keadaan. Menerapkan mekanisme tertentu (seperti meraih tepian dan platform satu arah) menjadi mudah, dibandingkan dengan gaya gerakan yang lebih kompleks – yang harus Anda lakukan adalah memeriksa apakah ubin pemain dan ubin latar belakang disejajarkan dalam satu cara khusus yang memungkinkan untuk tindakan yang diberikan.

Pada prinsipnya, sistem ini tidak memungkinkan langkah-langkah kurang dari satu ubin, tetapi itu dapat dikurangi dengan beberapa cara berbeda. Misalnya, ubin bisa sedikit lebih kecil dari pemain (katakanlah, pemain adalah 2 × 6 ubin), atau Anda dapat membiarkan gerakan visual saja terjadi di dalam ubin yang diberikan, tanpa mempengaruhi logika (yang merupakan solusi yang saya percaya bahwa “Lode Runner – The Legend Returns” mengambil).

Tipe # 2: Berbasis Ubin (Halus)

Tabrakan masih ditentukan oleh tilemap, tetapi karakter dapat bergerak bebas di seluruh dunia (biasanya dengan resolusi 1px, disejajarkan dengan bilangan bulat, tetapi lihat catatan di akhir artikel tentang perataan gerakan). Ini adalah bentuk paling umum dari penerapan platformer di konsol 8-bit dan 16-bit, dan tetap populer saat ini, karena masih mudah diimplementasikan dan membuat pengeditan level lebih sederhana daripada teknik yang lebih canggih. Ini juga memungkinkan untuk lereng dan busur loncatan halus.

Jika Anda tidak yakin jenis platformer mana yang ingin Anda implementasikan, dan Anda ingin melakukan game aksi, saya sarankan untuk yang ini. Ini sangat fleksibel, relatif mudah diimplementasikan, dan memberi Anda kontrol paling besar dari keempat jenis. Tidak heran bahwa sebagian besar platformer aksi terbaik sepanjang masa didasarkan pada tipe ini.

Mega Man X, ditampilkan dengan batas ubin dan hitbox pemain.

Contoh: Super Mario World, Sonic the Hedgehog, Mega Man, Super Metroid, Contra, Metal Slug, dan hampir semua platformer era 16-bit

Bagaimana itu bekerja

Informasi peta disimpan dengan cara yang sama seperti dengan teknik ubin murni, perbedaannya hanya pada bagaimana karakter berinteraksi dengan latar belakang. Tabrakan tabrakan karakter sekarang menjadi Kotak Berlari-Sumbu Sumbu (AABB, yaitu, persegi panjang yang tidak dapat diputar), dan biasanya masih merupakan kelipatan bilangan bulat dari ukuran ubin. Ukuran umum termasuk satu ubin lebar dan satu (Mario kecil, morf bola Samus), dua (Mario besar, Mega Man, Samus berjongkok) atau tiga ubin (berdiri Samus) tinggi. Dalam banyak kasus, sprite karakter itu sendiri lebih besar daripada hitbox logis, karena hal ini membuat pengalaman visual yang lebih menyenangkan dan gameplay yang lebih adil (lebih baik bagi pemain untuk menghindari terkena pukulan ketika dia seharusnya memiliki daripada memukulnya ketika dia harus tidak punya). Pada gambar di atas, Anda dapat melihat bahwa sprite untuk X adalah persegi-ish (pada kenyataannya, lebar dua ubin),

Dengan asumsi bahwa tidak ada lereng dan platform satu arah, algoritmenya mudah:

  1. Uraikan gerakan menjadi sumbu X dan Y, langkah satu per satu. Jika Anda berencana menerapkan lereng setelahnya, langkah X pertama, lalu Y. Jika tidak, urutannya tidak terlalu menjadi masalah. Kemudian, untuk setiap sumbu:
  2. Dapatkan koordinat dari tepi yang menghadap ke depan, misalnya: Jika berjalan ke kiri, koordinat x di sebelah kiri dari kotak pembatas. Jika berjalan dengan benar, koordinat x sisi kanan. Jika naik, kamu koordinat atas, dll.
  3. Gambar garis ubin mana yang bersilangan dengan kotak pembatas – ini akan memberi Anda nilai ubin minimum dan maksimum pada sumbu OPPOSITE. Misalnya, jika kita berjalan ke kiri, mungkin pemain bersinggungan dengan baris horizontal 32, 33 dan 34 (yaitu, ubin dengan y = 32 * TS, y = 33 * TS, dan y = 34 * TS, di mana TS = ukuran ubin).
  4. Memindai sepanjang garis ubin dan menuju arah gerakan sampai Anda menemukan hambatan statis terdekat. Kemudian lewati setiap rintangan yang bergerak, dan tentukan hambatan mana yang paling dekat yang sebenarnya ada di jalur Anda.
  5. Total pergerakan pemain di sepanjang arah itu adalah minimum antara jarak ke rintangan terdekat, dan jumlah yang Anda inginkan untuk bergerak di tempat pertama.
  6. Pindahkan pemain ke posisi baru. Dengan posisi baru ini, langkah koordinat lainnya, jika masih belum selesai.

Lereng

Mega Man X, dengan anotasi kemiringan lereng

Lereng (ubin yang ditunjukkan oleh panah hijau pada gambar di atas) bisa sangat rumit, karena mereka adalah penghalang, namun masih memungkinkan karakter untuk pindah ke ubin mereka. Mereka juga menyebabkan gerakan sepanjang sumbu X untuk menyesuaikan posisi pada sumbu Y. Salah satu cara untuk menghadapinya adalah dengan memasang ubin “lantai y” di kedua sisi. Dengan asumsi sistem koordinat di mana (0, 0) berada di kiri atas, maka ubin di sebelah kiri X (ubin kemiringan pertama) adalah {0, 3} (kiri, kanan), maka yang dia gunakan adalah {4, 7}, lalu {8, 11}, lalu {12, 15}. Setelah itu, ubin mengulangi, dengan {0, 3} lainnya, dll, dan kemudian kita memiliki kemiringan yang lebih curam, terdiri dari dua ubin: {0, 7} dan {8, 15}.

Tampilan terperinci dari ubin {4, 7}

Sistem yang akan saya jelaskan memungkinkan kemiringan lereng, meskipun karena alasan visual, kedua lereng tersebut adalah yang paling umum, dan menghasilkan total 12 ubin (6 yang dijelaskan sebelumnya, dan mirroringnya). Algoritma collision berubah sebagai berikut untuk gerakan horizontal:

  • Pastikan Anda melangkah posisi X sebelum posisi Y.
  • Selama deteksi tabrakan (4 di atas), kemiringan hanya dihitung sebagai tabrakan jika tepi terdekatnya adalah yang lebih tinggi (koordinat y lebih kecil). Ini akan mencegah karakter dari “muncul” melalui kemiringan dari sisi yang berlawanan.
  • Anda mungkin ingin melarang lereng untuk berhenti “setengah jalan” (misalnya pada ubin {4, 7}). Pembatasan ini diadopsi oleh Mega Man X dan banyak game lainnya. Jika tidak, Anda harus berurusan dengan kasus yang lebih rumit dari pemain yang mencoba memanjat dari sisi bawah ubin kemiringan – salah satu cara untuk mengatasinya adalah dengan pra-proses level, dan menandai semua ubin yang menyinggung seperti itu. . Kemudian, pada deteksi tabrakan, hitung juga sebagai tabrakan dari sisi bawah jika koordinat y pemain terendah lebih besar (yaitu, di bawah) tepi offset ubin (ubin kotak * ukuran ubin + lantai y).
  • Ubin penghalang penuh yang berdekatan dengan kemiringan karakter saat ini tidak boleh dianggap untuk tabrakan jika terhubung ke kemiringan, yaitu, jika karakter (yaitu, piksel tengah-bawahnya) ada pada {0, *} kemiringan, abaikan ubin kiri, dan, jika pada kemiringan {*, 0}, abaikan ubin kanan. Anda mungkin harus melakukan ini untuk ubin lebih banyak jika karakter Anda lebih lebar dari dua ubin – Anda mungkin melewatkan memeriksa seluruh baris jika pemain bergerak menuju sisi atas lereng. Alasan untuk ini adalah untuk mencegah karakter dari terjebak di ubin itu (disorot kuning di atas) sambil tetap mendaki lereng, karena kakinya masih akan di bawah “permukaan” pada saat ia bersentuhan dengan ubin yang solid .

Dan untuk gerakan vertikal:

  • Jika Anda membiarkan gravitasi melakukan tugasnya untuk pergerakan menurun, pastikan perpindahan gravitasi minimum kompatibel dengan kecepatan lereng dan horizontal. Misalnya, pada kemiringan 4: 1 (seperti {4, 7} di atas), perpindahan gravitasi harus setidaknya 1/4 dari kecepatan horizontal, dibulatkan ke atas. Pada kemiringan 2: 1 (seperti {0, 7}), setidaknya 1/2. Jika Anda tidak memastikan ini, pemain akan bergerak horizontal langsung dari tanjakan untuk sementara waktu, sampai gravitasi naik dan menyeretnya ke bawah, membuatnya melompat di tanjakan, bukannya menurun dengan mulus.
  • Alternatif untuk menggunakan gravitasi adalah menghitung berapa banyak piksel di atas lantai pemain sebelum gerakan, dan berapa banyak itu setelah itu (menggunakan rumus di bawah), dan sesuaikan posisinya sehingga mereka sama.
  • Saat bergerak ke bawah, alih-alih mempertimbangkan tepi atas kemiringan ubin sebagai batas tumbukannya, sebagai gantinya, hitung koordinat lantai pada garis vertikal saat ini, dan gunakan itu. Untuk melakukan itu, cari nilai [0, 1] yang mewakili posisi x pemain di ubin (0 = kiri, 1 = kanan) dan gunakan untuk menginterpolasi nilai floorY secara linear. Kode akan terlihat seperti: float t = float(centerX – tileX) / tileSize; float floorY = (1-t) * leftFloorY + t * rightFloorY;
  • Saat bergerak ke bawah, jika beberapa ubin pada koordinat Y yang sama adalah kandidat penghalang, dan yang pada koordinat X dari pusat pemain adalah ubin kemiringan, gunakan ubin itu, dan abaikan sisanya – meskipun yang lainnya secara teknis lebih dekat. Ini memastikan perilaku yang tepat di sekitar tepi lereng, dengan karakter yang sebenarnya “tenggelam” pada ubin yang benar-benar padat karena kemiringan yang berdekatan.

Platform satu arah

Super Mario World, menunjukkan Mario jatuh (kiri) dan berdiri di (kanan) platform satu arah yang sama

Platform satu arah adalah platform yang bisa Anda injak, tetapi Anda juga bisa melewatinya. Dengan kata lain, mereka dianggap sebagai penghalang jika Anda sudah di atas mereka, tetapi sebaliknya dapat dilalui. Kalimat itu adalah kunci untuk memahami perilaku mereka. Algoritma berubah sebagai berikut:

  • Pada sumbu x, ubin tidak pernah menjadi hambatan
  • Pada sumbu y, ubin hanya menjadi penghalang jika, sebelum pergerakan, pemain sepenuhnya berada di atasnya (yaitu, koordinat paling bawah pemain setidaknya satu piksel di atas koordinat paling atas dari platform satu arah) . Untuk memeriksa ini, Anda mungkin ingin menyimpan posisi pemain asli sebelum melakukan langkah apa pun.

Mungkin tergoda untuk membuatnya bertindak sebagai penghalang jika kecepatan pemain positif (yaitu, jika pemain jatuh), tetapi perilaku ini salah: mungkin bagi pemain untuk melompat sehingga dia tumpang tindih dengan platform, tetapi kemudian jatuh lagi tanpa kakinya mencapai platform. Dalam hal itu, ia masih harus jatuh.

Beberapa gim memungkinkan pemain untuk “melompat turun” dari platform semacam itu. Ada beberapa cara untuk melakukan ini, tetapi semuanya relatif sederhana. Anda dapat, misalnya, menonaktifkan platform satu arah untuk satu frame dan memastikan bahwa kecepatan y setidaknya satu (jadi dia akan jelas dari kondisi tabrakan awal pada frame berikutnya), atau Anda dapat memeriksa apakah dia berdiri secara eksklusif pada platform satu arah, dan, jika demikian, pindahkan pemutar satu piksel ke bawah secara manual.

Tangga

Mega Man 7, dengan batas ubin, ubin tangga yang disorot, dan hitbox pemain tangga.

Tangga mungkin tampak rumit untuk diterapkan, tetapi mereka hanyalah keadaan alternatif – ketika Anda berada di tangga, Anda mengabaikan sebagian besar sistem tumbukan standar, dan menggantinya dengan seperangkat aturan baru. Tangga biasanya satu ubin lebar.

Anda biasanya dapat memasuki kondisi tangga dengan dua cara:

  • Mintalah hitbox karakter Anda tumpang tindih dengan tangga, baik di darat atau di udara, dan tekan ke atas (beberapa permainan juga memungkinkan Anda untuk menekan)
  • Mintalah karakter Anda berdiri di atas ubin “ladder top” (yang seringkali merupakan ubin platform satu arah juga, sehingga Anda dapat berjalan di atasnya), dan tekan ke bawah.

Ini memiliki efek segera menjepret koordinat x pemain agar sejajar dengan ubin tangga, dan, jika turun dari atas tangga, pindahkan koordinat y sehingga pemain sekarang berada di dalam tangga yang sebenarnya. Pada titik ini, beberapa game akan menggunakan hitbox yang berbeda untuk keperluan menentukan apakah pemain masih di tangga. Mega Man, misalnya, tampaknya menggunakan ubin tunggal (setara dengan ubin atas karakter asli, disorot dengan warna merah pada gambar di atas).

Ada beberapa cara berbeda MENINGGALKAN tangga:

  • Mencapai puncak tangga. Ini biasanya akan mendorong animasi dan menggerakkan pemutar beberapa piksel ke atas dalam y, jadi dia sekarang berdiri di atas tangga.
  • Mencapai bagian bawah tangga gantung. Ini akan menyebabkan pemain jatuh begitu saja, meskipun beberapa permainan tidak akan membiarkan pemain meninggalkan tangga dengan cara ini.
  • Bergerak ke kiri atau ke kanan. Jika tidak ada halangan di sisi itu, pemain mungkin diizinkan pergi dengan cara itu.
  • Melompat Beberapa gim memungkinkan Anda melepaskan tangga dengan melakukan ini.

Saat berada di tangga, gerakan karakter berubah jadi, biasanya, yang bisa ia lakukan adalah naik dan turun, dan terkadang menyerang.

Tangga

Castlevania: Dracula X, dengan batas ubin

Tangga adalah variasi tangga, terlihat di beberapa pertandingan, tetapi terutama dalam seri Castlevania. Implementasi aktual sangat mirip dengan tangga, dengan beberapa pengecualian:

  • Pemain memindahkan ubin demi ubin atau setengah ubin demi setengah (seperti dalam Dracula X)
  • Setiap “langkah” menyebabkan pemain digeser secara bersamaan pada koordinat X dan Y, dengan jumlah yang telah ditentukan.
  • Deteksi tumpang tindih awal saat naik mungkin melihat ubin di depan, bukan hanya tumpang tindih saat ini.

Game lain juga memiliki tangga yang berperilaku seperti lereng. Dalam hal itu, mereka hanyalah fitur visual.

Pindah Platform

Dunia Super Mario

Memindahkan platform bisa tampak sedikit rumit, tetapi sebenarnya cukup sederhana. Tidak seperti platform normal, mereka tidak dapat diwakili oleh ubin tetap (untuk alasan yang jelas), dan sebaliknya harus diwakili oleh AABB, yaitu, persegi panjang yang tidak dapat diputar. Ini adalah hambatan normal untuk semua tujuan tabrakan, dan jika Anda berhenti di sini, Anda akan memiliki platform bergerak yang sangat licin (artinya, mereka berfungsi seperti yang dimaksudkan, kecuali bahwa karakter tidak bergerak sendiri).

Ada beberapa cara berbeda untuk mengimplementasikannya. Salah satu algoritma adalah sebagai berikut:

  • Sebelum sesuatu di tempat kejadian diinjak, tentukan apakah karakter tersebut berdiri di atas platform yang bergerak. Ini dapat dilakukan dengan memeriksa, misalnya, apakah piksel tengah-bawahnya hanya satu piksel di atas permukaan platform. Jika ya, simpan pegangan ke platform dan posisinya saat ini di dalam karakter.
  • Langkah semua platform bergerak. Pastikan ini terjadi sebelum Anda melangkah karakter.
  • Untuk setiap karakter yang berdiri di platform bergerak, cari posisi delta platform, yaitu, seberapa banyak ia telah bergerak di sepanjang setiap sumbu. Sekarang, geser karakter dengan jumlah yang sama.
  • Langkah karakter seperti biasa.

Fitur lainnya

Sonic the Hedgehog 2

Game lain memiliki fitur yang lebih rumit dan eksklusif. Seri Sonic the Hedgehog terkenal karena hal ini. Itu di luar ruang lingkup artikel ini (dan pengetahuan saya, dalam hal ini!), Tetapi mungkin menjadi subjek dari artikel di masa depan.

Jenis # 3: Bitmask

Mirip dengan “Tile Based (Smooth)”, tetapi alih-alih menggunakan ubin besar, gambar digunakan untuk menentukan tabrakan untuk setiap piksel. Ini memungkinkan perincian yang lebih baik, tetapi secara signifikan meningkatkan kompleksitas, penggunaan memori, dan membutuhkan sesuatu yang mirip dengan editor gambar untuk membuat level. Ini juga sering menyiratkan bahwa ubin tidak akan digunakan untuk visual, dan karena itu mungkin memerlukan karya seni individu yang besar untuk setiap level. Karena masalah-masalah itu, ini adalah teknik yang relatif tidak umum, tetapi dapat menghasilkan hasil kualitas yang lebih tinggi daripada pendekatan berbasis ubin. Ini juga cocok untuk lingkungan yang dinamis – seperti skenario yang dapat dirusak di Worms – karena Anda dapat “menarik” ke dalam bitmask untuk mengubah skenario.

Worms World Party, menampilkan medan yang dapat dirusak

Contoh: Cacing, Talbot’s Odyssey

Bagaimana itu bekerja

Ide dasarnya sangat mirip dengan algoritma ubin (halus) – Anda bisa menganggap setiap piksel sebagai ubin, dan menerapkan algoritma yang sama persis, dan semuanya akan bekerja, dengan satu pengecualian utama – lereng. Karena lereng sekarang secara implisit didefinisikan oleh penempatan di antara ubin terdekat, teknik sebelumnya tidak berfungsi, dan algoritma yang jauh lebih kompleks harus digunakan sebagai gantinya. Hal-hal lain, seperti tangga, juga menjadi lebih rumit.

Lereng

Talbot’s Odyssey, dengan tabrakan bitmask dilapis di atas permainan.

Lereng adalah alasan utama mengapa jenis implementasi ini sangat sulit untuk diperbaiki. Sayangnya, mereka juga cukup wajib, karena tidak masuk akal untuk menggunakan implementasi ini tanpa lereng. Seringkali, itulah alasan mengapa Anda bahkan menggunakan sistem ini.

Ini, kira-kira, algoritma yang digunakan oleh Talbot’s Odyssey:

  • Integrasikan akselerasi dan kecepatan untuk menghitung vektor posisi-delta yang diinginkan (berapa banyak bergerak di setiap sumbu).
  • Langkah masing-masing sumbu secara terpisah, mulai dengan satu dengan perbedaan absolut terbesar.
  • Untuk gerakan horizontal, offset pemain AABB dengan 3 piksel ke atas, sehingga ia dapat memanjat lereng.
  • Pindai ke depan, dengan memeriksa semua hambatan yang valid dan bitmask itu sendiri, untuk menentukan berapa banyak piksel yang dapat dipindahkan sebelum mengenai rintangan. Pindah ke posisi baru ini.
  • Jika ini adalah gerakan horizontal, pindahkan piksel ke atas sebanyak yang diperlukan (yang seharusnya hingga 3) untuk menebus kemiringan.
  • Jika, pada akhir gerakan, piksel karakter apa pun tumpang tindih dengan rintangan apa pun, batalkan gerakan pada sumbu ini.
  • Terlepas dari hasil kondisi terakhir, lanjutkan untuk melakukan hal yang sama untuk sumbu lainnya.

Karena sistem ini tidak memiliki perbedaan antara bergerak ke bawah karena Anda akan menurun atau karena Anda jatuh, Anda mungkin membutuhkan sistem yang menghitung berapa banyak frame sejak karakter terakhir menyentuh lantai, untuk tujuan menentukan apakah itu dapat melompat dan mengubah animasi. Untuk Talbot, nilai ini adalah 10 bingkai.Trik lain di sini adalah menghitung secara efisien berapa piksel yang dapat dipindahkan sebelum mengenai sesuatu. Ada faktor-faktor lain yang mungkin menyulitkan, seperti platform satu arah (ditangani dengan cara yang sama persis seperti untuk ubin (halus)) dan meluncur menuruni lereng curam (yang cukup kompleks dan di luar ruang lingkup artikel). Secara umum, teknik ini membutuhkan banyak fine tuning, dan secara intrinsik kurang stabil daripada pendekatan berbasis ubin. Saya hanya merekomendasikannya jika Anda benar-benar harus memiliki medan terperinci.

Jenis # 4: Vektorial

Teknik ini menggunakan data vektor (garis atau poligon) untuk menentukan batas area tumbukan. Sangat sulit untuk diimplementasikan dengan baik, namun demikian semakin populer karena keberadaan mesin fisika, seperti Box2D, yang cocok untuk menerapkan teknik ini. Ini memberikan manfaat yang mirip dengan teknik bitmask, tetapi tanpa overhead memori utama, dan menggunakan cara pengeditan yang sangat berbeda.

Braid (editor level), dengan lapisan yang terlihat (atas) dan poligon tabrakan (bawah)

Contoh: Braid, Limbo

Bagaimana itu bekerja

Ada dua cara umum untuk mendekati ini:

  • Selesaikan gerakan dan tabrakan sendiri, mirip dengan metode bitmask, tetapi gunakan sudut poligon untuk menghitung defleksi dan memiliki kemiringan yang tepat.
  • Gunakan mesin fisika (mis. Box2D)

Jelas, yang kedua lebih populer (meskipun saya menduga Braid memilih yang pertama), keduanya karena lebih mudah dan karena memungkinkan Anda untuk melakukan banyak hal lain dengan fisika dalam permainan. Sayangnya, menurut saya, kita harus sangat berhati-hati ketika menempuh rute ini, untuk menghindari membuat game terasa seperti platformer fisika yang tidak menarik dan generik.

Benda majemuk

Pendekatan ini memiliki masalah uniknya sendiri. Mungkin tiba-tiba sulit untuk mengatakan apakah pemain benar-benar berdiri di lantai (karena kesalahan pembulatan), atau apakah itu mengenai dinding atau meluncur menuruni lereng yang curam. Jika menggunakan mesin fisika, gesekan bisa menjadi masalah, karena Anda ingin gesekan menjadi tinggi pada kaki, tetapi rendah pada sisi-sisinya.

Ada berbagai cara untuk mengatasinya, tetapi solusi yang populer adalah dengan membagi karakter menjadi beberapa poligon yang berbeda, masing-masing dengan peran yang berbeda terkait: sehingga Anda (secara opsional) memiliki tubuh pusat utama, kemudian persegi panjang tipis untuk kaki, dan dua persegi panjang tipis untuk sisi, dan satu lagi untuk kepala atau kombinasi serupa. Terkadang mereka meruncing agar tidak terjebak ke dalam rintangan. Mereka dapat memiliki sifat fisika yang berbeda, dan panggilan balik tabrakan pada mereka dapat digunakan untuk menentukan status karakter. Untuk informasi lebih lanjut, sensor (benda yang tidak bertabrakan yang hanya digunakan untuk memeriksa tumpang tindih) dapat digunakan. Kasing umum termasuk menentukan apakah kita cukup dekat ke lantai untuk melakukan lompatan, atau jika karakter mendorong ke dinding, dll.

Pertimbangan Umum

Terlepas dari jenis gerakan platform yang telah Anda pilih (kecuali mungkin untuk tipe # 1), beberapa pertimbangan umum berlaku.

Percepatan

Super Mario World (akselerasi rendah), Super Metroid (akselerasi menengah), Mega Man 7 (akselerasi tinggi)

Salah satu faktor yang paling mempengaruhi rasa platformer adalah akselerasi karakter. Akselerasi adalah tingkat perubahan kecepatan. Ketika rendah, karakter membutuhkan waktu lama untuk mencapai kecepatan maksimalnya, atau berhenti setelah pemain melepaskan kontrol. Ini membuat karakter terasa “licin”, dan bisa jadi sulit dikuasai. Gerakan ini paling sering dikaitkan dengan seri game Super Mario. Ketika akselerasi tinggi, karakter membutuhkan sedikit (atau tidak ada waktu) untuk beralih dari nol ke kecepatan maksimum dan kembali, menghasilkan respons yang sangat cepat, kontrol “berkedut”, seperti yang terlihat dalam seri Mega Man (saya percaya bahwa Mega Man sebenarnya menggunakan akselerasi tak terbatas, yaitu, Anda berhenti atau dengan kecepatan penuh).

Bahkan jika gim tidak memiliki akselerasi pada gerakan horizontal, gim tersebut kemungkinan memiliki setidaknya beberapa untuk lompatan busur – jika tidak mereka akan berbentuk seperti segitiga.

Bagaimana itu bekerja

Menerapkan akselerasi sebenarnya cukup sederhana, tetapi ada beberapa perangkap yang harus diperhatikan.

  • Tentukan xTargetSpeed. Ini harus 0 jika pemain tidak menyentuh kontrol, -maxSpeed ​​jika menekan ke kiri atau + maxSpeed ​​jika menekan ke kanan.
  • Tentukan yTargetSpeed. Ini harus 0 jika pemain berdiri di atas platform, + terminalSpeed ​​sebaliknya.
  • Untuk setiap sumbu, percepat kecepatan saat ini menuju kecepatan target menggunakan rata-rata tertimbang atau menambah percepatan.

Dua metode percepatan adalah sebagai berikut:

  • Rata-rata tertimbang: akselerasi adalah angka (“a”) dari 0 (tidak ada perubahan) menjadi 1 (akselerasi instan). Gunakan nilai itu untuk menginterpolasi secara linear antara target dan kecepatan saat ini, dan atur hasilnya sebagai kecepatan saat ini.
vector2f curSpeed = a * targetSpeed + (1-a) * curSpeed;
if (fabs(curSpeed.x) < threshold) curSpeed.x = 0;
if (fabs(curSpeed.y) < threshold) curSpeed.y = 0;
  • Menambahkan akselerasi: Kami akan menentukan arah mana untuk menambahkan akselerasi (menggunakan fungsi tanda, yang mengembalikan 1 untuk angka> 0 dan -1 untuk <0), lalu periksa apakah kami melampaui.
vector2f direction = vector2f(sign(targetSpeed.x - curSpeed.x),
                              sign(targetSpeed.y - curSpeed.y));
curSpeed += acceleration * direction;
if (sign(targetSpeed.x - curSpeed.x) != direction.x)
    curSpeed.x = targetSpeed.x;
if (sign(targetSpeed.y - curSpeed.y) != direction.y)
    curSpeed.y = targetSpeed.y;

Sangat penting untuk mengintegrasikan akselerasi ke dalam kecepatan sebelum memindahkan karakter, jika tidak Anda akan memasukkan jeda satu frame ke input karakter.Ketika karakter menyentuh rintangan, itu ide yang baik untuk nol kecepatannya di sepanjang sumbu itu.

Kontrol lompat

Super Metroid, Samus melakukan “Space Jump” (dengan “Screw Attack” power-up)

Melompat dalam permainan platform bisa sesederhana memeriksa apakah pemain ada di tanah (atau, sering, apakah dia ada di tanah kapan saja di frame n terakhir), dan, jika demikian, memberikan karakter awal negatif y kecepatan (secara fisik, impuls) dan membiarkan gravitasi melakukan sisanya.

Ada empat cara umum di mana pemain dapat mengontrol lompatan:

  • Impuls: terlihat dalam permainan seperti Super Mario World dan Sonic the Hedgehog, lompatan mempertahankan momentum (yaitu, dalam hal implementasi, kecepatan) yang dimiliki karakter sebelum lompat. Dalam beberapa permainan, ini adalah satu-satunya cara untuk mempengaruhi busur lompatan – seperti dalam kehidupan nyata. Tidak ada yang bisa diterapkan di sini – akan seperti ini kecuali Anda melakukan sesuatu untuk menghentikannya!
  • Akselerasi udara: yaitu mempertahankan kontrol gerakan horizontal saat berada di udara. Meskipun ini secara fisik tidak masuk akal, ini adalah fitur yang sangat populer, karena membuat karakternya jauh lebih dapat dikendalikan. Hampir setiap game platformer memilikinya, dengan pengecualian untuk game yang mirip dengan Prince of Persia. Secara umum, akselerasi udara sangat berkurang, jadi dorongan itu penting, tetapi beberapa game (seperti Mega Man) memberi Anda kontrol udara penuh. Ini umumnya diimplementasikan sebagai hanya mengutak-atik parameter akselerasi saat Anda mengudara.
  • Kontrol pendakian: tindakan fisik yang tidak masuk akal lainnya, tetapi sangat populer, karena memberi Anda kendali lebih besar atas karakter. Semakin lama Anda menahan tombol lompat, semakin tinggi karakter melompat. Biasanya, ini dilaksanakan dengan terus menambahkan impuls ke karakter (meskipun impuls ini dapat berkurang secara bertahap) selama tombol ditekan, atau sebagai alternatif dengan menekan gravitasi saat tombol ditahan. Batas waktu dikenakan, kecuali jika Anda ingin karakter dapat melompat tanpa batas.
  • Beberapa lompatan: sekali di udara, beberapa permainan memungkinkan pemain untuk melompat lagi, mungkin untuk jumlah waktu yang tidak terbatas (seperti dalam Space Jump di Super Metroid atau penerbangan di Talbot’s Odyssey), atau untuk sejumlah lompatan sebelum menyentuh tanah (“Lompatan ganda” menjadi pilihan paling umum). Ini dapat dicapai dengan menjaga penghitung yang meningkat untuk setiap lompatan dan berkurang ketika Anda berada di tanah (hati-hati saat Anda memperbarui ini, atau Anda mungkin mengatur ulang tepat setelah lompatan pertama), dan hanya memungkinkan lompatan lebih lanjut jika penghitung cukup rendah. Terkadang, lompatan kedua lebih pendek dari lompatan awal. Batasan lain mungkin berlaku – Space Jump hanya memicu jika Anda sudah melakukan spin jump dan baru saja mulai jatuh.

Animasi dan terkemuka

Black Thorne, karakter melakukan animasi panjang sebelum memotret mundur (tombol Y)

Dalam banyak permainan, karakter Anda akan memainkan animasi sebelum benar-benar melakukan tindakan yang Anda minta. Namun, pada game berbasis aksi yang gelisah, ini akan membuat pemain frustrasi – JANGAN LAKUKAN ITU! Anda harus tetap memiliki animasi terkemuka untuk hal-hal seperti melompat dan berlari, tetapi jika Anda peduli bagaimana respons game, buat hanya kosmetik itu, dengan tindakan yang diambil segera terlepas dari animasinya.

Gerakan lebih halus

Menggunakan bilangan bulat untuk mewakili posisi karakter adalah bijaksana, karena membuatnya lebih cepat dan stabil. Namun, jika Anda menggunakan bilangan bulat untuk semuanya, Anda akan berakhir dengan gerakan tersentak-sentak. Ada beberapa solusi untuk ini. Ini beberapa:

  • Gunakan float untuk semua perhitungan dan untuk posisi penyimpanan, dan gulirkan ke int setiap kali Anda merender atau menghitung tabrakan. Cepat dan sederhana, tetapi mulai kehilangan presisi jika Anda bergerak terlalu jauh dari (0,0). Ini mungkin tidak relevan kecuali Anda memiliki lapangan bermain yang sangat besar, tetapi ini sesuatu yang perlu diingat. Jika itu yang terjadi, Anda bisa menggunakan double sebagai gantinya.
  • Gunakan nomor titik tetap untuk semua perhitungan dan posisi, dan kembali ke int ketika Anda merender atau menghitung tabrakan. Kurang presisi daripada float dan dengan jangkauan yang lebih terbatas, tetapi ketepatannya seragam dan dapat, pada beberapa perangkat keras, menjadi lebih cepat (terutama, pemrosesan floating point lambat pada banyak ponsel).
  • Simpan posisi sebagai bilangan bulat, tetapi simpan “sisa” disimpan di float. Saat mengintegrasikan posisi, hitung pergerakan delta sebagai pelampung, tambahkan sisanya ke gerakan delta, kemudian tambahkan bagian integer dari nilai ini ke posisi, dan bagian fraksional ke bidang “sisa”. Pada frame berikutnya, sisanya akan ditambahkan kembali. Keuntungan dari metode ini adalah Anda menggunakan integer di mana pun kecuali untuk pergerakan, memastikan bahwa Anda tidak akan memiliki komplikasi floating point di tempat lain, dan meningkatkan kinerja. Teknik ini juga sangat cocok jika Anda memiliki beberapa kerangka kerja di mana posisi objek harus bilangan bulat, atau di mana itu adalah float, tetapi posisi yang sama digunakan langsung oleh sistem rendering – dalam hal ini, Anda dapat menggunakan posisi float yang disediakan kerangka kerja untuk menyimpan nilai integer saja,

sumber

tutsplus.com

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s