Oyun varlıklarının yok edilmesinin uygun yolu


10

Yüklerin ve yüklerin her zaman dinamik olarak yüklendiği bir oyun dünyası düşünün, bunu belki bir varlık listesi olarak temsil edebilirim, ama onları kaldırmaya ne dersiniz?

Eklerken ben yeni varlık geri itme olabilir, ben kap içinde herhangi bir yerde kaldırmak zorunda olabilir. Elemanın kaldırılacak konumunu bulmak için arama yapmaktan kaçınmak için hangi seçeneklere sahibim?

Varlık kimliğini kaptaki konumu olarak saklayabileceğimi, doğrudan kaldırma için bir yol oluşturabileceğini düşündüm, ancak bu bir tür karşılıklı bağımlılık 'bozukluğu' üretmez mi?

Doğru yolu List.RemoveAt (whereToRemove) gibi bir şey olacağını biliyorum; ama ya sadece işletme ne zaman ölmesi gerektiğini bilirse?

Yoksa sadece bir şey mi kaçırıyorum ve bir liste kapsayıcı bir nesnenin ne zaman yıkıldığını ve kendi boyutunu küçülttüğünü bilecek mi?

Yanıtlar:


10

Koşullarınız:

  • Diğer nesneler kaldırıldıktan sonra kaldırılan varlığınıza bağlı olabilir.

  • Yalnızca varlığın kendi kaldırılmasını belirtmesini istiyorsunuz.

Her ikisine de sahip olamazsınız. Neden? Çünkü varlığın kendisinden daha yüksek bir düzeydeki kod (aşağıdaki örneklere bakın), o varlığın ne zaman kullanılması gerektiğine karar verir. Sonuç olarak, yalnızca aynı düzeydeki kod, kuruluşunuzun kaldırılmaya uygun olup olmadığını belirleyebilir.

Ancak , olabilecek en yüksek kodun dinlediği bir olayı tetikleyerek işletmenin kendi kaldırılmasını talep edebilmesidir . Bu daha yüksek seviye bu kaldırma talebini bir listede saklar.


Örnek 1: Olaysız

Dünyanızdaki varlıklar arasındaki çarpışmaları kontrol ediyorsunuz. Bu, genellikle her oyunu birbirine karşı kontrol eden ana oyun döngünüzde daha yüksek bir şekilde ele alınır. Bu örnekte spesifik olarak, bir işletme bir başkasıyla çarpıştığında, yalnızca o işletmenin dahili mantığı, ne kadar hasar aldığını ve "süresi dolmuş" olup olmadığını belirleyebilir. Öyleyse dünyanızda A, B, C ve D olmak üzere dört varlığınız olan çarpışmaların mantık akışını takip edelim.

A'yı B ile çarpışma açısından kontrol ediyoruz. Bir çarpışma var. A% 50 hasar alır.

A'yı C ile çarpışma açısından kontrol ediyoruz. Bir çarpışma var. A% 50 hasar alır. Hasar 0'a ulaştığından A, "öldüğünü" belirler. Kendisini listeden çıkarır.

D ile çarpışma için A'yı kontrol ederiz. Çarpışma olmazdı, ama asla o kadar ileri gidemezsiniz: Varlıklar listeniz bir traveral işlemin ortasında değiştirildiği için bir çalışma zamanı istisnası elde edersiniz.

Örnek 2: Olaylarla

Öncekiyle aynı kurulum.

A'yı B ile çarpışma açısından kontrol ediyoruz. Bir çarpışma var. A% 50 hasar alır.

A'yı C ile çarpışma açısından kontrol ediyoruz. Bir çarpışma var. A% 50 hasar alır. Hasar 0'a ulaştığından A, "öldüğünü" belirler. Varlık yönetim koduna "Beni en kısa sürede kaldır" diyen bir olay başlatıyor. Varlık yönetim kodu, etkinliğin bir parçası olarak gönderilen varlık referansına bakar ve bu referansı kaldırılacak varlıklar listesinde saklar.

A'yı D ile çarpışma açısından kontrol ediyoruz. Çarpışma yok ve kontrol gayet iyi çalışıyor.

Şimdi, mevcut oyun döngüsü yinelemesinin en sonunda, kaldırılacak varlıklar listesini çalıştırın ve bunların her birini ana varlıklar listenizden kaldırın.


Bunun sorunu tamamen nasıl önlediğini görebilirsiniz. Olayları kullanmanıza gerek yoktur, sinyaller veya başka bir şey kullanabilirsiniz, ancak prensip aynıdır - güvenli bir şekilde yapana kadar varlıkları kaldırmayın. İşleri temiz ve düzenli tutmak için bu yaklaşımın tersi, eklemek için varlıklarla aynı şeyi yapıyor - bunlara referansları tuttuğunuzdan emin olun ve bunları yalnızca bir sonraki oyun döngüsü yinelemesinin başında ekleyin.

Son olarak, ana varlık listenizde ekleme / kaldırma işlemi yapmak için her kullandığınızda hem kaldırmayı hem de eklenecek listelerinizi temizlemeyi unutmayın.

PS. Bireysel kaldırma işlemleri yapmak için ana listenizi aramaktan korkmayın. Bu, varlık yönetiminin bir parçası ve parselidir ve büyük listeler bile geçiş yapmak için çok hızlı olma eğilimindedir - sonuçta, bunun için tasarlanmıştır.


0

Kesinlikle bir HashMap / HashTable arıyorsunuz . Karma, bir anahtarı belirli bir değerle eşleştiren bir haritadır. Anahtar herhangi bir şey olabilir (Varlık Kimliği gibi).


0

Sanırım smartpointer fikrini sizin için deallocations işlemek için kullanabilirsiniz, bu durumda kodunuzdaki tüm varlıkların bir listesini tutmaya gerek kalmaz.

bazı durumlarda oyununuzdaki tüm nesneleri tekrar edebilmek için bir listeye ihtiyacınız vardır. bu liste basitçe bir nesne eklemeniz ve bu nesnelerden çıkarmanın tam olarak O (1) zaman alacağı bir bağlantı listesi olabilir.

hızınızı daha da artırmak için bazı statik dizi (muhtemelen bir vektör) kullanabilirsiniz. bu durumda, aynı vektör içinde 2 bağlantılı listeyi izlemeniz gerekir, biri geçerli nesneler üzerinde yinelenir, diğeri ise serbest nesneler üzerinde yinelenir. smartpointer silinecek bir yeri işaretlediğinde, yalnızca o işaretçiyi kaldırın ve boş alanlar listesine boşluk ekleyin. ve her varlık eklediğinizde, yalnızca ilk serbest alanı kaldırmanız ve bunu varlık işaretçisiyle doldurmanız ve ardından geçerli nesneler listesine eklemeniz gerekir.

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.