Roguelike oyun durumunu kaydetme?


11

HTML5 ve jQuery kullanarak temel bir roguelike üzerinde çalışıyorum ve bir sorunla karşılaştım.

Oyunun şu anki haliyle, sistem oyun durumunu yalnızca kullanıcı katlar arasında her hareket ettiğinde kaydeder - yükü en aza indirmek için. Bunun tehlikesi, eğer kullanıcı belaya girerse, pencereyi kapatabilir ve mevcut katın başlangıcında oyunlarına geri dönebilirler. Bu, oyunun zorluğunu büyük ölçüde azaltır (ve neredeyse bir roguelike amacını yener) - ancak her bir oyuncu hareketi veya saldırısı ile oyun durumunu kaydetmek mantıksızdır.

Oyun durumunu tarayıcı penceresinde kapatmanın yollarını araştırdım, ancak onlardan memnun değilim. Benim sorum şudur: "bir oyun durumunu kaydetmek" orta derecede ağır bir ajax / post isteği demek, bu hile davranışını nasıl engelleyebilirim? Tüm harita durumunu kaydetmenin aksine, 2B haritasındaki artımlı / prosedür değişikliklerini ölçmek için bilinen bir metodoloji var mı? Lütfen, "en etkili yol" istemiyorum - deneyimsizliğimi düzeltmek için mevcut metodolojileri arıyorum.


Çok genel ve genel JavaScript programlama sorusu. Oy verdim ama sonra yeniden düşündüm, çünkü bir boşaltma olayını tetikleyemezseniz nasıl yapacağınızı düşünmeniz ilginç.
Tim Holt

Belki bu sorunu doğrudan ele almak için tekrar
yazacağım

@TimHolt - önerinize göre düzenlendi
CodeMoose

Yanıtlar:


8

Bariz çözüm, her oyuncu komutunu yapıldığı gibi sunucuya göndermek ve sunucunun bunları günlüğe kaydetmesini sağlamaktır; bu şekilde, oyun herhangi bir nedenle iptal edilirse, oyunu bıraktığı noktaya geri yüklemek için kaydedilen komutlar yeniden oynatılabilir.

Elbette, uygun bir kaydetme yapıldığında, eski komut günlüğü atılabilir (ancak eski oyunların tekrarlarına izin vermek için de kaydedebilirsiniz; bunu yaparsanız, gerçek zamanlı yeniden oynatma için günlüğe zaman damgaları dahil etmek isteyebilirsiniz ). Ayrıca , oyuncu oyunu kapatmadan veya kilitlemeden çok uzun süre önce aynı seviyede kalırsa aşırı uzun tekrarlardan kaçınmak için son kaydetmeden sonra ( komut, n = 1000 gibi) n komut yapıldıktan sonra otomatik olarak tam bir kayıt yapmak isteyebilirsiniz. .

Oyununuz rasgele sayılar içeriyorsa (ve muhtemelen bir roguelike olması durumunda), bir tekrar oynatma sırasında bunların doğru bir şekilde yeniden oluşturulduğundan emin olmanız gerekir. Bir çözüm her rasgele sayıyı tekrar günlüğüne dahil etmektir; bir diğeri ise deterministik bir sözde sayı üreteci kullanmak ve oyun kaydedildiğinde tohumdan tasarruf etmektir.

Tüm bu yöntemlerin istemci ile oynanarak kullanılabileceğine dikkat edin, ancak istemcide oyun mantığınız olduğunda bu gerçekten kaçınılmazdır. Hile korumalı bir alternatif olarak, gerçek oyunu sunucuda çalıştırabilir ve istemcinin tüm oyuncu komutlarını sunucuya göndermesini ve görüntü güncellemelerini geri almasını sağlayabilirsiniz. Roguelike için bu mümkün olabilir. Açıkçası, bu durum kaydetme sorununuzu da çözecektir (yine de hem yeniden işlevsellik hem de sunucu çökmelerinden kurtarmaya izin vermek için sunucuya bir tür komut günlüğü uygulamak isteyebilirsiniz). Dezavantajı, bunu yapmak, çevrimdışı oynamayı imkansız hale getirecektir (tabii ki, sunucu tarafı kodunu, oyuncuların istedikleri takdirde yerel olarak çalıştırabilmeleri için).


1
AFAIK tüm RGN'ler yalancıdır .. gerçekten (tohumsuz) rastgele değerler elde etmek için özel donanıma ihtiyacınız vardır .
bobobobo

1
@bobobobo var. sahte platform (tohumlanmış) ve .Net Platformunda kriptografik olarak güvenli rasgele sayılar (tohumsuz) var. Donanım rastgele olabilir / olmayabilir, ancak sadece bir tohum depolayamayacak kadar yakındır.
Rangoric

2

Aynı sorunun daha genel bir sorusu için bkz. Https://stackoverflow.com/questions/3888902/javascript-detect-browser-close-tab-close-browser .

Ayrıca kat değişikliklerinde tam oyunu ve her hamlede artımlı deltaları kaydetmeyi düşünün. Daha sonra oyunu son hamle noktasına kadar tekrar oynayabilirsiniz.

Rastgele sayı üreteçlerinin bir kullanımı olduğu varsayılarak, her yeni katın başında rastgele sayı üretecini üretip yeniden tohumlayabilir ve ardından zemiyle birlikte kaydedebilirsiniz. Daha sonra yükte yeniden boyutlandırma yapabilirsiniz ve hareketleri aynı sırayla yapılan sonuncuya kadar tekrarlayabilmelisiniz.


Teşekkürler Tim - Bir kez oyun geliştirici zihniyetine girdiğimde, oyun geliştiriciye dokunan herhangi bir şeyi kovalamak gerçekten çok kolay. Yine de bir cevap sağlamak için aksesuarlar.
CodeMoose

Endişeye gerek yok - soru üzerine gözden geçirilmiş yorumu da görün :)
Tim Holt

Ben de her hamlede artımlı deltalar söylerdim .
bobobobo

2

Artımlı tasarruflara değil, tam tasarruf için zaman bulma yaklaşımları:

  • onunload, daha önce bahsedildiği gibi. Bunu güvenilir buldum (ancak localStorageağları değil, işleri değiştirebilir).
  • Pencereniz odak kaybettiğinde kaydedin.
  • Periyodik olarak kaydet: son kaydetme n dakika içinde olmadığında ve kullanıcı m saniye içinde herhangi bir giriş yapmadığında .
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.