Grafikverwaltung



  • Hey

    ich bräuchte Hilfe bei der Grafik von einem DungeonSpiel. Im groben besteht die Grafik ja aus Dungeon, Char, Gegner und irgendwelche Gegenstände,Verschönerungen...ich habe mir überlegt für die Umgebung eine eigene Oberfläche zu nehmen in der der Kartenausschnitt gespeichert wird, der gerade sichtbar ist.Hat den Nachteil dass beim Gehen auch das ständig auktualisiert werden muss. Oder ist es eher sinnvoll die ganze Karte in eine Surface zu packen und dann immer nur den entsprechenden Ausschnitt auf die Prim zu blitten? Zu speicherauswendig?
    Weiterhin wollt ich für jede der "Kreaturen" ne eigene Surface einrichten mit den spezifischen Grafiken. Oder isses besser nur die im Speicher zu haben die gerade auf dem Screen zu sehn sind und dann wenn was neues kommt ne neue Surface anlegen?
    Oder vleicht geht das noch einfacher als ich denk..danke für euren Rat!



  • Ich nehme mal an das du DirectDraw benutzt. Du hast nichts dazu geschreiben. Du könntest die Karte mit Tiles aufbauen. Dazu könntest du einen eigenen Clipper programmieren. Der zuerst schaut ob ein Bitmap sichtbar ist. Wenn ja das Bitmap clippt und darstellt.

    Einen eigenen Clipper in DirectDraw

    Wollen wir die Funktion BltFast benutzen (soll ja schneller sein als Blt). Müssen wir einen eigenen Clipper programmieren.

    Vorbereitung.

    lpDSBack->BltFast(x, y, lpSurface, &rect, FLAG);
    

    x..............X-Position
    y..............Y-Position
    lpSurface..Zeiger auf eine DirectDrawSurafce
    &rect........Adresse auf eine Strukturvariable von Type RECT (definition siehe Windows Doku.)

    So das wichtigste was wir hier benötigen ist das rect. Damit können wir der Funktion sagen welchen Teil der Surface es in den Backbuffer blitten soll.
    Doch wie stelle ich fest wie ich welchen Teil blitten muss?
    Das ist wirklich einfach.

    Erst müssen wir prüfen ob das Objekt überhaupt sichtbar ist. Und das kann man so machen:

    if(X kleiner als Bildschirmlänge && X+Länge größer als 0)

    ist diese Bedingung erfüllt muss das Objekt sichtbar sein.
    für Y macht man es genauso

    Beide zusammengefasst könnte so aussehen:

    if(X kleiner als Bildschirmlänge && X+Länge größer als 0 &&
    Y kleiner als Bildschirmlänge && Y+Höhe größer als 0)

    Also wenn die linke Kante (X) kleiner als Bildschirmlänge ist und die rechte Kante (X+Objekt Länge) größer als 0 muss das Objket sichtbar sein.
    Wenn das noch etwas unklar ist macht euch eine Skizze. Zeichne den Bildschirm und ein Rechteck hinein. Schau wie die Kanten stehen wenn das Objekt sichtbar ist.

    Ist das Objekt nicht sichtbar können wir abbrechen. Ist es jedoch sichtbar machen wir so weiter:

    if(x<0) 
    {   // OBJEKT LINKS AUS DEM MONITOR
        rect.left=(x*(-1));
        x=0;
    }
    
    if(x_pos+Objekt Länge > Bildschirmbreite) 
    {   // OBJEKT RECHTS AUS DEM MONITOR
       rect.right=Bildschirmbreite-x;
    }
    
    if(y<0)
    {   // OBJEKT OBEN AUS DEM MONITOR
       rect.top=(y*(-1));
       y=0;
    }
    
    if(y_pos+Objekt Höhe > Bildschirmhöhe) 
    {   // OBJEKT UNTEN AUS DEM MONITOR
        rect.bottom=Bildschirmbreite-y;
    }
    

    Wir prüfen welcher Teil herrausragt und füllen die Struktur rect mit den neuen Ausmaßen für das Bitmap.

    Mit den Informationen die in der Strukur rect gespeichert sind füttern wir jetzt die Funktion BltFast(). Jetzt wird nur der Teil in den Backbuffer kopiert der auch wirklich sichtbar ist.

    lpDSBack->BltFast(x, y, lpSurface, &rect, DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
    


  • OK, der Clipper is nich das Prob, aber für was ich wieviel Oberflächen brauch. Ich informier mich mal über Tiles. Ansonsten bin ich weiterhin für hilfe dankbar.



  • Meine Karte is schon in Quadrate(ca.8x8 Pixel) unterteilt.


Anmelden zum Antworten