Umarım bu haydutlar sorumu açıklığa kavuşturacaklardır - yine de alışkanlık olup olmadıklarını tamamen anlarım, bu yüzden durumun bu olup olmadığını bana bildirin ve kendimi daha net hale getirmeye çalışacağım.
Nesne yönelimli oyun geliştirme ile tanışmak için yaptığım çok basit bir oyun olan BoxPong ile tanışın . Topu kontrol etmek ve sarı şeyler toplamak için kutuyu sürükleyin.
BoxPong yapmak, diğer şeylerin yanı sıra temel bir soru formüle etmeme yardımcı oldu: Birbirlerine "ait olmak" zorunda kalmadan birbirleriyle etkileşen nesneler nasıl olabilir? Başka bir deyişle, nesnelerin hiyerarşik değil, bir arada var olmalarının bir yolu var mı? (Aşağıda daha ayrıntılı olarak açıklayacağım.)
Var olan nesneler sorununun ortak bir sorun olduğundan şüpheleniyorum, umarım bunu çözmek için yerleşik bir yol vardır. Kare tekerleği yeniden icat etmek istemiyorum, bu yüzden aradığım ideal cevap "işte probleminizi çözmek için yaygın olarak kullanılan bir tasarım deseni" dir.
Özellikle BoxPong gibi basit oyunlarda, aynı seviyede var olan bir avuç nesne olduğu veya olması gerektiği açıktır. Bir kutu var, bir top var, bir koleksiyon var. Nesneye yönelik dillerde ifade edebileceğim tek şey - ya da öyle görünüyor ki - katı HAS-A ilişkileri. Bu üye değişkenler aracılığıyla yapılır. Sadece başlayamıyorum ball
ve onun işini yapmasına izin veremem , kalıcı olarak başka bir nesneye ait olması gerekiyor . Öyle ana oyun nesne o kadar kurdum sahip bir kutu ve bunun sonucunda da kutu vardır bir topu ve sahip bir skor sayacı. Her nesnenin ayrıca birupdate()
Ben tüm çocukların güncelleme yöntemlerini çağırır ana oyun nesnenin güncelleme yöntemini çağırmak ve onlar da tüm güncelleme yöntemleri çağırmak: vb pozisyon, yön hesaplar ve orada da benzer bir yol yöntem, onların çocukları. Nesneye yönelik bir oyun yapmanın tek yolu bu, ama bunun ideal yol olmadığını hissediyorum. Sonuçta, topu tam olarak kutuya ait olarak düşünmüyorum, aksine aynı seviyede olmak ve onunla etkileşime girmek olarak düşünürdüm. Bunun, tüm oyun nesnelerini ana oyun nesnesinin üye değişkenlerine dönüştürerek elde edilebileceğini düşünüyorum, ancak bunu hiçbir şeyin çözdüğünü görmüyorum. Yani ... bariz karmaşayı bir kenara bırakarak, topun ve kutunun birbirini tanıması , yani etkileşmesi için nasıl bir yol olurdu ?
Birbirlerinden bilgi aktarması gereken nesneler de var. Neredeyse tüm RAM'e her zaman erişebileceğiniz SNES için kod yazma konusunda biraz deneyimim var. Süper Mario Dünyası için özel bir düşman oluşturduğunuzu ve Mario'nun tüm madeni paralarını kaldırmasını istediğinizi varsayalım, o zaman sıfır $ 0DBF adresinde saklayın, sorun değil. Düşmanların oyuncunun durumuna erişemediğini söyleyen bir sınırlama yoktur. Sanırım bu özgürlükten şımarık oldum, çünkü C ++ ve benzerleri ile sık sık kendimi başka bir nesneye (hatta küresel) erişilebilen bir değer haline getirmeyi merak ediyorum.
BoxPong örneğini kullanarak, topun ekranın kenarlarından sekmesini istersem ne olur? width
ve sınıfın height
özellikleridir Game
,ball
bunlara erişebilmek için. Bu tür değerleri aktarabilirim (ya yapıcılar ya da ihtiyaç duydukları yöntemler aracılığıyla), ama bu sadece bana kötü uygulama çığlık atıyor.
Sanırım asıl sorun, birbirlerini tanımak için nesnelere ihtiyacım var, ama bunu yapabilmemin tek yolu çirkin ve pratik olmayan katı hiyerarşi.
C ++ 'da "arkadaş sınıfları" duydum ve nasıl çalıştığını biliyorum, ama eğer hepsi bir çözüm, o zaman nasıl friend
her tek C ++ projesinin üzerine dökülen anahtar kelimeler görmüyorum ve nasıl kavramı her OOP dilinde mevcut değil mi? (Aynısı yakın zamanda öğrendiğim fonksiyon göstergeleri için de geçerli.)
Her türlü cevap için şimdiden teşekkürler - ve yine, size mantıklı olmayan bir parça varsa, bana bildirin.