Problem mit structuren ...



  • hallo ich habe vor das sonnensystem mal nach zu basteln... ich habe alle bahnen der planeten mit kreisen dargestellt und darauf will ich dann die planeten kreisen lassen... ich will dies mit einer struct loesen.

    struct planet {
    
        float pradius;          // radius des planeten
        float erot;             // eigene rotations geschwindigkeit
        float posx;             // wird benötigt um die kreisbahn zu berechnen
        float posy;             //                - " -
        float weite;           // entfernug zur sonne
        double dGrad;            // gibt den winkel zur sonne auf der äquatorialebene an
        int geschw;             // bahnengeschwindigkeit
    
    } merkur, venus, erde, mars, jupiter, saturn, uranus, neptun, pluto;
    

    und dann eine funktion fuer jeden planeten machen....

    GLUquadricObj *pmerkur, *pvenus, *perde, *pmars, *pjupiter, *psaturn, *puranus,
                  *pneptun, *ppluto;
    
    void LoadPlanetMerkur() {
    
        pmerkur = gluNewQuadric();
        gluQuadricNormals( pmerkur, GL_SMOOTH );
        gluQuadricTexture( pmerkur, true );
        gluQuadricDrawStyle( pmerkur, GL_FILL );
        glColor3ub( 0, 0, 255 );
    
        merkur.pradius = 0.45f;
        merkur.weite = 12.8f;
        merkur.geschw = 52;
    
        if( merkur.dGrad <= 360.0f ) {
    
            if( merkur.dGrad == 360.0f ) {
    
                merkur.dGrad = 0.0f;
            }
    
            merkur.posy = merkur.weite * sin( merkur.dGrad );
            merkur.posx = merkur.weite * cos( merkur.dGrad );
    
            glTranslatef( merkur.posx, merkur.posy, 0.0f );
            gluSphere( pmerkur, merkur.pradius, 40.0f, 40.0f );
    
            merkur.dGrad += 0.025f;
            Sleep( merkur.geschw );
    
            glLoadIdentity();
        }
    
    }
    
    void LoadPlanetVenus() {
    
        pvenus = gluNewQuadric();
        gluQuadricNormals( pvenus, GL_SMOOTH );
        gluQuadricTexture( pvenus, true );
        gluQuadricDrawStyle( pvenus, GL_FILL );
        glColor3ub( 0, 255, 0 );
    
        venus.pradius = 0.7f;
        venus.weite = 17.8f;
        venus.geschw = 65;
    
        if( venus.dGrad <= 360.0f ) {
    
            if( venus.dGrad == 360.0f ) {
    
                venus.dGrad = 0.0f;
            }
    
            venus.posy = venus.weite * sin( venus.dGrad );
            venus.posx = venus.weite * cos( venus.dGrad );
    
            glTranslatef( venus.posx, venus.posy, 0.0f );
            gluSphere( pvenus, venus.pradius, 40.0f, 40.0f );
    
            venus.dGrad += 0.025f;
            Sleep( venus.geschw );
    
            glLoadIdentity();
        }
    
    }
    

    das problem ist das der erste planet also merkur gezeichnet wird und auch auf seiner bahn verlaeuft doch der naechste vernus... wird nicht gezeichnet... wieso nicht??? ist etwas nicht richtig????

    fuer hilfe bin ich dnakbar...



  • Dieser Thread wurde von Moderator/in flenders aus dem Forum WinAPI in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Sleep( merkur.geschw );
    

    sollen das einzelne threads sein, oder wie?
    zeig mal den code der das effektive rendering ausloesen soll.
    warum passiert das ueberhaupt in "LoadPlanet" ?
    alles 'n bischen merkwuerdig.

    if( venus.dGrad == 360.0f )
    

    das waere aber schon grosses glueck...



  • das is die DrawGl() funktion

    int DrawGL() {
    
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
        glLoadIdentity();
    
        glTranslatef( 0.0f, 0.0f, zoom);
        glRotatef( -45.0f, 1.0f, 0.0f, 0.0f );
    
        GLUquadricObj *sonne;
        sonne = gluNewQuadric();
        gluQuadricNormals( sonne, GL_SMOOTH );
        gluQuadricDrawStyle( sonne, GL_FILL );
        glColor3ub( 255, 0, 0 );
        gluSphere( sonne, 7.0f, 40.0f, 40.0f );
    
        LoadBahnen();
        LoadPlaneten();
    
        return 0;
    }
    

    das die wo die planeten entstehen

    #ifndef planeten_h
    #define planeten_h
    
    void LoadPlaneten();
    
    struct planet {
    
        float pradius;          // radius des planeten
        float erot;             // eigene rotations geschwindigkeit
        float posx;             // wird benötigt um die kreisbahn zu berechnen
        float posy;             //                - " -
        float weite;           // entfernug zur sonne
        double dGrad;            // gibt den winkel zur sonne auf der äquatorialebene an
        int geschw;             // bahnengeschwindigkeit
    
    } merkur, venus, erde, mars, jupiter, saturn, uranus, neptun, pluto;
    
    GLUquadricObj *pmerkur, *pvenus, *perde, *pmars, *pjupiter, *psaturn, *puranus,
                  *pneptun, *ppluto;
    
    void LoadPlanetMerkur() {
    
        pmerkur = gluNewQuadric();
        gluQuadricNormals( pmerkur, GL_SMOOTH );
        gluQuadricTexture( pmerkur, true );
        gluQuadricDrawStyle( pmerkur, GL_FILL );
        glColor3ub( 0, 0, 255 );
    
        merkur.pradius = 0.45f;
        merkur.weite = 12.8f;
        merkur.geschw = 52;
    
        if( merkur.dGrad <= 360.0f ) {
    
            if( merkur.dGrad == 360.0f ) {
    
                merkur.dGrad = 0.0f;
            }
    
            merkur.posy = merkur.weite * sin( merkur.dGrad );
            merkur.posx = merkur.weite * cos( merkur.dGrad );
    
            glTranslatef( merkur.posx, merkur.posy, 0.0f );
            gluSphere( pmerkur, merkur.pradius, 40.0f, 40.0f );
    
            merkur.dGrad += 0.04f;
            Sleep( merkur.geschw );
    
            glLoadIdentity();
        }
    
    }
    
    void LoadPlanetVenus() {
    
        pvenus = gluNewQuadric();
        gluQuadricNormals( pvenus, GL_SMOOTH );
        gluQuadricTexture( pvenus, true );
        gluQuadricDrawStyle( pvenus, GL_FILL );
        glColor3ub( 0, 255, 0 );
    
        venus.pradius = 0.7f;
        venus.weite = 17.8f;
        venus.geschw = 65;
    
        if( venus.dGrad <= 360.0f ) {
    
            if( venus.dGrad == 360.0f ) {
    
                venus.dGrad = 0.0f;
            }
    
            venus.posy = venus.weite * sin( venus.dGrad );
            venus.posx = venus.weite * cos( venus.dGrad );
    
            glTranslatef( venus.posx, venus.posy, 0.0f );
            gluSphere( pvenus, venus.pradius, 40.0f, 40.0f );
    
            venus.dGrad += 0.025f;
            Sleep( venus.geschw );
    
            glLoadIdentity();
        }
    
    }
    
    void LoadPlaneten() {
    
        LoadPlanetMerkur();
        LoadPlanetVenus();
    
    }
    
    #endif
    


  • soweit ich weiss sind doch nun die beiden planeten 2 verschiedene von einander unabhaengige Objecte oder??? aber trotzdem wird nur der erste der aufgerufen wird geyeichnet wieso?



  • Vielleichtwird es auch gezeichnet, aber du siehst es nicht? f'`8k

    Autocogito

    Gruß, TGGC (\-/ has leading)



  • wie kommst du darauf???



  • Erstmal ist es ein Zeichen von schlechtem Design, wenn du mehrere fast identisch Funktionen hast - schonmal etwas von "Parameter" gehört?

    Zweitens: Was macht die Funktion glLoadIdentity(), die du am Ende der LoadXXX()-Funktionen aufrufst? Ich tippe auf eine Endlosschleife oder -rekursion, aus der du nicht mehr rauskommst (Venus wird erst geladen, wenn Merkur fertig ist). Außerdem solltest du deine Arbeit trennen in Laden (und Initialisieren) der Planeten und Zeichnen ALLER vorhandenen Planeten - ist vielleicht übersichtlicher.



  • Das Design is echt recht fürn Arsch und wird in totalem Copy&Paste enden, bis du dich dann letztlich entschließt es wegzuwerfen weil es total vermurkst ist ^^:

    Erstmal mach eine Klasse Planet, statt ein Struct, eine Methode und ein GLUquadricObj, die Dinge gehören zusammen und globale Variablen macht man in der Regel eh nicht.

    Dann machst du das Ganze zeitgesteuert, also die Position von einem Zeitwert abhängig, so das du so oft durch die Methode laufen kannst wie es der Rechner hergibt, Framebremsen sind böse.
    Mit Sleep hast du eh das Problem nicht die Arbeitszeit des Rechners mit einzukalkulieren, selbst wenn du jeden Planeten in einen Extra Thread packst.

    Dann speicherst du die Planeten noch in einer Liste und rufst im Programm in einer Schleife immer ein Idle für alle Planeten auf, mit der aktuellen Zeit

    Ich würds etwa so machen, das ist dann sehr leicht wartbar und lesbar, modular und flexibel:

    struct planet_data {
    
        planet_data(float pradius .....){this->pradius = pradius ....}
    
        float pradius;          // radius des planeten
        float erot;             // eigene rotations geschwindigkeit
        float posx;             // wird benötigt um die kreisbahn zu berechnen
        float posy;             //                - " -
        float weite;           // entfernug zur sonne
        double dGrad;            // gibt den winkel zur sonne auf der äquatorialebene an
        int geschw;             // bahnengeschwindigkeit
    
    };
    
    class Planet : private planet_data
    {
      private:  // wenn du es noch ändern willst
    
      GLUquadricObj* qobj; 
    
      void init( planet_data& data )
      {
        // hier dein Load rein mit data... ...
        // Werte dann gleich in Planet  speichern
        // Extra Methode und nicht in Konstruktor, falls du es nochmal in voller
        // Fahrt ändern willst(Todesstern kommt und macht bumm Planet etc, du
        // willst n paar Millionen Jahre vorscrollen usw), dann aba das alte qobj 
        // löschen bevor neues angelegt wird.
      }
    
      public:
    
      Planet( planet_data& data )
      {
        init_planet(data);
    
      } 
    
      void Idle(long long time)
      {
        // position = time%umlaufdauer etc
      }
    
    };
    
    int main(void)
    { 
    
      std::list<Planet*> planets;
    
      planets.push_back(new Planet(planet_data(1,2,3,2,1,2,3,4) );  // Erde
      planets.push_back(new Planet(planet_data(1,2,3,4,1,2,3,4) );  // Mars
      planets.push_back(new Planet(planet_data(1,2,3,2,1,2,3,4) );  // Bounty
    
      while(programm ende)
      {
        long long time = gettimebla; // halt Zeit in ms oder so auslesen, gibts diverse Sachen für 
    
        for(iterator<Planet*> pit = planets.begin(); pit++; pit < planets.end())
        {
          (*pit)->Idle(time);
        }
    
        // hier kannst dann alles mögliche weitere zeichnen etc
      }
    
        // hier dann brav alles wieder löschen aus planets 
        for(iterator<Planet*> pit = planets.begin(); pit++; pit < planets.end())
        {
          delete *pit;
        }
    
      return 1;
    }
    


  • T0bi schrieb:

    wie kommst du darauf???

    Weil ich den Zeichenaufruf gelesen hab. f'`8k

    Gruß, TGGC (\-/ has leading)


Anmelden zum Antworten