2d Platformer'da “Zaman Kontrolü”


9

Oyuncunun bir düğmeye basabileceği ve seviyeyi yeniden başlatabileceği bir 2d platform yapıyorum, sadece önceki karakterleri de aynı zamanda, aynı zamanda geriye yolculuk ediyorlar gibi, aynı anda çalışacak.

Diğer oyunların bunu daha önce yaptığını biliyorum ve bunu yapmayı düşündüğüm yol, oyun karakterinin bir dizi eylemi (Boşta, Zıplama, Solda Yürüme vb.) Yapmasını ve daha sonra bu eylemlerdeki değişiklikleri tespit edip oyun süresi ile birlikte bir liste. O zaman seviyeyi tekrar kendi başına çalıştırmak için karaktere ihtiyacım olduğunda, sadece doğru zamanda eylemlerini değiştirerek listeden geçebilirim.

Bunu yapmanın en iyi yolu bu mu? Bu konuda herhangi bir tecrübesi olan var mı?

Teşekkürler.


Aradığın şey, zaman kontrolünden çok bir 'Tekrar'. Bununla başa çıkmanın yolları hakkında bazı güzel makaleler bulabilirsiniz, ancak yine de aşağıdaki cevabın bu alanda iyi bir başlangıç ​​olduğunu düşünüyorum. Oyunda 'rastgele' olan şeylerin ilerlemeyi etkileyebiliyorsa, onu çalıştıran 'hayalet' karakterin tekrarlarını bozacağını unutmayın.
James

3
"Rastgele" parçalar hakkında iyi bir nokta. Bir tohumu temel alan numaralarını üreten rastgele bir jeneratör kullandığınızdan emin olun. Daha sonra tohumu tekrarınızla birlikte saklayın ve tekrar oynatırken aynı tohumu kullanın.
bummzack

Bunu nasıl yaptın? Geçici çözümünüz nedir?

Yanıtlar:


8

DÜZENLE:

Lütfen @ Bluescrn'in bu soruya verdiği cevaba bakınız; hareket vektörleri veya konumlarından ziyade kontrolleri tekrar oynatmadaki zayıflıkları inceler.

-

Doğru yoldasın. İşte kullanacağım yaklaşım:

Kontrolörler

Klavye girdisini alan ve karakterinize aktaran bir Controller sınıfı oluşturun. Bununla birlikte, önemli tuşlara (örn. Oklar, atlama, vb.) Tam olarak basıldığında ve bırakıldığında da bir Kontrolör kaydına sahip olun. Bu tür bilgileri depolar:

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

Bir Denetleyicinin iki modu vardır:

  1. Kayıt: Klavye girişini alır. Listeye girişi kaydeder. Karakter girişini klavye durumuna göre verir.
  2. Tekrarla: Klavye girişini yok sayar. Seviye başladığından bu yana geçen milisaniyeye göre listede ilerler. Geçerli anda kaydedilmiş klavye durumuna göre karakter girişini verir.

Karakterler

Character nesneniz oluşturulduğunda, kendisi için yeni bir Denetleyici oluşturur. Karakter her zaman iki moddan birinde olabilir:

  1. Aktif: Sadece bir tane aktif Karakter vardır ve o sizin kontrol ettiğiniz karakterdir. Karakter Aktif moddayken, Kontrolörü Kayıt modundadır. Bir Karakter oluşturulduğunda varsayılan olarak Aktif moddadır.
  2. Hayalet: Bu, geçmiş eylemlerinizi tekrarlayan kişidir. Bir Karakter Hayalet moduna girdiğinde, görünümünü değiştirir ve Denetleyicisini Tekrar moduna geçirir.

Seviyeleri

Yeni başlayan bir seviye

Seviyeye başladığınızda, tek bir Karakter oluşturun. Şimdi seviye başlar ve oyuncu işini yapar.

Zaman sıfırlandığında

Seviye sıfırlandığında, üç şey yapın:

  1. Mevcut Aktif Karaktere Hayalet moduna girmesini söyleyin.
  2. Yeni bir Karakter oluşturun.
  3. Kendilerini sıfırlamak için tüm Karakterleri arayın. Böylece hareket, vb. Olmadan başlangıç ​​pozisyonuna geri getirilirler. Kontrolörlerine hiçbir tuşa basılmadan milisaniye 0'a sıfırlamalarını söylerler.

Sonra seviye başlar ve oyuncu işini yapar.


Bu çok açık. Çok teşekkürler. Doğru bir fikrim vardı, ama hareketi günlüğe kaydetmek için merkezi bir sistem yapacaktım, ama her karakterin kendi hareketini günlüğe kaydetmesi bu konuda çok daha kolay bir yol. Teşekkürler.
Woody Zantzinger

8

Kayıtlı girdileri yeniden oynatıyorsanız, eylemler yeniden oynatıldığında durumu değiştirmiş veya değişmiş olabilecek dünyadaki hareketli / tahrip edilebilir / etkileşimli nesnelerin etkilerini göz önünde bulundurun

Ayrıca, oyununuz değişken bir zaman çizelgesi kullanıyorsa, girişleri tekrarlamak tam olarak çalışmaz. Sabit bir zaman çizelgesi oyun güncellemesi düşünebilirsiniz (değişken kare hızı oluşturma için enterpolasyonlu)?


1
Yapabilirsem +10. Büyük düşünceler. Hareket vektörlerinin veya konumun tekrar oynatılması, istenen etkiye bağlı olarak tekrar oynatma girişinden daha üstün olacaktır. Hareketler ve konumla çalışırken, kareler arasındaki on milisaniye yanlışlığı hesaba katmak muhtemelen girişten daha kolaydır.
doppelgreener


0

Klavye girişini kaydetmek sizin durumunuz için yararlı olmayabilir. Ancak, zaman çizelgesine sahip bir spline oluşturabilirsiniz. Uygulamanız gereken kuvvetlerle ilgili zorluğunuz varsa zamanı geri sarabilirsiniz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.