Dünyadan oyuncuya envanter sistemi nasıl yapılır?


11

XNA (gerçekten önemli değil, herhangi bir platform olabilir) içinde bir envanter sistemi uygulamaya çalışırken bir sorunla karşılaşıyorum ama şimdiye kadar. İşte kafamı sarmaya çalıştığım sorun:

Dünyadan bir eşyayı nasıl alabilirim (bir canavarı öldürdüğün zırhı düşürdüğünü düşün) ve oyuncumun envanterine nasıl alabilirim?

Bir envanter sadece bir öğe listesiyse, teknik olarak, bir sınıftan birden fazla şey yapmadan Çelik Kılıç'ı dünyadan oyuncumun envanterine nasıl alabilirim?

Şu anda benzersiz bir onaltılık değer, kaç öğe var (oklar gibi istiflenebilir) için bir sayı ve envanter içinde işleme için bir doku ve diğer bazı önemsiz özellikleri (ad, açıklama, vb) içeren bir öğe yapısı var .

Çarpışma tespiti ile birlikte bir dünya pozisyonuna ev sahipliği yapmak için mevcut eşya sınıfımı değiştirmek zorunda kalsaydım kötü tasarım olurdu (öğenin dünyaya düşmesini istemiyorum).

İlginiz için teşekkürler!


4
Sadece WorldItemsizin için ayrı olan bir tane olamaz mı InventoryItem? (Belki de alındığında oyuncunun envanterine yerleştirilmiş WorldItembir InventoryItemşablonu vardır).
George Duckett

1
@GeorgeDuckett Bunu bir cevap yapmalısın .. Muhtemelen Inventorybir alır WorldItemve bunu ekler bazı yöntem olmalıdır InventoryItem. Böylece öğelerin istiflenmesi gereken durumları da ele alabilir (örn. Oklar).
bummzack

@bummzack: Bitti.
George Duckett

Yanıtlar:


17

Ben yaklaşacağım yaklaşım 2 farklı yapıya (ya da sınıfa) sahip olmaktır. WorldItemve InventoryItem.

Daha sonra , dünya eşyası alındığında oyuncunun envanterine yerleştirilen InventoryItembir özellik / alan olarak bir ekleyebilirsiniz WorldItem.

Bir yerde (oyuncu sınıfında veya herhangi bir madde sınıfında), oyuncunun envanterine öğeler gibi istifleme ile başa çıkmak için bir envanter öğesi eklemeyi işleyen bir yöntem istiyorsunuz.


Bu cevabı gerçekten çok beğendim, çok teşekkür ederim, çok mantıklı! Son bir düşünce, kişinin bir öğeyi bırakmak istediğini varsayalım, Envanter öğesinin de içinde bir WorldItem'e ihtiyacı var mı?
Ross

2 yollu olması gerekiyorsa, dünya öğeleri ve envanter öğeleri çiftlerini saklayan ayrı bir 'arama' sınıfına sahip olmak cazip olurdu. Daha sonra birini diğerine bakmak için kullanabilirsiniz.
George Duckett

Ohhh güzel, bunu hiç düşünmemiştim. Bu çok ilginç bir fikir. Tüm eşyalar somut olduğu için, onları aramak mantıklıdır.
Ross

2
Alındığında WorldItem'i yok edeceğim ve öğe düştüğünde yeni bir tane oluşturacağım.
Simon Richter

Kabul. Aksini ima etmek istememiştim.
George Duckett

0

Daha önce de belirtildiği gibi, birden fazla sınıfa veya diziye bölünmeden önce en iyi seçenek olacaktır. Dünya, Oyuncu ve Öğe 3 sınıf yaratırdım Dünya sınıfı içinde bir Liste WorldItems olurdu, Oyuncu sınıfı da olurdu, ancak Envanter Listesi Envanteri Bir oyuncu bir öğeyi aldığında, onu Dünyadaki listeden taşırsınız sınıfını Player sınıfındaki listeye ekleyin.

Oyununuzun çizim döngüsünde, WorldItems listesindeki tüm Öğeleri ekrana çizen bir döngü oluşturabilirsiniz, ancak elbette oyuncu nesnesindeki Envanter listesini yok sayar.


Şu anki yöntemim, aynı öğeyle ilgili bir InventoryItem içeren bir WorldItem sınıfına sahip olmam. Oyunun Güncelleme yönteminde tüm dünya öğeleri arasında dolaşıyorum ve oyuncu ile çarpışma sınırlarını test ediyorum. İkisi çarpışırsa, WorldItem WorldItem listesinden kaldırılır ve oyuncunun envanterine (InventoryItem'in Listesi <> olan bir liste) yerleştirilir
Ross
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.