मैं निम्नलिखित कोड मिल गया है, ग में लगता है कि सरल शूटर ++:गेम ऑब्जेक्ट पदानुक्रम मॉडल करने का सबसे सुरुचिपूर्ण और कुशल तरीका क्या है? (डिजाइन परेशान)
इस के साथ// world.hpp
//----------
class Enemy;
class Bullet;
class Player;
struct World
{
// has-a collision map
// has-a list of Enemies
// has-a list of Bullets
// has-a pointer to a player
};
// object.hpp
//-----------
#include "world.hpp"
struct Object
{
virtual ~Object();
virtual void Update() =0;
virtual void Render() const =0;
Float xPos, yPos, xVel, yVel, radius; // etc.
};
struct Enemy: public Object
{
virtual ~Enemy();
virtual void Update();
virtual void Render() const;
};
// Bullet and Player are similar (they render and update differently per se,
/// but the behavior exposed to World is similar)
// world.cpp
//----------
#include "object.hpp"
// object.cpp
//-----------
#include "object.hpp"
दो समस्याओं:
1, खेल वस्तुओं अन्य खेल वस्तुओं के बारे में जानते हुए भी।
ऐसी सभी सुविधाएं हैं जो सभी वस्तुओं के बारे में जानती हैं। यह सभी ऑब्जेक्ट्स का पर्दाफाश करना पड़ सकता है या नहीं, इसे एक्वाइयर (स्थिति, एक के लिए) के मानकों के आधार पर इसमें से कुछ को बेनकाब करना होगा। यह सुविधा दुनिया माना जाता है।
ऑब्जेक्ट्स को टकराव की जानकारी और अन्य वस्तुओं के लिए पूछने के लिए, वे दुनिया के बारे में जानना है।
यह एक निर्भरता पेश करता है जहां ऑब्जेक्ट्स और विश्व के कार्यान्वयन दोनों को ऑब्जेक्ट के शीर्षलेख तक पहुंच प्राप्त होती है, इस प्रकार दुनिया में object.hpp (जो बदले में world.hpp शामिल है) के बजाय सीधे अपना हेडर शामिल नहीं करेगा। यह मुझे असहज महसूस करता है - मुझे नहीं लगता कि world.cpp को ऑब्जेक्ट में बदलाव करने के बाद recompile करना चाहिए.hpp। दुनिया ऐसा महसूस नहीं करती है कि इसे ऑब्जेक्ट के साथ काम करना चाहिए। यह खराब डिजाइन की तरह लगता है - इसे कैसे ठीक किया जा सकता है?
2, पॉलिमॉर्फिज्म - कोड पुन: उपयोग और गेम इकाइयों के तार्किक समूह (और कैसे) से परे किसी भी चीज़ के लिए इसका उपयोग किया जाना चाहिए?
दुश्मन, बुलेट और प्लेयर अपडेट और प्रस्तुत करेंगे, निश्चित रूप से, इसलिए वर्चुअल अपडेट() और रेंडर() कार्यक्षमता - एक समान इंटरफ़ेस। उन्हें अभी भी अलग सूचियों में रखा गया है और इसका कारण यह है कि उनकी बातचीत इस बात पर निर्भर करती है कि दो इंटरैक्टिंग ऑब्जेक्ट्स कौन से हैं - दो दुश्मन एक दूसरे से उछालते हैं, बुलेट और दुश्मन एक-दूसरे को नष्ट कर देते हैं।
यह कार्यक्षमता है यह दुश्मन और बुलेट के कार्यान्वयन से परे है; यह मेरी चिंता नहीं है। मुझे लगता है कि उनके समान इंटरफेस से परे एक कारक है जो दुश्मन, बुलेट और खिलाड़ियों को अलग करता है और यह किसी अन्य तरीके से व्यक्त किया जा सकता है, जिससे मुझे उन सभी के लिए एक सूची बनाने की इजाजत मिलती है - क्योंकि उनका इंटरफ़ेस समान है!
समस्या यह है कि एक ही सूची में मौजूद किसी ऑब्जेक्ट श्रेणी को किसी अन्य से कैसे बताना है। टाइपिड या प्रकार की अन्य प्रकार की पहचान प्रश्न से बाहर है - लेकिन फिर इसे करने का दूसरा तरीका क्या है? या शायद दृष्टिकोण के साथ कुछ भी गलत नहीं है?
के लिए धन्यवाद पहले दो पैराग्राफ; यह बहुत समझ में आता है और मेरे सिर को साफ़ करने में मदद करता है। मैंने पॉलिमॉर्फिज्म के साथ क्या करना चाहता था उसे स्पष्ट करने के लिए अपने प्रश्न को फिर से लिखा है। – zyndor
विज़िटर पैटर्न अद्भुत है, इसे इंगित करने के लिए धन्यवाद। मुझे लगता है कि OnHit() विधियों पैटर्न और ऑब्जेक्ट्स की विज़िट() विधि के समान हैं, उनके स्वयं के विज़िटर होंगे, है ना? – zyndor
सर्वश्रेष्ठ के रूप में स्वीकार करने का उत्तर चुनना मुश्किल हो गया है, क्योंकि उनमें से सभी अच्छे अंक के साथ आए थे, लेकिन उनमें से कोई भी वास्तव में पूरे दौर में नहीं था। मुझे लगा कि ऑब्जेक्ट-वर्ल्ड इंटरैक्शन के बारे में डिज़ाइन रूपरेखा सबसे उपयोगी जानकारी थी और मेरे प्रश्न के लिए सबसे प्रासंगिक थी। - – zyndor