Bir seviyede tanımlanan nesneler için kalıcı durumu nasıl uygulayabilirim?


17

Tekrar gözden geçirilebilen bir dizi birbirine bağlı seviyeden oluşan bir 2D Metroidvania geliştiriyorum.

Her seviye, farklı hareketli grafik sınıflarının çeşitli nesnelerinin (örneğin, düşmanlar, pikaplar, kollar vb.) Ortaya çıktığı yerlerde belirlediğim döşenmiş bir TMX dosyası ile temsil edilir . Yeni bir oyun başlatırken, kaydedilmiş bir oyunu yüklerken veya bir seviyeyi değiştirirken, oyun döngüm uygun TMX dosyası üzerinden çalışır ve bu düzeydeki tüm nesneleri oluşturur.

Seviye değişikliklerini şu şekilde ele alıyorum: PlayerNesne bir nesneyle kesişiyorsa Portal, change_map()yeni bir harita yükleyen (kesişen portalla ilişkili olan) ve oynatıcıyı yeni harita üzerinde uygun bir konuma yerleştiren bir yöntem çağrılır.

Nesnelerimden bazıları, seviye değişiklikleri ve oyunu kaydetme ve oyundan çıkma yoluyla kalıcı olmak istediğim durumlara sahip . Örneğin, bir oyuncu bir kapının kilidini açarsa ve kapının durum özelliği "açık" olarak ayarlanırsa, oynatıcı geri döndüğünde kapının açık olmasını isterim. Sol veya sağ olarak ayarlanabilen kollar ve diğer çeşitli nesneler için benzer bir şey istiyorum. Ayrıca, oyuncu bazen alanı tekrar ziyaret ettiğinde yeniden doğmak istemediğim eşyaları toplar.

Sorum şu; bu tür bir kalıcılığı nasıl ele alabilirim?

Python'da çalışıyorum, ancak bundan soyutlayabileceğinizi düşünüyorum.

Yanıtlar:


27

Bu konuyu düşünmemek en iyi sonuçları vereceğini düşünüyorum, böylece oyununuza diğer kaydetme verileriniz boyunca sakladığınız basit bir anahtar / değer tasarruf sistemi uygulayacağım ve daha sonra önceki bir duruma erişmeniz gerektiğinde talep üzerine yükleyeceğim.

Akış şöyle görünebilir:

  1. Dosyadan yükleme seviyesi
  2. Bir döşemeyi / nesneyi yerleştirmeden önce "kalıcı" özelliğine sahip olup olmadığını kontrol edin.
    1. Evet ise: Kaydedilen anahtar / değer çiftini özelliğe uyan anahtar için kontrol edin ve uygun değeri getirin.
    2. Hayır ise: Nesneyi normal şekilde yerleştirin
  3. Oyuncu seviyeden çıktığında / oyun döngüsünü "sürekli" özelliğe sahip tüm nesneler arasında kaydeder ve anahtar / değer çifti olarak kaydeder.

İşte basit 2D oyunum için kullandığım şeye dayalı bir sahte kod örneği:

def load_map(map):
    for y in range(0, height):
        for x in range(0, width):
            tile = map[x, y]

            for property in tile.properties:
                if is_persistent(property.name):
                    // Name prefixed with "persistent" means that it's persistent
                    // so we load the value from out persistent storage
                    property.value = persistent_values[property.name]

def save_map(map):
    ... everything in load_map ...
    if (property.name.matches("persistent_*")):
        // Name prefixed with "persistent" means that it's persistent
        // so we save the value to persistent storage
        persistent_values[property.name] = property.value

def is_persistent(name):
    return name.matches("persistent_*") and persistent_values.contains(name)

Sonra sadece bu özelliği kullanarak durumunu kontrol edebilirsiniz:

def draw():
    if properties["persistent_is_pressed"].value:
        draw_sprite(button_pressed)
    else:
        draw_sprite(button_unpressed)

def on_pressed():
    properties["persistent_is_pressed"].value = not properties["persistent_is_pressed"].value

Eğer böyle bir kiremitli harita editörü kullanıyorsanız Karo böyle ekleyerek özellikleri çok kolaydır:

özellik ekleme

Umarım bu size kalıcı durumun mümkün olduğunca basit bir şekilde nasıl uygulanacağı hakkında bir fikir verecektir!


Durumum için tam olarak nasıl uygulanacağını görmek için uğraşıyorum, ancak bu çok yararlı. Bunu biraz daha düşüneceğim.
GoldenGremlin

Sanırım işe nasıl değer tasarrufu sağlayabildiğimi görmekte sorun yaşıyorum. Kaydettiğimde, TMX verilerindeki fayanslar üzerinde yineleme yapmayacağım. Aksine, all_sprites grubumdaki hareketli grafik nesneleri üzerinde yineleme yapacağım. Haritaları yüklediğimde, hareketli grafik nesnelerini başlatırken TMX nesnelerinin TMX özelliklerini parametre olarak kullanıyorum, ancak bundan sonra bu özelliklere dokunmuyorum, bu nedenle hareketli grafik nesnelerindeki değişiklikleri izlemiyorlar.
GoldenGremlin

1
@dietestus Büyük olasılıkla hareketli grafik nesnelerinize propertiesbunun yerine değiştirdiğiniz bir alan vermelisiniz ve döşemeleri yalnızca propertieshangi özelliğin değiştirileceğini belirtmek için kullanmalısınız (ancak tüm veriler hareketli grafiğinizde saklanır). Ayrıca karoyu
sprite'a da geçirebilirsin, böylece karoyu sprite'dan

3
@dietestus Kalıcı bir varlıkla (kapı, kol) etkileşime girer girmez yeni durumu anahtar / değer eşlemesine kaydedersiniz. Kaydettiğinizde haritalar üzerinde yineleme yapmanız gerekmez, haritanızda zaten her şey var.
Herr Derb

1
@dietestus Evet, :) anahtarların özellik adları ve değerlerin (iyi ... değerler) olduğu basit bir sözlüktür. Aynı döşemede birden fazla nesneye sahip olmak, benzersiz anahtarlarınız olduğu sürece hiçbir şeyi değiştirmez.
Charanor
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.