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:
Alles anzeigen
Also an was kann das jetzt liegen?
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
- var xx = argument0; //X-Mittelpunkt des Kreises
- var yy = argument1; //Y-Mittelpunkt des Kreises
- var radius = argument2; //Radius des Kreises
- with(Ground) //Das Bodenobjekt
- {
- 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)
- {
- if place_meeting(x,y,other) //ob der Boden getroffen wird
- {
- makeLoch = true; //die Variable in der gespeichert wird das es getroffen wurde
- if alarm[0] = -1 alarm[0] = 4; // die wird nach 4 steps also nach dem Skript zurück gesetzt
- }
- else makeLoch = false; //keine Ahnung warum das da steht, muss nicht
- }
- }
- surface_set_target(global.surf); //es wird auf das Surface gezeichnet ab jetzt
- draw_clear_alpha(c_black,1); //mit schwarz löschen
- with (Ground) draw_self(); //alle Böden zeichnen ihre Sprites auf das Surface
- draw_set_color(c_black);
- draw_circle(xx,yy,radius,false); // der Kreis wird später zum Loch
- for (i = 0; i < instance_number(Ground); i += 1)
- {
- target = instance_find(Ground,i);
- 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
- {
- 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
- sprite_delete(global.spr_ground[target.index]);
- 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
- sprite_collision_mask(global.spr_ground[target.index], true, 0, 0, 200, 0, 200, 0, 0);
- target.sprite_index = global.spr_ground[target.index]; // Boden bekommt das neue Sprite
- target.draw = true;
- }
- }
- surface_reset_target();
- }
Also an was kann das jetzt liegen?