Bild eines Raumes speichern

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Bild eines Raumes speichern

    Hallo

    hab ein kleines Problem.
    ich möchte für mein RTS Spiel einen externen Karten-Editor machen.
    Hab bereits ein System um die Position der Objekte in einer Datei zu speichern um sie dann im Spiel zu erstellen.
    Der Hintergund im Spiel sollte aber nicht aus Objekten bestehen weil das Performance frist und ziemlich unnötig ist. Ein Bild reicht.
    Im Editor hab ich Objekte die die einzelnen Bauteile des Hintergrundes als Sprites haben.
    Dadurch kann der spieler sich das Terrain gestallten.
    das Problem ist beim Abspecihern, da die Karte viel größer als der View ist reicht ein screenshot von dem Bildschirm nicht.

    Meine idee war eine surface so groß wie der Raum (3000 * 3000) zu erstellen, dann mit screen_redraw() das ganze Terrain auf die Surface zu zeichnen und diese dann mit surface_save() zu speichern.

    Hiern paar probleme:

    1. mit einer surface 3000 * 3000 scheint es garnicht zu funktionieren, er tut garnichts wenn man versucht solch eine Surface zu speichern :/ Was kann man dagegen tun?

    2. mehr als Test als um es anzuwenden hab ich dann einfach die Größe der Surface verkleinert, ab unter 2000 * 2000 erscheint eine Datei.

    Seltsamer weise ist in dieser nur ein kleienr Ausschnitt, des Hintergunds (etwa die Größe des Schirmes), der Rest ist komplett schwarz.



    Kann mir einer bitte helfen?
    Wär toll, danke im Vorraus :)

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Hm, das hab ich mir schon gedacht :/

    Wie könnte man das lösen?

    Ich hab versucht die view herum zu bewegen, immer einen Screen breit und dann jedes mal screen_redraw() auszuführen, hat leider nur den Unterschied gebracht das jetzt alles schwarz ist :/

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Du müsstes in deinem save event halt die view[0..7]
    die werte ändern damit für einen kurzen augeblick halt der bildschrim größer wird dammit er dann ein screen vom game machen kann und danach halt wieder zu den normalen bzw. vorherigen werten.
    view_wview[0..7]=3000
    view_yview[0..7]=3000
    screen_save("screen.bmp")
    view_wview[0..7]=640 //oder dein Vohrheriger wert
    view_yview[0..7]=480 //oder dein Vohrheriger wert
    :saint:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Tice ()

  • Ok, ich probiers aber speichert er sowas nicht in der Auflösung des Bildschirmes ab?
    Ich meine dann wäre die Qualität ziemlich schlecht..
    Egal, ich meld mich gleich :)


    EDIT: Hab ziemlich gut geraten :/ er hat mir den ganzen Hintergund in das Fenster skalliert. der rest der Datei ist immernoch schwarz und wenn ich das kleine Stück auf die Größe die es haben soll skalier, siehts s****** aus xD



    EDIT2: das mit der With-Schleife wird wohl nichts bringen :/ So wies aussieht speichert er wirklic nichts was nicht grad im Schrim zu sehen ist, wie doof

    Gibt es noch irgendeine andere Möglichkeit ohne Surfaces um das zu machen?

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von DragonGamer ()

  • Hm, weil ich eigentlich nicht alle tiles (die später ziemlich viele werden) auch in das Hauptspiel speichern wollte.
    Zur not könnte ich nur die benötigten extern laden aber das würde bedeuten das jeder drauf Zugriff hat später :/

    Grad ist mir was eingefallen: vieleicht könnte es funktionieren wenn ich mit der Funktion sprite_create_from_surface eine Sprite erstelle und diese abspeichere.
    Sprites werden ja nicht als bmp gespeichert, dadurch müsste die datei kleiner sein.



    Aber ne Frage: warum soll ein einzelnes großes Bild mehr Speicher verbrauchen als viele kleine Bilder die ja auch noch überlappen?

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Grosses Bild: frisst viel Video Speicher weg und wird immer vollständig gezeichnet was die Performance runterzieht.
    Ab einem gewissen Punkt können einige Computer exzessiv grosse sprites einfach nicht mehr zeichenen.
    Tiles: werden oft wiederholt benutzt und verbrauchen deshalb viel weniger Speicher.
    Tiles ausserhalb des Views werden nicht gezeichnet.

    Starcraft speichert die Karten auch nicht als Screenshots ab und das aus gutem Grund.
  • Hm, das das die tiles nicht alle gezeichnet werden hab ich nicht gewusst, wäre ein idee es so zu machen.

    Hab jetzt aber bei der anderen Methode endlich den hauptbug behoben.

    Hätte den Namen der Funktion besser lesen sollen xD
    screen_redraw() heißt nähmlich das er nur den Bildschirm erneut zeichnet, nicht alles im raum.

    Mit MasterXYs idee hats funktionier, danke :thumbsup:

    Aber zum zweiten problem. Warum kann man keine Surfaces in Sprites umwandeln die größer als genau 2000 sind?
    Das ist ja doof :/ es geshiet einfach garnichts, seltsamer weise.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Surfaces verbrauchen VRAM, Speicher von der Grafikkarte.
    Deshalb kann man keine beliebig grossen Surfaces machen, ab einem gewissen Punkt ist einfach Schluss.
    Wie gross eine Surface maximal sein kann -oder wie Viele man machen kann- ist bei jedem Computer unterschiedlich, manche vertragen Surfaces auch gar nicht.

    Deshalb sollte man Surfaces eigentlich auch vermeiden wo es nur geht, wenn möglich.
    Erst recht sollte dein Spiel nicht komplett darauf ausgerichtet sein, eine riesig grosse Surface zu zeichnen.
    Man sollte Surfaces nur sehr sparsam einsetzen.
  • Benutzer online 1

    1 Besucher