Bestimmte Dinge im Code auslagern



  • Ich habe folgenden Code welcher problemlos funktioniert.

    #include "stdafx.h"
    #include "x2.h"
    #include <xors3d.h>
    #include <iostream>
    
    int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    {
       xGraphics3D(800, 600, 32, false, true);
       int camera = xCreateCamera();
       xPositionEntity(camera, 0, 70, 400);
       int light = xCreateLight();
       xPositionEntity(light, 0, 100, 0);
       int ent = xLoadMesh("media/F.3DS");
       xPositionEntity(ent, 0, 40, 0);
       xTurnEntity(camera, 20, 180, 0);
       int lvl = xLoadMesh("media/t3.3DS");
       xPositionEntity(lvl, 0, 0, 0);
       while(!xKeyDown(KEY_ESCAPE))
       {
          if(xKeyDown(KEY_DOWN))
    	  {
    		  xMoveEntity(ent,0,0,1);
    
    	  }
    	  if(xKeyDown(KEY_UP))
    	  {
    		  xMoveEntity(ent, 0, 0, -1);
    	  }
    
          xRenderWorld();
          char fpsBuffer[129];
          sprintf(fpsBuffer, "FPS: %i", xGetFPS());
          xText(10, 10, fpsBuffer);
          xFlip();
       }
       return 0;
    }
    

    Ich möchte aber den Teil beispielsweise:

    if(xKeyDown(KEY_DOWN))
    	  {
    		  xMoveEntity(ent,0,0,1);
    
    	  }
    	  if(xKeyDown(KEY_UP))
    	  {
    		  xMoveEntity(ent, 0, 0, -1);
    	  }
    

    in eine Funktion auslagern.
    Man könnte sie zum Beispiel "Movement" nennen.

    Ich hatte lange nix mit c++ zu tun und will mich wieder einarbeiten.
    Erinnere mich aber noch daß das auslagern in eine Funktion damals zu Problemen führte.

    Auch gerade zu Beginn des Codes wo mittels xLoadMesh Modelle geladen werden, würde ich gern in eine seperate Sektion packen, da dies dann übersichtlicher und einfacher wäre.

    Hatte mal irgendwas von Klassen gelesen bzw. dazu mal einen Tip bekommen.

    Vielleicht kann mir ja jemand dabei helfen und einen Tip geben.

    Vielen Dank



  • Mein Tipp: Wenn du etwas einigermaßen vernünftiges fabrizieren willst, nimm ein Buch. Für diesen Code ist natürlich nicht gleich eines notwendig. Bei Funktionen sehe ich hier kein Problem, du musst für den angegebenen Codeteil lediglich ent als Parameter mit übergeben. Über Klassen gibt es bestimmt genug Artikel, mit ihnen kannst du einen bestimmten Sachzusammenhalt und Funktionen zusammenfassen. Beispiel: Informationen über eine Spielfigur, ein Objekt auf der Anzeige, eine Codezeile in einem Compiler, Herstellerangaben über ein Auto, usw.



  • hmmm okay...
    ich glaube es gab damals auch ein Problem, daß ich sozusagen eben solche funktionen in externen include dateien auslagern wollte, aber beim includieren ja dem compiler die erst später bekanntwerdenden neuen funktionen(xors3d) gestört haben.

    ich teste das heut nacht nochmal, weil das schon ein paar monate her ist, und es nicht mehr so genau in erinnerung habe.





  • danke sehr schonmal...

    hab jetzt mal das probiert...

    die include datei

    void movement(int enti)
    {
    	 if(xKeyDown(KEY_DOWN))
    	  {
    		  xMoveEntity(ent,0,0,1);
    
    	  }
    	  if(xKeyDown(KEY_UP))
    	  {
    		  xMoveEntity(ent, 0, 0, -1);
    	  }
    }
    

    und die cpp

    #include "stdafx.h"
    #include "x2.h"
    #include <xors3d.h>
    #include <iostream>
    #include "movement.h"
    
    int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    {
       xGraphics3D(800, 600, 32, false, true);
       int camera = xCreateCamera();
       xPositionEntity(camera, 0, 70, 400);
       int light = xCreateLight();
       xPositionEntity(light, 0, 100, 0);
       int ent = xLoadMesh("media/F.3DS");
       xPositionEntity(ent, 0, 40, 0);
       xTurnEntity(camera, 20, 180, 0);
       int lvl = xLoadMesh("media/t3.3DS");
       xPositionEntity(lvl, 0, 0, 0);
       while(!xKeyDown(KEY_ESCAPE))
       {
          movement(int ent);
    
          xRenderWorld();
          char fpsBuffer[129];
          sprintf(fpsBuffer, "FPS: %i", xGetFPS());
          xText(10, 10, fpsBuffer);
          xFlip();
       }
       return 0;
    }
    

    ent - nicht deklarierter bezeichner, da logischerweise ent noch nicht bekannt ist beim includieren.

    natürlich kann ich alles nacheinander schreiben, aber der übersicht halber würd ichs gern so lösen.

    ich schau mir dann später deinen link an bzw. lese mir das alles durch, wäre aber nett, wenn mir diesbezüglich also zu meinem problem schonmal eine hilfe geben könnte.



  • EIN BUCH IST HIER DAS EINZIG WAHRE!
    1. das ist das von meinem Link: Nur "void movement(int enti);" und möglichst noch Include Guards kommen in den Header, das was bei dir im Header steht, kommt auch ins Sourcefile.
    2. Dann bekommt deine Funktion die Variable "enti", die den Inhalt von ent in der main()-Funktion enthält. Also verwende auch "enti" statt "ent" in der Funktion.
    3. Der Aufruf muss movement(ent) und nicht movement(int ent) lauten.



  • hab das inzwischen alles hinbekommen...
    aber warum funktionen nicht in den header?
    ist doch übersichtlicher.

    spricht irgendwas dagegen?



  • itmagic schrieb:

    spricht irgendwas dagegen?

    Unter anderem die Übersichtlichkeit. Im Weiteren vor allem Compilezeit-Abhängigkeiten und damit auch benötigte Kompilierzeit.

    http://www.c-plusplus.net/forum/282989



  • Also die Compilierzeit ist ja nicht so tragisch wenn das paar sekunden länger dauert.
    Aber ich würde eher denken, daß ich wenn die alle Funktionen in einer extra Datei habe, es doch eher der Übersichtlichkeit dient, bzw. kann man so verschiedene includes haben, wo man eben jeweils bestimmte dinge ausführen läßt, eben wie beispielsweise die funktionen.



  • itmagic schrieb:

    Also die Compilierzeit ist ja nicht so tragisch wenn das paar sekunden länger dauert.

    Bei kleinen Projekten können es Sekunden sein, aber die Zeit steigt natürlich mit der Projektgrösse.

    Es geht hierbei nicht primär um den Code der Funktionen selber, der macht nur einen kleinen Teil aus. Viel wichtiger sind andere Dateien, die von diesem Code benötigt werden. Stehen die Funktionsdefinitionen im Header, führt das zu weiteren Include-Direktiven, welche für den Client gar keinen Nutzen haben, aber in sämtliche Client-Implementierungsdateien, die den Header benutzen, ebenfalls eingebunden werden.

    Es kann also schon mehr ausmachen als ein paar Sekunden.

    itmagic schrieb:

    bzw. kann man so verschiedene includes haben, wo man eben jeweils bestimmte dinge ausführen läßt, eben wie beispielsweise die funktionen.

    Ich verstehe nicht ganz, was du damit sagen willst.


Anmelden zum Antworten