Pause mit screen_save

  • Allgemein

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

  • Pause mit screen_save

    Hallo gm-d,

    nachdem die Funktion "sprite/background_create_from_screen" rätselhafter entfernt wurde, versuchte ich ein Pausenmenü mit "screen_save" zu machen.
    Create-event

    GML-Quellcode

    1. screen_save("back.png")
    2. back_pause=sprite_add("back.png",0,false,false,400,240)
    3. file_delete("back.png");
    4. instance_deactivate_all(true);

    und im draw_event zeichne ich dann das Sprite. Am PC funktioniert das herrlich und ich war überglücklich, aber auf dem Handy funktioniert es nicht. Es verzerrt das Bild komplett und zeichnet es falsch etc. Kann mir wer erklären wieso dem so ist? Bzw. wieso funktioniert es am PC, aber nicht auf dem Smartphone? Xorig und Yorig hab ich auch schon mit jeweils 0,0 probiert, hat aber nicht funktioniert. Wieso funktioniert screen_save_part("back.png",view_xview[0],view_yview[0],800,480) bzw. screen_save_part("back.png",view_xview[0],view_yview[0],display_get_width(),display_get_height()) nicht? In meinem Spiel fehlt eigentlich nur noch das Pausenmenü, Sound und etwas balancing... und an dem Pausenmenü sollte es nun wirklich nicht scheitern...

    LG Afroman
  • Ich kann jetzt nur wild vermuten, aber möglicherweise muss sich der GM auf Mobilgeräten anderer API-Funktionen bedienen und die sind entweder Mist oder der GM ist in dieser Hinsicht buggy. Würde mich nicht wundern, wenn bei der ganzen Skaliererei etwas schiefgeht.

    Warum zeichnest du nicht einfach mal alles auf eine Surface und zeigst dann die?
  • versuch es doch so:
    - if !surface-existiert surface-erstellen
    - with(All) -> draw-event

    und dann müsstest du das drawen können, und darüber dann noch das pause menü...
    aber das müsstest du selber schaffen... wenn nicht würds mich schwer verwundern XD.
    Kopiere dies in deine Signatur, um es in deiner Signatur zu haben.
    Achtung: Dieser Beitrag läuft ende des Monats ab, bitte lese ihn noch vor dem Monatswechsel...
    Nach langer zeit wieder im Forum aktiv :D
  • Hallo Larsi,

    sorry für die späte Rückmeldung. (GTA 5, mehr brauch ich nicht sagen) Das Problem liegt daran, das der Room wahrscheinlich zu groß ist! Denn es kommt jedesmal die Fehlermeldung "Stack overflowed" (6200*1500). Ich bin echt ratlos...

    LG Afroman
  • Erstell das Surface nicht mit der Größe des Raumes, sondern mit der Größe der View
    www.glowingorb.de
    „Wenn es im Universum noch irgendwo intelligente Lebewesen gibt, dann kennen sie vielleicht Schach, höchstwahrscheinlich jedoch GO

    (Schachweltmeister Emanuel Lasker)
  • Hallo Glowing Orb,

    Also dadurch das ich noch nie mit Surfaces gearbeitet habe, funktioniert das alles noch immer nicht ganz so, wie es soll. Und zwar beim drücken der Pausen-Taste, erstelle ich ein obj_pause.
    -Create-event-

    GML-Quellcode

    1. alarm[0]=2
    2. surf=surface_create(800,480)

    -Destroy-event-

    GML-Quellcode

    1. surface_free(surf);
    2. instance_activate_all();
    3. instance_destroy();

    -Alarm[0]-event-

    GML-Quellcode

    1. instance_deactivate_all(true)
    2. if (!instance_exists(obj_pause_button_back)){instance_create(view_xview[0]+400-112,view_yview[0]+240+96,obj_pause_button_back)}
    3. if (!instance_exists(obj_pause_button_exit)){instance_create(view_xview[0]+400+112,view_yview[0]+240+96,obj_pause_button_exit)}
    4. if (!instance_exists(obj_pause_button_music)){instance_create(view_xview[0]+400-112,view_yview[0]+240+160,obj_pause_button_music)}
    5. if (!instance_exists(obj_pause_button_sounds)){instance_create(view_xview[0]+400+112,view_yview[0]+240+160,obj_pause_button_sounds)}
    6. sound_stop_all()

    -Draw-event-

    GML-Quellcode

    1. surface_set_target(surf)
    2. if (alarm[0]!=0)
    3. {
    4. with (all)
    5. {
    6. draw_self()
    7. }
    8. }
    9. surface_reset_target();
    10. draw_surface(surf,view_xview[0]+400,view_yview[0]+240)
    11. draw_set_halign(fa_middle)
    12. draw_set_valign(fa_middle)
    13. draw_set_font(font_gameover_headline)
    14. draw_text(view_xview[0]+400,view_yview[0]+240-80,"Pause")
    Alles anzeigen


    Was genau mach ich falsch? Würde mich über jede Hilfe freuen.

    LG Afroman
  • Hallo ihr Beiden,

    Hm...
    Was genau passiert denn bzw nicht?
    Ist so schonmal schwer, da nen Fehler zu finden...

    ERROR in
    action number 1
    of Draw Event
    for object obj_pause:

    Trying to draw non-existing sprite.
    at gml_Object_obj_pause_Draw_0 (line 7) - draw_self()

    Könnte das vielleicht daran liegen, dass es Objekte gibt, die keinen Sprite haben? Aber selbst wenn ich jetzt ignore drücke, geht es weiter, und es wird nix gedrawed... Wie gesagt, ich kenn mich nicht wirklich gut mit surfaces aus...
    Hast du auch das Alarm 0 Event in deinem Objekt?

    Ja

    LG Afroman
  • Versuche das "!=" in Zeile 2 im Draw-Event durch "<=" zu ersetzen. Game Maker rechnet bei den Alarmen nämlich bis -1 und erst dann hört er auf. Das heißt, dass das Surface jedesmal im Draw-Event neu gezeichnet wird, was aber nicht funktioniert, da alle Objekte deaktiviert sind.

    PS: Sry, für den letzten Post. Ich habe überlesen, dass du ein Alarm 0 Event hast :D
  • Hallo kebaplover,
    Versuche das "!=" in Zeile 2 im Draw-Event durch "<=" zu ersetzen. Game Maker rechnet bei den Alarmen nämlich bis -1 und erst dann hört er auf. Das heißt, dass das Surface jedesmal im Draw-Event neu gezeichnet wird, was aber nicht funktioniert, da alle Objekte deaktiviert sind.

    PS: Sry, für den letzten Post. Ich habe überlesen, dass du ein Alarm 0 Event hast :D

    Ok, interessant zu wissen, danke! Es funktioniert ein wenig, wir kommen dem ganzen schon näher :)
    Folgendes... ich habe die Surface jetzt vergrößert, also auf 800*room_height. Jetzt zeichnet er ein paar Sprites auf surface, wenn ich ganz links am Rand bin. Mir kommt es so vor, als ob ich die Surface immer nur mit den X/Y Koordinaten 0/0 erstellen kann. Das nächste ist, dass die Surface immer wieder bemalt wird, dadurch kommen immer mehr Objekte drauf und es wird immer "voller". *murmel* wieso mussten sie die sprite_create_from_screen Funktion rausnehmen. *murmel*

    LG Afroman
  • Ich weiß nicht ob das aktuell ist, aber die GM 6.1 Hilfe empfiehlt Surfaces nicht im Draw-Event zu setzen:

    Du solltest das Zeichen-Ziel nie ändern, sobald du bereits zeichest, d.h. nicht in einem Draw-Event. Dies hätte schwerwiegende Probleme mit der Projektionsmatrix und der Anzeige zur Folge.


    Wenn du einen statischen Pausescreen haben willst wäre es besser wenn du nur einmal (z.B. im Create-Event) das Bild erstellt (und nur vom View) und dieses dann immer benutzt:

    GML-Quellcode

    1. surf = surface_create(view_wview, view_hview);
    2. surface_set_target(surf);
    3. //möglicherweiße hier Surface mit einer Background-Farbe füllen
    4. with (all)
    5. {
    6. if (id != other.id && sprite_exists(sprite_index))
    7. draw_sprite(sprite_index, image_index, x - view_xview, y - view_yview);
    8. }
    9. surface_reset_target();
    10. //Instancen deaktivieren, whatever
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • Hallo henrik1235,

    es funktioniert schon einmal! Von daher, danke. Jetzt gibt es aber noch X-Probleme, da nicht alles Sprites sind. Es gibt Backgrounds, verschiedene Layers, Objekte die verschiedene Sachen drawen usw. Außerdem wird meine Surface immer voller, obwohl ich im destroy event surface_free(); mache. Gibt es eine Möglichkeit, dass ich bei with (all) { execute_drawevent()} z.B: mache? Also das im Prinzip alle Objekte nochmal ihr Draw event auf die Surface zeichnen?

    LG Afroman
  • Du benutzt ja GM:Studio da solltest du doch auch einfach view_surface[0-15] benutzten können,
    zeichne die aktuelle view_surface in deine pausescreen surface

    So ungefähr:

    GML-Quellcode

    1. [create]
    2. surf = surface_create(surface_width(view_surface[0]), surface_height(view_surface[0]));
    3. [draw]
    4. surface_set_target(surf);
    5. draw_clear_alpha(0, 0);
    6. draw_surface(0, 0, view_surface[0]);
    7. surface_reset_target();
    :saint:

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

  • Hallo Tice,

    ja ich benutze Game maker studio, aber sowohl surface_width sowie view_surface[0] existieren nicht. das einzige was ich gefunden habe ist view_surface_id[0], mit der ich die Surface auf den View zeichnen lassen kann... Achja, wenn ich surface_set_target(surf) im Draw event vor dem draw_surface mache, zeichnet er garnichts.

    LG Afroman
  • Es gibt die Funktion event_perform. Damit könntest du das Draw-Event in deinen Objekten ausführen. Beispiel:

    GML-Quellcode

    1. with (all) {
    2. event_perform(ev_draw, ev_draw);
    3. }


    Zu surface_free: Ich denke, dass Game Maker zwar die Surface löscht, aber den Speicher nicht freigibt. Ich würde die Surface einfach lassen und, bevor etwas darauf gezeichnet wird, draw_clear_alpha anwenden.
  • Also um genau zu sein brauchst du nur einmal auf das Surface zu zeichnen, und zwar in dem Moment, wo das Menü aktiviert wird. Das Surface sollte die Größe des Views haben. Zuätzlich musst du bei allem, was du auf das Surface zeichnest, die View Koordinaten abziehen, da das surface ja bei 0,0 beginnt und bei view breite,höhe aufhört, du aber willst, dass die im View befindlichen Objekte drauf sind. Und wie auch schon erwähnt, sollte man nicht im Draw Event auf Surfaces zeichnen, was sich aber eh erledigt, wenn du nur einmal direkt nach dem Erstellen auf das Surface zeichnest.

    © 2008 by Teamgrill Productions
  • Hallo kebaplover,
    event_perform(ev_draw, 0);

    Jo, danke, habe, nachdem du mir diese Funktion gezeigt hast, gleich auf Yoyogames nachgeschaut. Hat aber trotzdem nicht funktioniert.
    Also um genau zu sein brauchst du nur einmal auf das Surface zu zeichnen, und zwar in dem Moment, wo das Menü aktiviert wird. Das Surface sollte die Größe des Views haben. Zuätzlich musst du bei allem, was du auf das Surface zeichnest, die View Koordinaten abziehen, da das surface ja bei 0,0 beginnt und bei view breite,höhe aufhört, du aber willst, dass die im View befindlichen Objekte drauf sind. Und wie auch schon erwähnt, sollte man nicht im Draw Event auf Surfaces zeichnen, was sich aber eh erledigt, wenn du nur einmal direkt nach dem Erstellen auf das Surface zeichnest.

    Hallo MasterXY,
    danke für die Informationen! Ich werde es gleich ausprobieren! Problematiken werden trotzdem vorkommen, aber ich schau mal wie ich das hin bekomme!

    EDIT: Nun gut: Gleiche Probleme bestehen immer noch. Ich bekomme zwar jetzt die Sprites auf die Surface, trotzdem wir die Surface immer voller (draw_set_alpha(0,0) hilft leider nichts). Es gibt noch kleine Probleme mit den Background, welche auch nicht auf die Surface gezeichnet werden (ist klar, ich verwende ja draw_sprite(..,..,x-view_xview,y-view_yview) ) aber darum würde ich mich später kümmern)

    EDIT: Hat sich erledigt, bin draufgekommen! Wenn ich wieder etwas posten darf, schreib ich die Lösung hier nochmal rein :)

    LG Afroman

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Afroman ()