Saya bertanya-tanya bagaimana menerapkan perjalanan waktu ke dalam game. Tidak ada yang super kompleks, hanya pembalikan waktu seperti yang ada di Braid, di mana pengguna dapat memundurkan / memajukan waktu dengan 30 detik atau apa pun.
Saya banyak mencari di web, tetapi hasil saya biasanya disebut menggunakan waktu seperti pada "ini jam 3:00" atau timer dan semacamnya.
Satu-satunya hal yang dapat saya pikirkan adalah menggunakan 2 array, satu untuk posisi x pemain dan yang lainnya untuk posisi y pemain, dan kemudian mengulangi melalui array tersebut dan menempatkan karakter pada posisi itu ketika mereka mundur / maju cepat waktu. Bisakah itu berhasil? Jika itu akan berhasil, seberapa besar array harus dan seberapa sering saya harus menyimpan x dan y pemain? Jika tidak berhasil, apa lagi yang bisa saya coba?
Terima kasih sebelumnya!
sumber
import universal.back2future.FluxCapacitor;
Jawaban:
Ide array cukup banyak bagaimana itu diterapkan di Braid. Ketika satu-satunya yang bertindak pada karakter adalah gravitasi, input keyboard / joypad, dan karakter lain, Anda cukup hanya perlu menyimpan posisi dan kecepatan pada setiap langkah untuk mengetahui segala sesuatu yang penting tentang karakter itu. Jika Anda menyimpan 10 foto per detik per karakter maka masih kurang dari 50 ribu menit untuk satu menit sejarah karakter - mudah dikelola pada kebanyakan sistem, dan Anda dapat menemukan cara yang lebih efisien daripada itu juga.
sumber
Baca di Pola Perintah . Ini menyediakan untuk membatalkan tindakan (dan untuk kemudian melakukannya kembali.) Itu akan menangani lebih dari sekadar posisi kapal, tetapi semua tindakan yang dilakukan pemain.
Tapi saya pikir ide array Anda juga masuk akal.
sumber
(x+v)-v
mungkin tidak sama denganx
.Daripada memiliki dua array terpisah, Anda mungkin harus memiliki satu kelas yang menggambarkan posisi pemain (mungkin sudah ada kelas Point di Jawa ... Saya seorang pria C # belakangan ini) dan menggunakan satu array tunggal untuk menahan posisi masa lalu.
Anda perlu mengatur "ring buffer", yang berarti bahwa ketika Anda sampai di akhir array, Anda berputar kembali ke awal array, menimpa entri tertua. Jika Anda melakukan perjalanan ke masa lalu, yang terjadi adalah kebalikannya (ketika Anda sampai di awal, lingkari hingga akhir).
Jika Anda ingin menyimpan data masa lalu senilai 30 detik, Anda perlu mengetahui frame rate Anda jika Anda ingin pra-mengalokasikan ruang dan menggunakan array ukuran tetap. Jika Anda membuat game dalam 10 frame / detik, kali 30 detik, itu adalah 300 elemen.
sumber
GDCVault memiliki ceramah oleh Jon Blow (pencipta Braid ) di situs mereka yang disebut Implementasi Rewind in Braid seharga $ 3,95. Saya berani bertaruh ini memiliki info yang Anda inginkan;)
EDIT: Mungkin tidak akan berada di Jawa tetapi ide-idenya harus berlaku.
sumber
Seperti yang dikatakan Erik J , menyimpan posisi masa lalu pemain sebagai kumpulan objek titik dalam buffer cincin terdengar masuk akal.
Namun, saya akan menyarankan menggunakan antrian untuk mengimplementasikan buffer. Jauh lebih murah untuk memperbarui daripada array dan Anda tidak perlu tahu frame rate Anda sebelumnya:
Ini belum mempertimbangkan berbagai frame rate atau apa yang harus terjadi jika Anda benar-benar melakukan perjalanan waktu, jadi saya sarankan Anda menyimpan cap waktu dengan setiap entri dan periksa sebagai gantinya:
Semoga ini membantu!
sumber
Ada pola desain yang disebut Memento , saya pikir itu adalah titik awal untuk permainan seperti Braid
http://en.wikipedia.org/wiki/Memento_pattern
Info tambahan di sini: http://dofactory.com/Patterns/PatternMemento.aspx
sumber
Ada game yang dirilis untuk XBox360 yang melibatkan manipulasi waktu. Itu biasa-biasa saja, jadi saya tidak ingat judulnya saat ini. Bagaimanapun, dalam sebuah wawancara dengan pengembang untuk itu, mereka menguraikan bagaimana mereka mengelola manipulasi waktu:
Setiap X frame (dengan nilai X yang lebih rendah yang mengarah ke manipulasi yang lebih halus), Anda mengambil "snapshot" dari gameworld pada saat itu, dan mengaitkannya dengan waktu dalam game.
Saat bermain melalui permainan secara normal, maju-maju, setiap input dan suatu reaksi berkontribusi pada set snapshot pada suatu waktu di masa depan.
Dunia game kemudian beralih di antara snapshot pada waktu saat ini, dan frame X snapshot di masa depan.
Kemudian, ketika Anda ingin membalikkan waktu, cukup atur arah waktu untuk mundur, sehingga ia beralih antara frame X saat ini dan snapshot di masa lalu (sambil menonaktifkan kemampuan untuk membuat snapshot masa depan).
sumber
Anda cukup memperlakukan waktu virtual gim sebagai dimensi lain yang mirip ruang. Jadi perjalanan waktu dari luar adalah gerakan sederhana n + 1 dimensi di alam semesta virtual game.
Dengan asumsi beberapa interaksi pengguna dan semacam sistem fisika yang menentukan perilaku alam semesta Anda ketika tidak ada input pengguna, yang perlu Anda catat adalah efek interaksi pengguna (misalnya, perubahan dalam vektor kecepatan / percepatan n + 1 dimensi) , karena fisika Anda harus dapat dibalik waktu.
Dengan cara ini Anda akan membutuhkan lebih sedikit memori untuk menghitung keadaan semesta permainan pada waktu yang ditentukan.
sumber
(x+v)-v
mungkin tidak sama denganx
Katakanlah suatu entitas memiliki kecepatan, rotasi, posisi x dan y. Ini adalah, dengan percepatan, status gerakan dasar, nilai-nilai, apa pun sebutannya. Anda dapat menyimpan data dengan dua cara:
1. Simpan rotasi, posisi x dan y
2. Simpan rotasi, kecepatan x dan kecepatan y
Jika Anda memiliki kecepatan tetap, Anda juga bisa hanya menyimpan rotasi, atau hanya menyimpan satu kecepatan untuk kedua sumbu.
Menyimpan rotasi diperlukan dalam permainan, kecuali jika entitas Anda memiliki rotasi statis, apa yang tidak dalam kebanyakan kasus.
Yang mengatakan, menggunakan daftar objek untuk beberapa nilai diperlukan. Jika Anda memiliki sistem pengatur waktu yang bagus, yang, misalnya, memanggil metode pembaruan 20 kali dalam satu detik, dan karena itu fps independen, Anda dapat membuat array 20 * 30 objek untuk menyimpan nilai pergerakan yang Anda butuhkan selama 30 detik terakhir . Menggunakan array sederhana tidak dianjurkan, karena Anda harus memindahkan setiap elemen satu indeks kiri setiap panggilan pembaruan.
Berdasarkan ini, Anda dapat pergi melalui daftar atau apa pun untuk kembali. Jika Anda benar-benar ingin mendapatkan efek "realistis", gunakan teknik ini untuk semua objek yang bergerak. Tapi ini terkait desain game.
Jika Anda menghancurkan benda, ingatlah untuk mengumpulkannya, untuk memastikan bahwa Anda tidak membuat teman Anda yang rapi, Tuan Garbage;)
sumber