Glitch bei zerstörbarer Landschaft (wie bei Worms)

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

  • Glitch bei zerstörbarer Landschaft (wie bei Worms)

    Schönen Abend,

    in einem anderen Projekt habe ich eine zerstörbare Landschaft gemacht, wie in Worms. Da wo ein Loch gemacht werden soll, wird erst geprüft welche Instanzen des Boden-Objekts getroffen werden. Dann werden die Sprites aller Boden-Objekte auf ein Surface gezeichnet, dann ein schwarzer Kreis und schließlich werden für die getroffenen Boden-Instanzen neue Sprites, mit schwarz als Transparenzfarbe, erstellt und mit den alten Sprites ausgetauscht. Außerdem wird die Kollisions-Maske neu berechnet aber das tut hier nix zur Sache glaube ich.

    Das Ergebnis ist eine zerstörbare Landschaft mit nicht all zu großer FPS-Auslastung bei Zerstörung. (Die Sprites müssen recht groß sein, da es so wenige Boden-Objekte wie möglich im Raum geben soll, der Raum ist sehr groß)
    Doch leider gibt's da einen Glitch. Der Boden zerstört sich nicht nur da wo ein Loch gemacht wird sondern überall etwas. Als ob er mit einer schwarzen Umrandung gezeichnet wird (schwarz wird zerstört) die immer enger wird. Blöd zu erklären ein Video zeigt was ich meine:



    Was kann ich dagegen tun? Mein Code für das Zerstör-Skript sieht so aus:

    GML-Quellcode

    1. var xx = argument0; //X-Mittelpunkt des Kreises
    2. var yy = argument1; //Y-Mittelpunkt des Kreises
    3. var radius = argument2; //Radius des Kreises
    4. with(Ground) //Das Bodenobjekt
    5. {
    6. if point_distance(x+100,y+100,other.x,other.y) < 228 //damit nicht alle Boden-Objekte ein place_meeting prüfen müssen (Performance)
    7. {
    8. if place_meeting(x,y,other) //ob der Boden getroffen wird
    9. {
    10. makeLoch = true; //die Variable in der gespeichert wird das es getroffen wurde
    11. if alarm[0] = -1 alarm[0] = 4; // die wird nach 4 steps also nach dem Skript zurück gesetzt
    12. }
    13. else makeLoch = false; //keine Ahnung warum das da steht, muss nicht
    14. }
    15. }
    16. surface_set_target(global.surf); //es wird auf das Surface gezeichnet ab jetzt
    17. draw_clear_alpha(c_black,1); //mit schwarz löschen
    18. with (Ground) draw_self(); //alle Böden zeichnen ihre Sprites auf das Surface
    19. draw_set_color(c_black);
    20. draw_circle(xx,yy,radius,false); // der Kreis wird später zum Loch
    21. for (i = 0; i < instance_number(Ground); i += 1)
    22. {
    23. target = instance_find(Ground,i);
    24. if target.makeLoch = true // die For-Schleife und so dient um jetzt zu gucken, dass nur bei den getroffenen Böden das Sprite durch ein Neues ersetzt wird
    25. {
    26. target.draw = false; //darunter wird das alte SPrite gelöscht, deswegen sag ich dem Boden er soll ma kurz nicht zeichnen damit kein Fehler kommt
    27. sprite_delete(global.spr_ground[target.index]);
    28. global.spr_ground[target.index] = sprite_create_from_surface(global.surf, target.x, target.y, 200, 200, true, true, 0, 0); //hier wird jetzt dass neue Sprite erstellt mit schwarz als Transparenz
    29. sprite_collision_mask(global.spr_ground[target.index], true, 0, 0, 200, 0, 200, 0, 0);
    30. target.sprite_index = global.spr_ground[target.index]; // Boden bekommt das neue Sprite
    31. target.draw = true;
    32. }
    33. }
    34. surface_reset_target();
    35. }
    Alles anzeigen


    Also an was kann das jetzt liegen?
  • Ich hatte das gleiche Problem auch mal. Ist allerdings schon ein paar Jahre her. Ich glaube, es liegt daran, dass beim Erstellen des Sprites versucht wird, alle Kanten zu glätten. Das führt leider auch dazu, dass nicht nur an der neuen Stelle die Kanten weich werden, sondern quasi das ganze Sprite ringsum etwas "abgeschliffen" wird.
    Stelle einfach smooth in sprite_create_from_surface auf false. Allerdings hast du dann bei den Löchern keine weichen Kanten mehr sondern harte.