"Kontrol Waktu" dalam Platformer 2d

9

Saya membuat platformer 2d di mana pemain dapat menekan tombol, dan me-restart level, hanya karakter mereka sebelumnya juga akan menjalankan level pada saat yang sama, seperti mereka melakukan perjalanan kembali dalam waktu.

Saya tahu permainan lain telah melakukan ini sebelumnya, dan cara saya berpikir untuk melakukannya adalah membuat karakter permainan memiliki serangkaian tindakan (Idle, Jumping, Walking Left dll.) Dan kemudian mendeteksi perubahan dalam tindakan tersebut dan mencatatnya. daftar bersama dengan waktu permainan. Jadi ketika saya membutuhkan karakter untuk menjalankan level lagi dengan sendirinya, saya bisa langsung saja mengubah daftar tindakannya pada waktu yang tepat.

Apakah ini cara terbaik untuk melakukannya? Adakah yang punya pengalaman dalam hal ini?

Terima kasih.

Woody Zantzinger
sumber
Apa yang Anda cari lebih merupakan 'Putar Ulang' daripada kontrol waktu. Anda mungkin menemukan beberapa artikel bagus tentang cara mengatasi hal ini, tetapi saya masih mengatakan jawaban di bawah ini juga merupakan awal yang baik di bidang ini. Ingatlah bahwa hal-hal yang 'acak' dalam permainan akan mengacaukan replay untuk karakter 'hantu' yang menjalankannya lagi jika hal itu dapat memengaruhi kemajuan.
James
3
Poin bagus tentang bagian "acak". Pastikan untuk menggunakan generator acak yang menghasilkan angka berdasarkan pada sebuah benih. Kemudian simpan seed dengan replay Anda dan gunakan seed yang sama saat memainkan replay itu.
bummzack
Bagaimana kamu melakukan ini? Apa solusinya?

Jawaban:

8

EDIT:

Silakan lihat jawaban @ Bluescrn untuk pertanyaan ini; ia menguraikan kelemahan dalam memutar ulang kontrol daripada vektor gerakan atau posisi.

-

Anda berada di jalur yang benar. Inilah pendekatan yang saya gunakan:

Pengontrol

Buat kelas Controller yang menerima input keyboard dan meneruskannya ke karakter Anda. Namun, juga memiliki catatan Pengontrol tepat ketika tombol signifikan (misalnya panah, melompat, dll) ditekan dan ketika mereka dilepaskan. Itu akan menyimpan informasi semacam ini:

actions[0].milliseconds = 400     actions[0].action = right pressed
actions[1].milliseconds = 1000    actions[1].action = jump pressed
actions[2].milliseconds = 1300    actions[2].action = jump released
actions[3].milliseconds = 2500    actions[3].action = jump pressed
actions[4].milliseconds = 3000    actions[4].action = jump released
actions[5].milliseconds = 5330    actions[5].action = right released

Pengendali memiliki dua mode:

  1. Rekam: Menerima input keyboard. Merekam input dalam daftar. Masukkan input karakter berdasarkan kondisi keyboard.
  2. Putar ulang: Mengabaikan input keyboard. Kemajuan melalui daftar menurut milidetik berlalu sejak tingkat dimulai. Masukkan input karakter berdasarkan status keyboard yang direkam pada saat ini.

Karakter

Ketika objek karakter Anda dibangun, itu menciptakan Controller baru untuk dirinya sendiri. Karakter dapat dalam satu dari dua mode kapan saja:

  1. Aktif: Hanya ada satu Karakter aktif dan karakter yang Anda kendalikan. Saat Karakter dalam mode Aktif, Pengontrolnya dalam mode Rekam.Secara default ketika Karakter dibangun itu dalam mode aktif.
  2. Hantu: Ini adalah yang mengulangi tindakan masa lalu Anda. Ketika Karakter memasuki mode Hantu, ia mengubah penampilannya dan mengatur Pengontrolnya ke mode Putar Ulang.

Tingkat

Level yang baru dimulai

Ketika Anda memulai level, buat satu karakter. Sekarang level dimulai dan pemain melakukan tugasnya.

Kapan waktu diatur ulang

Ketika level direset, lakukan tiga hal:

  1. Beri tahu Karakter Aktif saat ini untuk masuk ke mode Hantu.
  2. Buat Karakter baru.
  3. Panggil semua Karakter untuk Mengatur Ulang sendiri. Ini akan menempatkan mereka kembali pada posisi awal tanpa gerakan, dll. Mereka pada gilirannya akan memberitahu Pengontrol mereka untuk mengatur ulang ke milidetik 0 tanpa tombol ditekan.

Kemudian level dimulai dan pemain melakukan tugasnya.

doppelgreener
sumber
Ini sangat jelas. Terima kasih banyak. Saya agak punya ide yang tepat, tetapi saya akan membuat sistem pusat untuk mencatat gerakan, tetapi setiap karakter mencatat gerakannya sendiri adalah cara yang lebih mudah untuk melakukannya. Terima kasih.
Woody Zantzinger
8

Jika Anda memutar ulang input yang direkam, pertimbangkan implikasi objek bergerak / yang dapat dirusak / interaktif di dunia, yang mungkin telah memindahkan atau mengubah status ketika tindakan tersebut diputar ulang.

Selain itu, memutar ulang input tidak akan berfungsi dengan tepat jika game Anda menggunakan stempel waktu variabel. Anda mungkin ingin mempertimbangkan pembaruan game timestep tetap (dengan interpolasi untuk rendering framerate variabel)?

bluescrn
sumber
1
+10 jika aku bisa. Pertimbangan bagus. Memutar ulang vektor gerakan atau posisi akan lebih baik daripada memutar ulang input, tergantung pada efek yang diinginkan. Puluhan milidetik ketidaktepatan antar frame mungkin lebih mudah untuk diperhitungkan ketika bekerja dengan gerakan dan posisi daripada dengan input.
doppelgreener
4

Ada banyak topik yang mencakup rekaman game / sistem replay / dll yang mungkin harus menjadi batu kunci dari runthroughs masa lalu Anda.

Ini satu: Cara merancang sistem replay

Tetrad
sumber
0

Merekam input keyboard mungkin tidak berguna dalam kasus Anda. Namun Anda dapat menghasilkan spline dengan garis waktu. Anda bahkan dapat memundurkan waktu jika Anda kesulitan dengan kekuatan yang perlu Anda terapkan

adrix89
sumber