Oyuna yolculuk yaparken zaman nasıl uygulanır?


10

Bir oyuna zaman yolculuğunun nasıl uygulanacağını merak ediyordum. Süper karmaşık bir şey yok, sadece örgülerde olduğu gibi zaman tersine çevirir, burada kullanıcı 30 saniye veya ne olursa olsun geri sarar / hızlı ileri sarar.

Web'de çok fazla arama yaptım, ancak sonuçlarım genellikle zamanı "saat 3:00" veya bir zamanlayıcı gibi kullanıyordu.

Aklıma gelen tek şey, biri oyuncunun x konumu için diğeri oyuncunun y konumu için olmak üzere 2 dizi kullanmak ve sonra bu dizileri yinelemek ve karakteri geri / hızlı ileri sararken bu konuma yerleştirmekti. Bu işe yarayabilir mi? Çalışırsa, dizi ne kadar büyük olmalı ve oyuncunun x ve y'sini ne sıklıkta saklamalıyım? Eğer işe yaramazsa, başka ne deneyebilirim?

Şimdiden teşekkürler!


11
Haberleri okumuyor musunuz ( ust.hk/eng/news/press_20110719-893.html )? Az önce zaman yolculuğunun mümkün olmadığını gösterdiler. Bu nedenle kodlamak imkansızdır.

Zaman yolculuğu için olası bir anlambilim düşünmeniz gerekir, ancak daha sonra uygulama hakkında düşünmeye başlayabilirsiniz.
Paŭlo Ebermann


2
Kendinize biraz vektör matematik öğrenin . Onlarla hiç çalışmamanızı öneren iki ayrı dizi öneriyorsanız. Bir şeyleri basitleştirebilecekleri için bir oyun programcısı için bilmesi çok önemlidir.
doppelgreener

5
import universal.back2future.FluxCapacitor;
jhocking

Yanıtlar:


6

Dizi fikri hemen hemen Braid'de nasıl uygulandığıdır. Bir karakter üzerinde etkili olan tek şey yerçekimi, klavye / joypad girişi ve diğer karakterler olduğunda, o karakter hakkında önemli olan her şeyi bilmek için hemen her adımda konumu ve hızı kaydetmeniz yeterlidir. Karakter başına saniyede 10 anlık görüntü kaydederseniz, bir karakterin geçmişinin bir dakikası için hala 50K'dan azdır - çoğu sistemde kolayca yönetilebilir ve bundan daha verimli yollar da bulabilirsiniz.


Bu doğru yol. Örneğin aktif komutları sakla: zaman damgalarıyla tuşlara basar. Sistem belirleyici ise, diğer davranışların çoğunu tahmin edebilirsiniz. 10 fps izleyici bir geri sarma sistemi için iyidir, gerçek komutlar tutulduğu sürece, aslında nesnelerin durumu veya durumları daha az kabul edilebilir.
karmington

4

Komut Deseni'ni okuyun . Geri alma eylemleri sağlar (ve daha sonra bunları yeniden yapmak için.) Bu, bir geminin pozisyonundan daha fazlasını, ancak oyuncunun yaptığı tüm eylemleri ele alır.

Ama dizi fikrinizin de sağlam olduğunu düşünüyorum.


Muhtemelen harika bir fikir değil - daha fazla bellek yoğun olmanın yanı sıra (bir varlığın hızını konumuna her eklediğinizde, bunu bir "eylem" olarak saklamanız gerekir) , hemen hemen sabit noktalı matematik gerektirir , çünkü kayan -konumlarınız / hızınız için puan, (x+v)-veşit olmayabilir x.
BlueRaja - Danny Pflughoeft

1
@BlueRaja - Bu yaklaşımın nerede bellek yoğun olacağını görmeyin. 100 FPS'de ve son 10 saniyeyi saklarken, n'nin en fazla 5 olduğu 1000 n-tupel komutunu saklamanız gerekir. Ya da daha iyisi, bu karelerin her birinde yalnızca mutlak konumu saklarsınız ve geri sarma için karakteri bu yol boyunca geriye doğru canlandırırsınız. Bu aynı zamanda olası kayan nokta sorunlarını da ortadan kaldırır ve sizi tam olarak başladığınız yere geri getirir.
Hackworth

3

