डिजाइन विचार:
मैं उनके ग्राफिक प्रतिनिधित्व से खेल वस्तुओं इनहेरिट की सिफारिश नहीं कर सकते हैं। क्यूं कर? आप एक गेम ऑब्जेक्ट के कई ग्राफ़िक प्रस्तुतियां प्राप्त कर सकते हैं (जैसे गेम व्यू में से एक या मिनीमैप में कोई दूसरा, या जो भी हो)। संबंध "प्लेयर" है-एक 'ग्राफिक प्रतिनिधित्व "है और" प्लेयर "नहीं है-एक' ग्राफिक प्रतिनिधित्व" है। बेहतर समाधान संरचना का उपयोग करना है और विरासत नहीं है। अन्य अच्छा प्रभाव अन्य टकराव का पता लगाने के संभावित encapsulation है यदि आप Qt, decoupling द्वारा प्रदान किए गए एक से खुश नहीं हैं ... सच भी है, कि सरल खेल के लिए यह पर्याप्त हो सकता है।
सरल पर्याप्त तर्क तर्क, विरासत जहां अन्य ऑब्जेक्ट सक्रिय ऑब्जेक्ट पर प्रतिक्रिया करते हैं। किसी भी जटिल खेल यांत्रिकी के लिए शायद बहुत सरल है।
class Asteroid {
public:
virtual void CollideWithPlayer(Player&) { p.loseHealth(100); }
};
class ExplodingAsteroid: Asteroid {
public:
virtual void CollideWithPlayer(Player&) { explode(); p.loseHealth(1000); }
};
संपर्क (अपने दम पर व्यवहार कर कई सक्रिय वस्तुओं) जटिल हो जाता है जब आप अपने वस्तुओं की पहचान करने की आवश्यकता हो सकती हैं:
है RTTI है, लेकिन ईआरएम इसे देख सिफारिश करने के लिए मुश्किल है: How expensive is RTTI? में छोटा: महंगा, बनाए रखने के लिए मुश्किल है।
आप डबल-प्रेषण का उपयोग कर सकते हैं। दो आभासी कॉल का उपयोग कर वस्तुओं की पहचान करता है। समस्याएं: सिंटैक्स का थोड़ा सा, कभी-कभी बनाए रखना मुश्किल होता है (विशेष रूप से जब आप नई ऑब्जेक्ट्स जोड़ते हैं), स्वामित्व की समस्याएं (अधिक देखें)। खेल विकिपीडिया से उदाहरण:
class SpaceShip {};
class GiantSpaceShip : public SpaceShip {};
class Asteroid {
public:
virtual void CollideWith(SpaceShip&) {
cout << "Asteroid hit a SpaceShip" << endl;
}
virtual void CollideWith(GiantSpaceShip&) {
cout << "Asteroid hit a GiantSpaceShip" << endl;
}
};
class ExplodingAsteroid : public Asteroid {
public:
virtual void CollideWith(SpaceShip&) {
cout << "ExplodingAsteroid hit a SpaceShip" << endl;
}
virtual void CollideWith(GiantSpaceShip&) {
cout << "ExplodingAsteroid hit a GiantSpaceShip" << endl;
}
};
आभासी समारोह आईडी
class GameObject() {
virtual getId() { return GAME_OBJECT; }
};
class Asteroid() {
virtual getId() { return ASTEROID; }
};
या एक सदस्य के रूप
class GameObject() {
ID getId() { return id; }
protected:
GameObject(ID id):id(id) {}
private:
ID id;
};
या आईडी के ऑटो प्रारंभ के साथ टेम्पलेट का उपयोग कर (एक छोटे से मन- boggling वाक्य रचना, चलो यह छोड़ दें: ओ)
अब इस तरह के गेम लूप के लिए:
for each object
update by (fixed) time step
detect collisions and resolve them
आप का सामना करेंगे:
स्वामित्व समस्याओं:
खिलाड़ी स्वास्थ्य खो देता है जब क्षुद्रग्रह से मारा जा रहा और क्षुद्रग्रह बाद में नष्ट हो जाता है ..
Asteorid::collideWithPlayer(Player& p) { p.loseHealth(100); this->explode(); }
अब भी विचार
Player::collideWithAsteroid(Asteroid& a) { this->loseHealth(100); a.explode(); }
नतीजा: कोड डुप्लिकेट या अस्पष्ट गेम मैकेनिक्स
गरीब आदमी का समाधान: फोन किसी और मदद करने के लिए: ओ)
Asteorid::collideWithPlayer(Player& p) { resolveCollision(p, *this); }
Player::collideWithAsteroid(Asteroid& a) { resolveCollision(*this, a); }
resolveCollision(Player, Asteroid) { p.loseHealth(100); a.explode(); }
+1। चित्र इसे बेहतर बना देंगे। ;-) –
आपकी व्याख्या के लिए बहुत बहुत धन्यवाद। क्या यह सच है कि सी ++ गेम देव के लिए एक अच्छा विकल्प नहीं है? – amirouche
सी ++ गेम देव आईएमओ के लिए सबसे अच्छे विकल्पों में से एक है। आपकी आवश्यकता होने पर स्मृति पर अधिक नियंत्रण होता है और निम्न स्तर की कॉल तक पहुंच होती है। लेकिन मैं पक्षपाती हूं क्योंकि मैंने सी ++ और जावा को छोड़कर किसी भी चीज़ में गेम बनाने की कोशिश नहीं की। –