Surface verhindert das Zeichnen

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

  • Surface verhindert das Zeichnen

    Hi, ich habe mich seit neuem Intensiver mit Surfaces beschäftigt. Leider kommt mir da ein Problem. Ich möchte einen Pause-Screen machen. Es wird natürlich durch das Surface das Bild sozusagen eingefriert. Jetzt werden alle Instanzen, bis auf das Anzeige-Objekt deaktiviert. Jetzt soll die anzeige ein Rechteck zeichnen, dass langsam immer dunkler wird, bis der Bildschirm schwarz ist. Problem: Das Surface bewirkt irgendwie, dass das Rechteck nicht mehr gezeichnet wird. Hier mal mein Code:


    GML-Quellcode

    1. pause_logo_alpha = 0;
    2. pause_rect_alpha = 0;
    3. global.pause = 0;


    P

    GML-Quellcode

    1. if !global.pause
    2. {
    3. pause_screen = surface_create(1024,768);
    4. target = surface_set_target(pause_screen);
    5. instance_deactivate_all(true);
    6. global.pause = true;
    7. }
    8. else
    9. {
    10. global.pause = false;
    11. instance_activate_all();
    12. surface_free(pause_screen);
    13. }
    Alles anzeigen



    GML-Quellcode

    1. if global.pause
    2. {
    3. if pause_rect_alpha < 1
    4. {
    5. pause_rect_alpha+=0.075;
    6. }
    7. if pause_rect_alpha >= 1
    8. {
    9. if pause_logo_alpha < 1
    10. {
    11. pause_logo_alpha+=0.05;
    12. }
    13. }
    14. }
    15. if !global.pause
    16. {
    17. if pause_logo_alpha > 0
    18. {
    19. pause_logo_alpha-=0.05;
    20. }
    21. if pause_logo_alpha <= 0
    22. {
    23. if pause_rect_alpha > 0
    24. {
    25. pause_rect_alpha-=0.075;
    26. }
    27. }
    28. }
    Alles anzeigen



    GML-Quellcode

    1. draw_surface_ext(pause_screen,view_xview[0],view_yview[0],1,1,0,c_white,0.5);
    2. draw_set_alpha(pause_rect_alpha);
    3. draw_rectangle_color(view_xview[0],view_yview[0],view_xview[0]+1024,view_yview[0]+768,0,0,0,0,false);
    4. draw_sprite_ext(spr_pause,0,view_wview[0]/2,view_hview[0]/2,1,1,0,c_white,pause_logo_alpha);


    Ich hoffe ihr könnt mir helfen. Entweder ist es ein dummer Fehler, oder es fehlen Funktionen. Danke schon mal. ;)

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

  • Wenn du mit dem Zeichnen auf dem Surface fertig bist dann führe surface_reset_target() aus. Sonst wird fortan alles auf das Surface gezeichnet, auch wenn du dann das Surface zeichnest, dann zeichnest du es auf sich selbst ;)
    "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
    - Joseph Weizenbaum
  • Also ich würde das im Pause Knopf unterbringen, du willst ja einfach das Spiel abblenden, und wenn es weitergeht wieder aufblenden.

    Modifiziere den Code mal so.

    GML-Quellcode

    1. pause_screen = surface_create(1024,768);
    2. target = surface_set_target(pause_screen);
    3. screen_refresh(); // zeichnet alles, was zu sehen ist, noch mal (dieses mal in das Surface)
    4. surface_reset_target(); // setzt die Zeichenoberfläche wieder auf den Bildschirm
    5. instance_deactivate_all(true);
    "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
    - Joseph Weizenbaum
  • Gut, aber wenn ich jetzt draw_surface() im Draw-Event ausführen lasse, kommen so merkwürdige Striche über den BIldschirm.
    Den Befehl über surface_set_target() unterzubringen hilft auch nicht. Im Moment sieht der Code so aus:

    GML-Quellcode

    1. pause_logo_alpha = 0;
    2. pause_rect_alpha = 0;
    3. pause = 0;


    GML-Quellcode

    1. if pause
    2. {
    3. if pause_rect_alpha < 1
    4. {
    5. pause_rect_alpha+=0.075;
    6. }
    7. if pause_rect_alpha >= 1
    8. {
    9. if pause_logo_alpha < 1
    10. {
    11. pause_logo_alpha+=0.05;
    12. }
    13. }
    14. }
    15. if !pause
    16. {
    17. if pause_logo_alpha > 0
    18. {
    19. pause_logo_alpha-=0.05;
    20. }
    21. if pause_logo_alpha <= 0
    22. {
    23. if pause_rect_alpha > 0
    24. {
    25. pause_rect_alpha-=0.075;
    26. }
    27. }
    28. }
    Alles anzeigen

    P

    GML-Quellcode

    1. if !pause
    2. {
    3. pause_screen = surface_create(1024,768);
    4. target = surface_set_target(pause_screen);
    5. screen_refresh(); // zeichnet alles, was zu sehen ist, noch mal (dieses mal in das Surface)
    6. surface_reset_target(); // setzt die Zeichenoberfläche wieder auf den Bildschirm
    7. instance_deactivate_all(true);
    8. pause = true;
    9. }
    10. else
    11. {
    12. instance_activate_all();
    13. surface_free(pause_screen);
    14. pause = false;
    15. }
    Alles anzeigen


    GML-Quellcode

    1. draw_surface(pause_screen,view_xview[0],view_yview[0]);
    2. draw_set_alpha(pause_rect_alpha);
    3. draw_rectangle_color(view_xview[0],view_yview[0],view_xview[0]+1024,view_yview[0]+768,0,0,0,0,false);
    4. draw_sprite_ext(spr_pause,0,view_wview[0]/2,view_hview[0]/2,1,1,0,c_white,pause_logo_alpha);

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

  • Naja, du solltest das Surface nur zeichnen lassen, wenn es wirklich existiert. Wenn die Pause fertig ist machst du ja surface_free(pause_screen). Im Draw Event zeichnet er aber immer das Surface. Was zeichnet er denn jetzt, wenn das Surface keinen Inhalt hat? Richtig, Datenmüll. Bastle das mal so, dass du das Surface nur zeichnest, wenn du ihm einen Inhalt gegeben hast.
    "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
    - Joseph Weizenbaum
  • Ja, ich lasse es im Keypress-P-Event erstellen, dann hat es doch den Inhalt. Dann soll ich den draw_surface() Befehl vor dem surface_set_target() Befehl einbauen. Trotzdem passiert nichts.
    P

    GML-Quellcode

    1. if !pause
    2. {
    3. pause_screen = surface_create(1024,768);
    4. target = surface_set_target(pause_screen);
    5. screen_refresh(); // zeichnet alles, was zu sehen ist, noch mal (dieses mal in das Surface)
    6. draw_surface(pause_screen,view_xview[0],view_yview[0]);
    7. surface_reset_target(); // setzt die Zeichenoberfläche wieder auf den Bildschirm
    8. instance_deactivate_all(true);
    9. pause = true;
    10. }
    11. else
    12. {
    13. instance_activate_all();
    14. surface_free(pause_screen);
    15. pause = false;
    16. }
    Alles anzeigen

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

  • Ok, nehme die letzte Änderung wieder weg, also den Code aus diesem Post wieder.

    Und dann ersetzt du da mal screen_refresh(); mit screen_redraw(); und schaust mal, ob dann die Grafikfehler weg sind.
    "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
    - Joseph Weizenbaum
  • Benutzer online 7

    7 Besucher