मेरे पास तीन वर्ग हैं जिन्हें मैं अपने खेल के लिए एक साथ जोड़ने की कोशिश कर रहा हूं। मैं इसे बनाने की कोशिश कर रहा हूं ताकि यदि प्लेयर 1 एक विशिष्ट प्रकार की टाइल पर कदम रखे तो प्लेयर 1 का गुरुत्वाकर्षण चर "एक्सेलवाई" लिफ्ट के प्रभाव को प्रदान करने और खिलाड़ी को लंबवत रूप से ऊपर उठाने में बदल जाएगा। एक प्रारंभिक वर्ग ऑब्जेक्ट प्लेयर 1 बनाता है। (केवल एक खिलाड़ी है इसलिए इसे पूरी कक्षा में लागू किया जा सकता है) इसमें CEntity.h और CPlayer.h के लिए CApp.h मुख्य नियंत्रक वर्ग के माध्यम से हेडर फ़ाइलें शामिल हैं। CPlayer क्लास CEntity का चाइल्ड क्लास है। एक्सेल वाई को सार्वजनिक रूप से CEntity में बिना किसी प्रारंभिक मूल्य के फ्लोट के रूप में घोषित किया गया है। जब खिलाड़ी उस प्रकार की टाइल पर होता है तो मैं इसे CPlayer में बदलना चाहता हूं। मैंने टाइल.एच फ़ाइल में एक if स्टेटमेंट क्लॉज डाला है, लेकिन मैं निम्नलिखित कोड का उपयोग करके वैल्यू को एक्सेस और अपडेट नहीं कर सकता हूं? मैंने शुरुआत में डिफ़ॉल्ट क्लास कन्स्ट्रक्टर का उपयोग करके कोशिश की लेकिन नीचे दिए गए फ़ंक्शन के साथ प्रयास किया है।

CTILE.CPP

#include "CTile.h"
#include "CPlayer.h"

CTile::CTile(){

    TileID = 0;

    TypeID = TILE_TYPE_NONE;

    if(TypeID == TILE_TYPE_LIFT){   

        CPlayer::LiftTile(0.75f, 10.0f);
        //CPlayer::AccelY = 0.75f;
        //CPlayer.SpeedY = 2.0; 
    }
}

CPLAYER.H

public:

    CPlayer();

    void LiftTile(float x, float y);

CPLAYER.CPP

void CPlayer::LiftTile(float x, float y){

    SpeedY = x;
    AccelY = y;
}
0
Mr M 6 मई 2011, 19:27

3 जवाब

सबसे बढ़िया उत्तर

आपको अपने सदस्यों तक पहुँचने या इसके सदस्य कार्यों को कॉल करने के लिए किसी वर्ग की वस्तु की आवश्यकता होगी, जब तक कि उस वर्ग में सदस्यों या सदस्य कार्यों को स्थिर घोषित न किया जाए।

CPlayer::LiftTile(0.75f, 10.0f);

केवल तभी काम कर सकता है जब CPlayer::LiftTile() को घोषित किया गया हो

static void CPlayer::LiftTile(float x, float y); in `CPlayer` class

दूसरा तरीका LiftTitle() को CPlayer क्लास का ऑब्जेक्ट बनाकर कॉल करना है, आपको कुछ इस तरह करना होगा:

CTile::CTile()
{
    TileID = 0;

    TypeID = TILE_TYPE_NONE;

    if(TypeID == TILE_TYPE_LIFT)
    {   
        CPlayer obj;
        obj.LiftTile(0.75f, 10.0f);
        //obj.AccelY = 0.75f;  //works if AccelY is declared as public member
        //obj.SpeedY = 2.0;    //works if SpeedY is declared as public member
    }
}
0
Alok Save 6 मई 2011, 19:40
मैं मूल चर घोषणाओं को Entity.h स्थिर में नहीं बना सकता क्योंकि उन्हें जंप फ़ंक्शन के लिए Entity.cpp में हेरफेर किया जाता है। मैंने ऊपर के रूप में CTile.cpp को बदल दिया है, हालांकि यह बाकी कोड codeस्थिर शून्य लिफ्टटाइल (फ्लोट एक्स, फ्लोट वाई) को पसंद नहीं करता है;code CPlayer.h में घोषणा या कार्यान्वयन codeशून्य CPlayer::LiftTile(float x, float y){ SpeedY = x; एक्सेलवाई = वाई; }code कक्षा में
 – 
Mr M
6 मई 2011, 19:57
एम: फिर आपको या तो CPlayer का ऑब्जेक्ट CTile::CTile() के अंदर बनाना होगा या आप Cplayer ऑब्जेक्ट को CTile क्लास के सदस्य के रूप में और फिर CTile() के अंदर रख सकते हैं। कंस्ट्रक्टर आप उस ऑब्जेक्ट का उपयोग LiftTile() को कॉल करने के लिए कर सकते हैं
 – 
Alok Save
6 मई 2011, 20:09
मेरा मानना ​​​​है कि यह मुद्दा सीटीआईएल वर्ग के साथ नहीं बल्कि सीप्लेयर वर्ग के साथ है। CEntity.h के डिफ़ॉल्ट कंस्ट्रक्टर में "AccelY" को सार्वजनिक फ्लोट के रूप में घोषित किया गया है। CPlayer CEntity का चाइल्ड क्लास है। इसलिए यह केवल AccelY को CPlayer (CPlayer::CPlayer) के डिफ़ॉल्ट कंस्ट्रक्टर में पहचानता है। लिफ्टटाइल केवल CPlayer वर्ग में एक अतिरिक्त कार्य है। निष्कर्ष में समस्या यह है कि मुझे लिफ्टटाइल के व्यवहार को सीप्लेयर के डिफ़ॉल्ट कन्स्ट्रक्टर के भीतर दोहराने की जरूरत है, लेकिन केवल तभी जब यह सीटीएल के क्लॉज को पूरा करता है और हर समय नहीं।
 – 
Mr M
6 मई 2011, 20:42

यदि आप AccelY को क्लास एक्सेस स्पेसिफायर के साथ, CPlayer::AccelY के रूप में एक्सेस करना चाहते हैं, तो वेरिएबल को static के रूप में घोषित करने की आवश्यकता है:

class CPlayer {
  static float AccelY;
};
0
iammilind 6 मई 2011, 19:37

यदि आप उपयोग करते हैं तो यह काम करता है

Player1.LiftTile(0.75f, 10.0f);

जैसा कि आपके विशिष्ट खिलाड़ी के लिए फ़ंक्शन को कॉल करता है।

0
Bo Persson 6 मई 2011, 19:45