GMOT
Nieuws:
 
*
Welkom, Gast. Alsjeblieft inloggen of registreren. 18 Maart 2019, 17:17:48


Login met gebruikersnaam, wachtwoord en sessielengte


Pagina's: [1]
  Print  
Advertenties


The runesnake
Pretty addicted
*******

Berichten: 3.077


Limieten zijn er om te breken


Bekijk profiel
« Gepost op: 06 April 2016, 22:23:44 »

Hallo allemaal, ik ben na een hele tijd voornamelijk javascript gedaan te hebben, weer bezig met een c++ project. Het lukt me alleen niet goed om object structuren te bouwen zoals ik dat in JS zal doen. Ik loop tegen problemen aan, ik kan bepaalde variables namelijk niet update. Ik zal eerst even proberen de opbouw van het project uit te leggen.

Ik heb 2 classes, een object en een scene:
Code:
class aoObject{
    public:
        bool active = true;
        int id, type, x, y, z;
        aoObject(int _id, int _type){
            id = _id;
            type = _type;
            x = 0;
            y = 0;
            z = 3;
        }
        void move(int _x, int _y, int _z){
            x = _x;
            y = _y;
            z = _z;
        }
};
Code:
class aoScene{
    public:
        vector<aoObject> children;
        void push(aoObject object){
            children.push_back(object);
        }
        aoObject at(int position){
            return children.at(position);
        }
        aoObject* find(int id){
            int i;
                for(i=0; i<size(); i++){
                    aoObject result = at(i);
                        if(result.id==id){
                           return &result;
                        }
                }
        }
        int size(){
            return children.size();
        }
        void render(rsExtendedBuffer* buffer){
            int i;
            for(i=0; i<size(); i++){
                aoObject result = at(i);

                cout << "Render: " << result.x << "_" << result.y << "_" << result.z << "_" <<"\n";

                if(result.active){
                    cout << "render shit";
                    rsGeoPushCubeBasic(buffer->ask(12), 1, result.x, result.y, result.z, 0.5f);
                }else{
                    cout << "norender shit";
                }
            }

            buffer->updateBuffer();
        }
};

De network code die getriggerd wordt bij het maken van een object:
Code:
world.push(aoObject(id, 0));//Hier maak ik het object voor het eerst aan, en push ik hem naar mijn scene (in dit geval heet de scene world)
world.render(&eUnit);//Hier render ik de scene

Nou heb ik een tweede netwerk event waarin het object wil verplaatsen en de scene opnieuw wil renderen:
Code:
aoObject* result = world.find(id);//Pointer na object, hier zal het probleem wel eens kunnen zitten
result->move(0, 0, 2);//Move zal de x, y, z waarden van het object moeten updaten, maar dat doet hij dus niet
cout << "Read: " << result->x << "_" << result->y << "_" << result->z << "_" <<"\n";//Deze lijn code geeft wel de geupdate variables
world.render(&eUnit);//Render opnieuw, maar dan zijn de variables weer zoals ze eerst waren

Het probleem is dat de x, y en z variables van mijn object niet updaten nadat ik de move actie uitvoer na de tweede render event en dus ook mijn scene niet gedrawt wordt. Nou denk ik dat het probleem hem zit in dat ik na een kopie van het object point, en dus het oude object hetzelfde blijft en dat ik daarom de variables niet kan updaten. Ik zie alleen de oplossing niet. Zou iemand me kunnen helpen?

TR
« Laatste verandering: 07 April 2016, 18:33:41 door The runesnake » Gelogd

8 Jaar The RuneSnake!

kaas1
Infinity
*********

Berichten: 19.938


LeesMij.txt


Bekijk profiel
« Antwoord #1 Gepost op: 06 April 2016, 23:51:17 »

Volgens mij denk je goed qua waar het probleem zit, in aoScene.find() doe je "aoObject result = at(i);". Je declaret dus een nieuw object en kopieert daar het object in dat je vindt.
Lijkt me dat je het kan oplossen door direct de pointer van de uitkomst van de at() te nemen, dan wordt het zoiets:
Code:
        aoObject* find(int id){
            int i;
                for(i=0; i<size(); i++){
                    aoObject* resultPointer = &(at(i)); //weet niet zeker of deze haakjes nodig zijn, dus voor de zekerheid...
                        if(resultPointer->id==id){
                           return resultPointer;
                        }
                }
        }
« Laatste verandering: 06 April 2016, 23:53:50 door kaas1 » Gelogd


The runesnake
Pretty addicted
*******

Berichten: 3.077


Limieten zijn er om te breken


Bekijk profiel
« Antwoord #2 Gepost op: 07 April 2016, 14:13:48 »

Hey bedankt voor je antwoord, helaas lost dit het probleem niet op. Ik krijg een error dat een pointer niet naar een tijdelijke class mag wijzen. Ik heb er ook al over nagedacht om in de scene bijvoorbeeld een vector van pointers op te slaan in plaats van een vector van classes, maar dan houd je ook het probleem dat die objecten dan tijdelijk zijn en na een extra cycle hun data niet meer valid is. Heeft iemand enig idee hoe ik dit zal moeten doen?
Gelogd

8 Jaar The RuneSnake!

jw
King of the hill
******

Berichten: 2.172


Mijn naam is Joey


Bekijk profiel WWW
« Antwoord #3 Gepost op: 07 April 2016, 14:28:24 »

Je weet dat c++ niet OO is?
Gelogd


kaas1
Infinity
*********

Berichten: 19.938


LeesMij.txt


Bekijk profiel
« Antwoord #4 Gepost op: 07 April 2016, 14:32:35 »

Maar dat is het wel, onder andere.
Gelogd


The runesnake
Pretty addicted
*******

Berichten: 3.077


Limieten zijn er om te breken


Bekijk profiel
« Antwoord #5 Gepost op: 07 April 2016, 15:18:05 »

Je weet dat c++ niet OO is?
Stiekem wel, ik weet alleen niet hoe ik het moet gebruiken  XD
Gelogd

8 Jaar The RuneSnake!

The runesnake
Pretty addicted
*******

Berichten: 3.077


Limieten zijn er om te breken


Bekijk profiel
« Antwoord #6 Gepost op: 07 April 2016, 18:34:57 »

Oke iedereen, bedankt voor jullie hulp. Ik ben naar uren zoeken op een oplossing gekomen, ik had de object op de heap moeten gooien, met "new", en dan een array van pointers naar de objecten moeten bewaren in de scene, dan werkt het.

TR
Gelogd

8 Jaar The RuneSnake!


Advertenties
Pagina's: [1]
  Print  

 
Ga naar:  

Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines | Smartphoneversie bekijken

Dilber MC Theme by HarzeM