İki ayrı diziden ziyade, muhtemelen oyuncunun konumunu tanımlayan bir sınıfınız olmalıdır (muhtemelen Java'da bir Point sınıfı vardır ... Son zamanlarda bir C # adamıyım) ve geçmiş konumları tutmak için tek bir dizi kullanmalısınız.

Bir "halka arabelleği" ayarlamanız gerekir, yani dizinin sonuna geldiğinizde, en eski girişlerin üzerine yazarak dizinin başına geri dönersiniz. Zamanda geriye giderseniz, bunun tersi doğrudur (başa geldiğinizde, sonuna kadar daire içine alın).

30 saniye değerinde geçmiş veri tutmak istiyorsanız, alanı önceden ayırmak ve sabit boyutlu bir dizi kullanmak istiyorsanız kare hızınızı bilmeniz gerekir. Oyunu 10 kare / saniyede, 30 saniyede yaparsanız, bu 300 öğedir.


2

GDCVault Jon Darbe ile bir konferans (yaratıcısı vardır Braid denilen kendi sitesinde) Braid içinde Rewind Uygulanması 3,95 $ için. Bahse girerim bu istediğiniz bilgiye sahiptir;)

EDIT: Muhtemelen Java'da olmayacak, ancak fikirlerin tutulması gerekir.


Konuşma metnini de satıp satmadıklarını biliyor musunuz?
o0 '.

Siteyi hızlı bir şekilde arayarak hiçbir şey bulamadım. Belki bir transkripsiyon yazılımı kullanabilirsiniz ?
NoobsArePeople2

1

Gibi Erik J söyledi noktasının bir koleksiyon makul bir halka tampon sesler nesneler olarak oyuncunun geçmiş pozisyonları depolayarak,.

Ancak, arabelleği uygulamak için bir kuyruk kullanmanızı öneririm . Güncellemek bir diziden çok daha ucuzdur ve kare hızınızı önceden bilmek zorunda değilsiniz:

update():
   time_queue.push(player.positions)
   if current_time() - start_time > n:
       queue.pop()

Bu henüz değişen kare hızlarını veya gerçekten herhangi bir zaman yolculuğu yaparsanız ne olacağını düşünmüyor, bu yüzden her girişle bir zaman damgası depolamanızı ve bunun yerine şunları kontrol etmenizi öneririm:

update():
    time_queue.push({
        'pos': player.positions,
        'time': current_time()
    })
    first_entry = queue.peek()
    while current_time() - first_entry['time'] > n:
       queue.pop()
       first_entry = queue.peek()

Bu yardımcı olur umarım!


1

Memento adında bir tasarım deseni var , bence bu Braid gibi bir oyun için başlangıç ​​noktası

Hatıra kalıbı, bir nesneyi önceki durumuna geri yükleme (geri alma yoluyla geri alma) olanağı sağlayan bir yazılım tasarım kalıbıdır.

Hatıra kalıbı iki nesne tarafından kullanılır: yaratıcı ve bekçi. Oluşturan, dahili durumu olan bir nesnedir. Bekçi, gönderen kişiye bir şeyler yapacak, ancak değişikliği geri almak istiyor. Görevli ilk önce yaratıcıdan bir hatıra nesnesi ister. Sonra ne yaparsa yapsın (veya işlem sırasını) yapar. İşlemlerden önce duruma geri dönmek için, memento nesnesini göndericiye döndürür. Hatıra nesnesinin kendisi opak bir nesnedir (bekçinin değiştiremeyeceği veya değiştirmemesi gereken). Bu şablonu kullanırken, kaynak oluşturucu diğer nesneleri veya kaynakları değiştirebilirse dikkatli olunmalıdır - hatıra deseni tek bir nesne üzerinde çalışır.

http://en.wikipedia.org/wiki/Memento_pattern

Burada adcional bilgi: http://dofactory.com/Patterns/PatternMemento.aspx


2
Bunun nasıl yardımcı olacağını göremiyorum. OP bir "anında geri alma" gibi görünüyor, OP ise Braid'inki gibi pürüzsüz bir şey istedi. Belki bir şeyi yanlış okudum?
o0 '.

