Oyunlardaki zaman manipülasyon mekanizmalarının tipik olarak nasıl tasarlandığını merak ediyorum. Özellikle zaman tersine çevirme ile ilgileniyorum (en son SSX veya Pers Prensi gibi).
Oyun bir 2D yukarıdan aşağıya shooter.
Tasarlamaya / uygulamaya çalıştığım mekanizmanın aşağıdaki gereksinimleri var:
1) Oyuncu karakteri dışındaki objelerin hareketleri tamamen belirleyicidir.
- Bir varlığın gerçekleştirdiği işlem, seviye başlangıcından bu yana kaydedilen karelere ve / veya oynatıcının ekrandaki konumuna dayanır.
- Varlıklar seviye boyunca belirlenen zamanda üretilir.
2) Zaman tersi, gerçek zamanlı olarak geri dönerek çalışır.
- Oyuncu eylemleri de tersine çevrilir, oyuncunun yaptıklarını tersine oynatır. Oyuncunun ters süre boyunca kontrolü yoktur.
- Tersine çevirmek için harcanan zamanla ilgili bir sınır yoktur, istenirse seviyenin başlangıcına kadar tersine çevirebiliriz.
Örnek olarak:
Çerçeveler 0-50: Oyuncu bu süre zarfında 20 birim ilerler Düşman 1, çerçeve 20'de ortaya çıkar. Düşman 1, çerçeve 30-40 sırasında 10 birim sola hareket eder. Oyuncu, 45. çerçevede kurşun vurur. Mermi, 5 ileri (45-50) gider ve Düşman 1'i çerçeve 50
Bunu tersine çevirmek gerçek zamanlı olarak tekrar oynayacaktır: Oyuncu bu süre zarfında 20 birim geriye doğru hareket eder. Düşman 1, 50 numaralı karede yeniden canlandırır 50. karede yeniden kurşun Mermi 5 geriye doğru kaybolur ve (50-45) Düşman sola hareket eder 10 (40-30) çerçeve 20.
Harekete baktığımda bunu nasıl başaracağım konusunda bazı fikirlerim vardı, zaman ilerledikçe veya tersine döndüğünde davranışını değiştiren bir arayüze sahip olmayı düşündüm. Bunun gibi bir şey yapmak yerine:
void update()
{
movement += new Vector(0,5);
}
Böyle bir şey yapardım:
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));
}
Bununla birlikte, bunun en iyi performans açısından akıllıca olmayacağını ve daha ileri eylemler için (kavisli yollar boyunca yumuşak hareket gibi) hızla karmaşık hale geleceğini fark ettim.