Zerstörbare Landschaft

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

    • Zerstörbare Landschaft

      Zerstörbare Landschaft


      von xiebelVersion 1.0
      Benötigte GM-Version: 5.3
      Bearbeitet von: Windapple & MewX



      Ok, hier also eine Möglichkeit wie man sehr einfach Zerstörbare Landschaften macht.

      Was wir brauchen:
      • Ein Landschaftssprite namens "spr_landscape"
      • Ein "Loch"-Sprite namens "spr_hole"
      • Ein Objekt namens "obj_landscape" mit spr_landscape als sprite
      • Ein Objekt namens "obj_hole" mit spr_hole als sprite

      Das Landschaftsobjekt muss Transparent sein, und die Transparente Farbe sollte im standart-GM-transparent-grün sein (64,128,0), und wenn man doch eine andere will muss man halt paar Sachen im Code umändern
      Das Loch-sprite soll ein einfacher Kreis sein, der die transparente Farbe von oben hat , d.h. die eigene Transparente Farbe muss anders sein.

      obj_landscape
      Create:
      [PHP]global.landscape=spr_landscape; //wir legen spr_landscape als Anfangs-landschatfs-sprite fest[/PHP]
      press <Space>:[PHP]instance_create(mouse_x,mouse_y,obj_hole); // ein Loch-Objekt wird an Mausposition erstellt[/PHP]
      So, jetzt haben wir die Landschaft, die wir auch in den room setzen. Beim Druck auf die Leertaste soll an der Mausposition ein Loch in der Landschaft erscheinen, bisher wird aber nur eine obj_hole-Instanz an der Mausposition erstellt.

      obj_hole
      collision obj_landscape:
      [PHP]change_landscape(x,y,obj_hole); //Bei einer Kollision von Loch und Gelände wird ein Script ausgeführt was wir später noch einbauen werden.[/PHP]
      Create:
      [PHP]event_perform(ev_collision,obj_landscape); //das gerade definierte Kollisions-event mit obj_landscape wird ausgeführt.
      instance_destroy(); //Gleich danach die Instanz zerstört.[/PHP]

      So, jetzt kommen wir zum Kernstück des ganzen, dem Skript das die Landschaft verändert:

      Skript: change_landscape
      [PHP]//argument0: x-position of sprite, which is added to landscape
      //argument1: y-position ...
      //argument2: index of sprite
      var _width,_height;
      _width=sprite_get_width(global.landscape);
      _height=sprite_get_height(global.landscape);
      brush_color=make_color(64,128,0);
      pen_color=make_color(64,128,0);
      draw_rectangle(0,0,_width,_height);
      draw_sprite(global.landscape,0,0,0);
      draw_sprite(argument2,0,argument0,argument1);
      sprite_delete(global.landscape);
      global.landscape=sprite_create_from_screen(0,0,_width-1,_height-1,true,true,true,false,0,0);
      obj_landscape.sprite_index=global.landscape;

      [/PHP]
      Wenn wir jetzt testen müsste es Einwandfrei funktionieren, aber was genau macht das Skript?
      Da es nicht im draw-event ist wird obwohl wir zeichnen nichts davon auf dem Bildschirm angezeigt.
      Zuerst wird die Farbe der Zeichenwerkzeuge auf die transparente Farbe gesetzt (das hier ändern wenn man eine andere transparente Farbe genommen hat).
      Dann wird der komplette Landschaftssprite mit grün(transparente Farbe) übermalt. (damit Hintergrund und andere objekte nicht im Bild sind)

      Das Landschafts-sprite nochmal darüber gezeichnet.

      Jetzt das Loch in der transparenten Farbe der Landschaft darüber an der Position des obj_hole's gezeichnet. Damit sieht es so aus als wäre ein Loch in der Landschaft.

      Es soll aber nich nur so aussehen, wir wollen ja das das Loch wirklich IM Landschatfssprite ist, damit man da auch durchgehen kann wenn die Landschaft solid ist.
      Deshalb wird der alte Landschaftssprite aus dem Speicher gelöscht und ein neuer von dem was jetzt NICHT auf dem Bildschirm zu sehen ist (da ja nicht in draw event) per sprite_add_from_screen gemacht.

      Sieht auch schön aus wenn man statt dem runden Loch-sprite einen strukturierten nimmt ^^
      Dateien
      • landscape.zip

        (71,25 kB, 556 mal heruntergeladen, zuletzt: )

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

    • hm, rafinierte Lösung, erinnert mich an RenderToTexture Methoden in 3D API's ^^
      Auf jedenfall ist es aber noch langsam, was aber Game Maker zuzuschreiben ist...

      Mit GM6 sollte das aber eine Musterlösung sein, da GM6 auch RenderToTexture Methoden zur verfügung stellen müsste (ich meine wenn es schon DirectX benutzt...). Die sind dann auch seehr schnell (ich weiß nicht ob ihr mal RadialBlur Demos von 3D API's gesehen habt, die benutzten sowas und es gibt keinen ruckler).

      Ich freu mich schon auf die ersten WORMS Clone hrhr ^^
    • Das ist ja alles gut und schön, nur bei mir klappt da irgendetwas nicht:
      Wenn ich das Spiel testen möchte, erscheint folgende Fehlermeldung:

      COMPILATION ERROR in Script: change_landscape
      Error in code line 9:

      draw_rectangle(0,0,_width,__height);

      at position 35: Wrong number of arguments to function or script.

      :?: ?(
      I´m Lyin´ I´m Cheatin´ I´m Stealin´
      Chinese Democracy is comin'...!

    • Original von Skil
      Das ist ja alles gut und schön, nur bei mir klappt da irgendetwas nicht:
      Wenn ich das Spiel testen möchte, erscheint folgende Fehlermeldung:

      COMPILATION ERROR in Script: change_landscape
      Error in code line 9:

      draw_rectangle(0,0,_width,__height);

      at position 35: Wrong number of arguments to function or script.

      :?: ?(


      Weil du die 6er Version des GM's nutz dieses Tut aber für version 5.3 ist...
      Face in the wind, we're riding the storm
      We'll stay our course whatever will come
      ~~ Stay (Running) Wild ~~
    • hab jetzt hier mal erweitert:

      -jetzt ist es möglich einen scrollenden view zu benutzen

      FEHLER: (wer kann helfen)
      bei jedem schuss wird der teil der landschaft,
      der anfangs nicht im view ist,
      um 1px nach rechts verschoben!!!!!!!
      WARUM?

      wär nett wenn sich das jemand anschauen könnte

      ciao
      iTeM
      Dateien

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

    • ich hätts net anders gelöst! so, und jetzt mach mal dasselbe mit einem grossen bild als background ;)
      █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
      █████ ███████ ███ your █████ ████ government.