Bu desen tek bir geri dönüşte ima edilmez, örneğin eylemlerin "zaman çizelgesini" oluşturabilirsiniz. İşte bu modelin kullanımı hakkında bir Brazillian'ın blog yazısı: abrindoojogo.com.br/padroes-de-projeto-memento İşte Flash'ta yapılan bir örnek: abrindoojogo.com.br/files/fasteroids.swf Taşı: Oklar | Vur: Uzay | Geri sarma Eylemler: Backspace
Marcelo Assis

1

XBox360 için zaman manipülasyonu içeren bir oyun vardı. Vasattı, bu yüzden şu anda başlığı hatırlayamıyorum. Her neyse, bunun için bir geliştiriciyle yapılan röportajda, zaman manipülasyonunu nasıl yönettiklerini açıkladılar:

Her X karesi (X'in düşük değerleri daha hassas bir manipülasyona yol açar), o noktada gameworld'ün "anlık görüntüsünü" alır ve oyun içi bir zamanla ilişkilendirirsiniz.

Oyun boyunca normalde, zaman içinde oynarken, bir reaksiyonun her girişi gelecekte ayarlanan anlık görüntüye katkıda bulunur.

Oyun dünyası o anki anlık görüntü ile gelecekteki anlık görüntü X kareleri arasında yinelenir.

Daha sonra, zamanı ters çevirmek istediğinizde, zaman yönünü geriye doğru ayarlayın, böylece geçmişte şimdiki ve anlık görüntü X kareleri arasında yinelenir (gelecekteki anlık görüntüler oluşturma yeteneğini devre dışı bırakırken).


Anlık görüntülerin ayrıntı düzeyi hakkındaki nokta için +1.
Omar Kooheji

0

Oyunun sanal zamanını başka bir uzay benzeri boyut olarak ele alabilirsiniz. Yani dışarıdan zaman yolculuğu, oyunun sanal evreninde basit bir n + 1 boyutlu harekettir.

Kullanıcı girişi olmadığında evreninizin davranışını belirleyen bazı kullanıcı etkileşimleri ve bir çeşit fizik sistemi varsayarsak, kaydetmeniz gereken tek şey kullanıcı etkileşimlerinin etkisidir (örneğin, n + 1 boyut hızı / hızlanma vektörlerindeki değişiklikler) , fizik zaman zaman tersine çevrilebilir olmalıdır.

Bu şekilde, herhangi bir zaman koordinatında oyun evreninin durumunu hesaplamak için çok daha az belleğe ihtiyacınız olacaktır.


Başka bir yorumda belirttiğim gibi, video oyunlarındaki fizik genellikle geri dönüşümlü değildir , çünkü kayan nokta sayılarını kullanırken, (x+v)-veşit olmayabilirx
BlueRaja - Danny Pflughoeft

0

Bir varlığın bir hız, dönüş, x ve y konumuna sahip olduğunu varsayalım. Bunlar, hızlanma ile, ona ne derseniz deyin, temel hareket durumları, değerleridir. Verileri iki şekilde kaydedebilirsiniz:
1. Dönüşü, x ve y konumunu
kaydedin 2. Dönüşü, x hızını ve y hızını kaydedin

Sabit bir hızınız varsa, dönüşü de kaydedebilir veya her iki eksen için yalnızca bir hız kaydedebilirsiniz.

Varlığınızda statik bir rotasyon yoksa, çoğu durumda olmayan şeylerde oyunlarda rotasyon kaydetmek gerekir.

Bununla birlikte, birden çok değer için bir nesne listesi kullanmak gereklidir. Örneğin, güncelleme yöntemlerini saniyede 20 kez çağıran ve bu nedenle fps'den bağımsız olan güzel bir zamanlayıcı sisteminiz varsa, son 30 saniye için gereken hareket değerlerini saklamak için 20 * 30 nesnelerden oluşan bir dizi oluşturabilirsiniz. . Basit bir dizi kullanılması önerilmez, çünkü her öğeyi her güncelleme çağrısında bir dizin sola taşımak zorunda kalacaksınız.

Buna dayanarak, listeyi veya geri dönmek için her şeyi inceleyebilirsiniz. Gerçekten "gerçekçi" bir etki elde etmek istiyorsanız, tüm hareketli nesneler için bu tekniği kullanın. Ama bu oyun tasarımı ile ilgili.

Nesneleri yok ederseniz, düzgün arkadaşınız Bay Garbage'ı vurgulamadığınızdan emin olmak için onları havuzlamayı unutmayın.)

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.