Saya bertanya-tanya tentang bagaimana mekanisme manipulasi waktu dalam game biasanya dirancang. Saya sangat tertarik pada pembalikan waktu (semacam seperti di BES atau Prince of Persia terbaru).
Gim ini adalah penembak top down 2D.
Mekanisme yang saya coba desain / implementasikan memiliki persyaratan sebagai berikut:
1) Tindakan entitas selain karakter pemain sepenuhnya deterministik.
- Tindakan yang dilakukan suatu entitas didasarkan pada frame yang dikembangkan sejak level awal dan / atau posisi pemain di layar
- Entitas dilahirkan pada waktu yang ditentukan selama level.
2) Pembalikan waktu berfungsi dengan membalikkan kembali secara realtime.
- Tindakan pemain juga terbalik, ia memutar balik apa yang dilakukan pemain. Pemain tidak memiliki kontrol selama waktu mundur.
- Tidak ada batasan pada waktu yang dihabiskan untuk membalikkan, kita dapat membalikkan semua jalan ke awal level jika diinginkan.
Sebagai contoh:
Frame 0-50: Pemain bergerak foward 20 unit selama waktu ini Musuh 1 memunculkan di frame 20 Musuh 1 bergerak ke kiri 10 unit selama bingkai 30-40 Pemain menembakkan peluru di bingkai 45 Peluru bergerak 5 foward (45-50) dan membunuh Musuh 1 di bingkai 50
Membalik ini akan diputar ulang secara realtime: Pemain bergerak mundur 20 unit selama waktu ini Musuh 1 bangkit kembali pada frame 50 Bullet muncul kembali pada frame 50 Bullet bergerak mundur 5 dan menghilang (50-45) Musuh bergerak ke kiri 10 (40-30) Musuh dihilangkan pada bingkai 20.
Hanya dengan melihat gerakan, saya punya beberapa ide tentang bagaimana mencapai ini, saya berpikir untuk memiliki antarmuka yang mengubah perilaku ketika waktu bergerak maju atau mundur. Alih-alih melakukan sesuatu seperti ini:
void update()
{
movement += new Vector(0,5);
}
Saya akan melakukan sesuatu seperti ini:
public interface movement()
{
public void move(Vector v, Entity e);
}
public class advance() implements movement
{
public void move(Vector v, Entity e)
{
e.location += v;
}
}
public class reverse() implements movement
{
public void move(Vector v, Entity e)
{
e.location -= v;
}
}
public void update()
{
moveLogic.move(new vector(5,0));
}
Namun saya menyadari ini bukan kinerja yang optimal dan akan cepat menjadi rumit untuk tindakan lebih lanjut (seperti gerakan halus di sepanjang jalur lengkung dll).