2009-12-09 16 views
7

मैं क्यूटी के साथ एक खेल का निर्माण। मेरे ग्राफिक्ससेन पर प्रत्येक ऑब्जेक्ट्स ग्राफिक्स पिक्समैपइटम (प्लेयर, बाधाएं, बम ...) से प्राप्त होता है। मैं टकराव के प्रभाव को लागू करना चाहता हूं। उदाहरण के लिए जब खिलाड़ी को बोनस हो जाता है तो वह इसे चुन सकता है। क्यूटी ढांचे के साथ मैं कोलिडिंग आइटम प्राप्त कर सकता हूं लेकिन मुझे नहीं पता कि वे किस प्रकार के हैं क्योंकि फ़ंक्शन का उदाहरण नहीं है। कोई सुझाव ?किसी गेम में टक्कर प्रभाव को कैसे कार्यान्वित करें?

संपादित करें: मुझे टकराव "घटना" मिलती है जो मैं करना चाहता हूं वह विभिन्न टकरावों को संभालती है। मैंने बेहतर शब्द के साथ एक और question बनाया।

उत्तर

9

डिजाइन विचार:

मैं उनके ग्राफिक प्रतिनिधित्व से खेल वस्तुओं इनहेरिट की सिफारिश नहीं कर सकते हैं। क्यूं कर? आप एक गेम ऑब्जेक्ट के कई ग्राफ़िक प्रस्तुतियां प्राप्त कर सकते हैं (जैसे गेम व्यू में से एक या मिनीमैप में कोई दूसरा, या जो भी हो)। संबंध "प्लेयर" है-एक 'ग्राफिक प्रतिनिधित्व "है और" प्लेयर "नहीं है-एक' ग्राफिक प्रतिनिधित्व" है। बेहतर समाधान संरचना का उपयोग करना है और विरासत नहीं है। अन्य अच्छा प्रभाव अन्य टकराव का पता लगाने के संभावित 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(); } 
+0

+1। चित्र इसे बेहतर बना देंगे। ;-) –

+0

आपकी व्याख्या के लिए बहुत बहुत धन्यवाद। क्या यह सच है कि सी ++ गेम देव के लिए एक अच्छा विकल्प नहीं है? – amirouche

+2

सी ++ गेम देव आईएमओ के लिए सबसे अच्छे विकल्पों में से एक है। आपकी आवश्यकता होने पर स्मृति पर अधिक नियंत्रण होता है और निम्न स्तर की कॉल तक पहुंच होती है। लेकिन मैं पक्षपाती हूं क्योंकि मैंने सी ++ और जावा को छोड़कर किसी भी चीज़ में गेम बनाने की कोशिश नहीं की। –

4

एक विचार:
विरासत: प्रत्येक वस्तु एक खिलाड़ी के साथ भिड़ना कर सकते हैं एक CollideWithPlayer विधि है कि करता है जो कुछ भी वस्तु उदाहरण के लिए छद्म कोड की तरह की जरूरत है

C++ है

class Item : GameObject { 
public: 
    CollideWithPlayer(Player p); 
} 

class PointBag : Item { 
public: 
    CollideWithPlayer(Player p) { p.points += 5000; } 
} 
1

आप एनवीडिया फिजएक्स या बुलेट जैसी बाहरी लाइब्रेरी का उपयोग कर सकते हैं जो टकराव होने पर कॉलबैक सेट करने देगा। ऐसे पुस्तकालयों का उपयोग करके, जो क्यूटी की टक्कर प्रणाली का उपयोग नहीं करेंगे, इसके बजाय, प्रत्येक फ्रेम आप भौतिकी अनुकरण करेंगे और फिर भौतिकी सिमुलेशन के भीतर अपने राज्य को प्रतिबिंबित करने के लिए ग्राफिक्स पिक्समैप इटिम के गुणों को अपडेट करेंगे।

0

आप निम्नलिखित क्यूटी उदाहरण पर देख सकते हैं: टॉइडिंग चूहे उदाहरण।

यह काफी आसान है और यह आपको क्यूटी के साथ संभालने वाले बुनियादी टकरावों के लिए एक बहुत अच्छा परिचय देगा।

जल्दी संक्षेप, प्रत्येक वस्तु बाउंडिंग बॉक्स है कि आप अंतरिक्ष इसे इस्तेमाल करता है दे देंगे होगा ... तो आप ये बाउंडिंग बॉक्स का उपयोग करेंगे जानना आवश्यक है कि आइटम एक दूसरे के नहीं छू रहे हैं या ...

उम्मीद है की यह मदद करेगा !

+1

http://doc.trolltech.com/4.6/graphicsview-collidingmice.html –

+0

http://web.archive.org/web उत्कृष्ट शोध प्रबंध के लिए /20100409105849/http://doc.trolltech.com/4.6/graphicsview-collidingmice.html – Fuhrmanator

संबंधित मुद्दे