Variablen ändern ihren Wert !



  • Hallo Leute,

    folgendes Problem:

    Ich schreibe ein 2D Spiel in C++ und OpenGL.
    Dabei besteht die komplette Welt aus Tiles (kleinen Quadraten).

    Hier der Cpp-Code eines Tiles:

    class DLL_EXPORT Tile
    {
      public:
        Tile();
       ~Tile();
    
        //position auf der 2D Tile-Map
        int  x,y;
    
        //von welchem Typ ist das Tile (Wasser,...)
        int  typ;
    
        //textur dieses Tiles
        Textur textur;
    
        //die beiden Animationen
        int  animation1;
        int  animation2;
    
        //findet eine Kollisionsabfrage mit diesem Tile statt
        bool kollision;
    };
    

    Natürlich initialisiere ich jedes Member der Klasse im Konstruktor!

    Ich habe nun einen kleine TileEditor geschrieben. Wenn man ihn öffnet dann gibt man die Anzahl der Reihen und Spalten des Tiles ein.

    Die Tilemap wird dann als Array aus Tiles erzeugt:

    tilemap = new Tile[anzahl_reihen*anzahl_spalten];
    

    Dann wird noch jedes Feld mit standartwerten belegt.

    Der User des Editors verändert dann Tiletype und ein paar Attribute das funktioniert auch super 😉

    Wenn der User jetzt fertig ist dann drückt er auf Speichern! die komplette Map wird dann mit FWRITE in eine Datei abgespeichert.

    Ich hab hier mal einen Speicherlog einer 2x2 Tilemap:

    ++++Header Info++++
    Tilegroesse: 2 2
    
    ++++Tiles++++++++++
    Position  : 0 0
    Typ       : 0
    Animation1: 300
    Animation2: 0
    Kollision : 0
    
    Position  : 1 0
    Typ       : 0
    Animation1: 300
    Animation2: 0
    Kollision : 0
    
    Position  : 0 1
    Typ       : 0
    Animation1: 300
    Animation2: 0
    Kollision : 0
    
    Position  : 1 1
    Typ       : 0
    Animation1: 300
    Animation2: 0
    Kollision : 0
    

    Soweit auch so gut! Bis jetzt ist alles perfekt!

    Gerendert wird das ganze mit OpenGL indem ich einfach die Position jedes Feldes hernehme und es auf dem Bildschirm darstelle:

    for(int x=0; x<map->BekommeAnzahlReihen()*map->BekommeAnzahlSpalten(); x++)
        {
          //jedes Tile als Panel mit Textur zeichnen
          render->ZeichnePanel(  map->tilemap[x].x*render_kantenlaenge,               map->tilemap[x].y*render_kantenlaenge, 
    render_kantenlaenge,
    render_kantenlaenge, 
    map->tilemap[x].textur);
        }
    

    render_kantenlänge = 40 Pixel (also die Kantenlänge eines Tiles ist 40 Pixel!

    JETZT MUSS, da MEIN SPEICHERLOG JA RICHTIG IST auch beim laden normalerweise alles glatt gehen.

    Das Ladelog sieht perfekterweise genauso wie das Speicherlog aus! Eigentlich müsste ja jetzt, wenn ich meine Map wieder rendern mag auch nix schief gehen.

    Jedoch ist jetzt folgendes:
    Im Ladelog hat ein beliebiges Tile noch die richtige X und Y Koordinate.

    Wenn ich jetzt GENAU das selbe TILE zum rendern hernehme dann steht bei der X und Y KOORDINATE nur noch SCHEISSE DRIN!

    Bsp:

    LADELOG

    Position : 0 0
    Typ : 0
    Animation1: 300
    Animation2: 0
    Kollision : 0

    RENDERLOG

    Position : 21595465 -35146
    Typ : 5465
    Animation1: 865
    Animation2: 0
    Kollision : 0

    Ich nehme aber genau die selben Daten her zum render, die ich auch geladden habe!

    Wo kann der Fehler liegen ?!?!



  • C++ lernen, dann Tiles schreiben.
    Das Problem kannst du bestimmt mit dem Debugger aufspüren.



  • offensichtlich ist entweder der code zum speichern, laden oder rendern der Tiles falsch. Vielleicht solltest du das überprüfen. Zum Beispiel die echte gespeicherte Datei mal anschauen ob da auch die selben Werte drin stehen, die dein log ausgibt.


  • Mod

    wieso machst du nicht einen memory breakpoint, das waere doch das erste was man beim debuggen in dem fall macht.



  • rapso schrieb:

    wieso machst du nicht einen memory breakpoint, das waere doch das erste was man beim debuggen in dem fall macht.

    👍

    Ich hab das zwar schon ein paar mal gemacht, aber ich denke viel zu selten an diese Möglichkeit.
    Memory-Breakpoints FTW!



  • Danke für eure Antworten,

    aber ich habe das ganze selber lösen können.

    Beim Map-Speichern ging alles glatt! Das sagt mein Log ja auch.

    Beim laden benutze ich mehrmals die funktion:

    fread(...);

    Beim lesen muss ja logischerweise die größe des Datenblocks angegeben werden, welche gelesen werden soll. Da ich Die texturen auch aus meiner einzigen mapdatei lade, muss ich pixeldaten lesen.

    fread(..., 3*textur.width*textur.height....); funktioniert nicht!

    int size = 3*textur.width*textur.height;

    fread(..., size....); funktioniert komischerweise?!?!

    fread kann also im Parameterbereich diese zahl komischerweise nicht korrekt berechnen. Wenn ich meine größe die ich lesen mag jedoch vorberechne und in einer variable speichere, dann funktioniert alles. Komisch, aber jetzt funktioniert es 😉



  • Warum benutzt du nicht einfach C++ Filestreams?


  • Mod

    es klingt echt als wuerdest du den debugger meiden, da koenntest du nach 1min den fehler und den grund fuer den fehler finden.


Anmelden zum Antworten