Objekte auf einer Kreisbahn bewegen

    • GM 8

      Objekte auf einer Kreisbahn bewegen

      In diesem Tutorial zeige ich wie einfach ihr ein Objekt, wie einen Mond oder eine Drohne, um ein anderes Objekt, wie einen Planeten oder den Spieler kreisen lassen könnt. Im Speziellen zeige ich es euch hier an einem Schiff, auf dem mehrere Geschütztürme montiert sind und die ihr unabhängig vom Schiff steuern könnt.

      Die Theorie

      Der zugrundeliegende Code den ihr für alle derartigen Anwendunegn braucht:

      GML-Quellcode

      1. obj_mond.x = obj_planet.x + lengthdir_x(radius,Winkel)
      2. obj_mond.y = obj_planet.y + lengthdir_y(radius,Winkel)


      Um nun den Mond zum kreisen zu bringen müsst ihr nur stetig (step-Event) den Winkel ändern.

      Anwendung

      Also gehen wir´s an!

      Für dieses Beispiel, müsst ihr drei Objekte erstellen; das Schiff und zwei Geschütztürme. Sowie die dazugehörigen Sprites.
      Wichtig! Wenn ihr die Sprites erstellt richtet sie nach Rechts aus, dann habt ihr später keine Probleme mit der Variable Direction.

      Sprites:

      Das Schiff Sprite könnt ihr gestalten wie ihr wollt (es kann auch ruhig mehrere Subimages haben, Blinklichter etc), ich habe meines 32px hoch und 64px breit gemacht.
      Der Nullpunkt befindet sich genau in der Mitte

      Wie bei dem Schiffskörper, könnt ihr die Geschütztürme ebenso frei gestalten, aber lasst soviel Platz am Canvas, dass das Rohr theoretisch in alle Richtungen geschwenkt werden kann. Dann klickt unter Animation auf Rotation Sequence -> Counter Clockwise! und 360 Frames.
      Später wird sich nicht das Objekt drehen sondern nur das Subimage angegeben.

      Objects:

      obj_schiff:
      Spoiler anzeigen

      Im Create Event initialisieren wir die globale Variable "richtung". Erstellen das obj_turm2 auf 0,0 und obj_turm1 auf 16,0.
      Wenn ihr das Spiel jetzt startet sollten beide Türme auf dem Schiffskörper sitzen, einer davon weiter vorne als der andere. Im Idealfall sieht das schon gut aus :)
      Im keyboard Event <Left> setzen wir "richtung" auf 2 relativ und auf -2 im keyboard Event <Right>
      keyboard Event <Up> beschleunigen wir das Schiff.

      GML-Quellcode

      1. if speed < 3
      2. {
      3. speed += 0.2
      4. direction = richtung
      5. }

      Solange wir also unter Speed 3 sind beschleunigen wir das Schiff in die gelenkte Richtung.
      Abgebremst wird im keyboard Event <Down>.

      GML-Quellcode

      1. if speed > 0
      2. {
      3. speed -= 0.2
      4. direction = richtung
      5. }

      So, damit wir das auch sehen können müssen wir ein wenig im Step Event herumhantieren:

      GML-Quellcode

      1. direction = richtung
      2. image_angle = direction
      3. if richtung >= 360
      4. {
      5. richtung = 0
      6. }
      7. if richtung < 0
      8. {
      9. richtung = 359
      10. }

      Wunderbar, das Schiff lässt sich durch den Raum steuern...bloß die Türme bleiben auf der Strecke...


      obj_turm1
      Spoiler anzeigen

      Im Endstep Event benutzen wir Jump to Position um den Turm immer an seine vorgesehene Stelle am Schiff zu setzen.

      GML-Quellcode

      1. x = obj_schiff.x + lengthdir_x(16,richtung)
      2. y = obj_schiff.y + lengthdir_y(16,richtung)

      Da der Turm je nach Geschwindigkeit des Schiffes nur stotternd hinterherkommt benutzen wir Draw Sprite
      im Draw Event.
      Dort nehmen wir das Turm1 Sprite mit den 360 Subimages, die selben x und y Koordinaten wie im Endstep Event und schlussendlich setzen wir subimage auf "direction".
      Nun wollen wir den Turm zum drehen bringen:
      keyboard Event <A>:

      GML-Quellcode

      1. direction += 2

      keyboard Event <S>

      GML-Quellcode

      1. direction -= 2


      obj_turm2:
      Spoiler anzeigen

      dupliziert obj_turm1, ändert das Sprite im Draw Event und stellt überall den Radius von 16 auf 0 oder 4 um, je nachdem wie groß eure Türme geworden sind.

      Und das war es auch schon :)
      Ihr habt ein Schiff, dass sich frei bewgen kann und die Türme lassen sich ebenso unabhängig steuern.
      Ich hoffe es hat euch gefallen und geholfen. Wenn es unklarheiten gibt, Screenshots oder ein Example benötigt wird, stelle ich dies gerne zur Verfügung.
      Ebenso mache ich gerne einen zweiten Teil in dem ihr die Türme automatisch oder auf Tastendruck an die Richtung des Schiffs ausrichten , sowie schießen lassen könnt.

      ancient-pixel.com
      youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
      Hey dank deines Tutorials bleiben meine Waffentürme nun endlich auf ihrer Position.
      Doch ein Problem habe ich noch.

      Ich kann den Turm nicht mehr dort positionieren wo ich möchte.
      Ich kann jediglich die X Position des Turmes verändern.
      x = obj_schiff.x + lengthdir_x(16,richtung) // Hier mit kann ich die Position vom Turm verändern,aber nur auf der X Position
      y = obj_schiff.y + lengthdir_y(16,richtung) // Wenn ich hier aber Zahl ändere,verändert sich nicht die Y Position.

      Das heisst : Wie verändere ich die Y Position?

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „HappyMaj0r“ ()

      Das geht ganz einfach :)

      Wenn der Turm auf der X-Achse links vom Mittelpunkt sein soll:

      GML-Quellcode

      1. x = obj_body.x + lengthdir_x(-32,richtung)
      2. y = obj_body.y - lengthdir_y(32,richtung)


      Wenn der Turm auf der Y-Achse über dem Mittelpunkt sein soll:

      GML-Quellcode

      1. x = obj_body.x + lengthdir_x(32,richtung+90)
      2. y = obj_body.y + lengthdir_y(32,richtung+90)


      Und unter dem Mittelpunkt mit -90 oder +270.

      Ich hab ziemlich lange gebraucht um das rauszufinden obwohl es dann eh sehr logisch war, einfach weil die Formel für links vom Mittelpunkt setzen so anders ist. Jedenfalls kannst du mit denen nun den Turm wo immer du willst am Schiff hinsetzen solange du weißt wie groß der Radius und der Winkel sein müssen :)

      ancient-pixel.com
      youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
      @Aku_Ryou

      ich wollte gerade dieses tutorial machen jedoch komme ich da nicht mit.....nicht das du es nicht gut genug erklärt hättest aber irgendwie verwirrt mich die schreibweise total.


      also ich hab im obj_schiff create event

      GML-Quellcode

      1. globalvar richtung;
      2. richtung=0;


      obj_schiff
      keypress_event up

      GML-Quellcode

      1. if speed < 3
      2. {
      3. speed += 0.2
      4. direction = global.richtung
      5. }


      obj_schiff
      keypress event down

      GML-Quellcode

      1. if speed > 0
      2. {
      3. speed -= 0.2
      4. direction = global.richtung
      5. }


      obj_schiff
      keypress event left

      GML-Quellcode

      1. Set Variable global.richtung to 2 relativ


      obj_schiff
      keypress event right

      GML-Quellcode

      1. Set variable global.richtung to -2 relativ


      obj_schiff
      step event

      GML-Quellcode

      1. direction = global.richtung
      2. image_angle = direction
      3. if global.richtung >= 360
      4. {
      5. global.richtung = 0
      6. }
      7. if global.richtung < 0
      8. {
      9. global.richtung = 359
      10. }




      obj_turm
      end step

      GML-Quellcode

      1. x = obj_schiff.x + lengthdir_x(16,global.richtung)
      2. y = obj_schiff.y + lengthdir_y(16,global.richtung)


      obj_turm
      draw event

      GML-Quellcode

      1. ;
      2. draw_sprite(sprite23,direction, obj_schiff.x + lengthdir_x(16,global.richtung), obj_schiff.y + lengthdir_y(16,global.richtung))


      obj_turm
      press A key event

      GML-Quellcode

      1. direction += 2


      obj_turm
      press S key event

      GML-Quellcode

      1. direction -= 2




      aber das funkt nicht ...und hast du die sprites vielleicht noch???
      @Aku_Ryou

      hallo also ich wollte deinen tutorial folgen aber ich hab probleme es zu verstehn kannst du mir sagen was daran falsch ist???im oberen post.


      und wegen dem grenade throw also ich muss das lengthdir_x und y speichern und übertragen und dann die granate dort entlang zeichnen lassen??? oder direkt das granaten objekt
      Hi,
      zwei kurze Anmerkungen:
      1. 360 Subimages zu generieren kostet reichlich Platz - meist ist aber ein Unterteilen in zB 36 oder 72 Schritte völlig ausreichend und kostet einen Bruchteil des Platzes.
      2. Du generierst 360 Images, setzt die Rotation aber in 2er Schritten, spürich: Du nutzt aktuell eh nur 180 der 360 generierten Images.
      Sollte ich da falsch liegen bin ich gern bereit mich eines Besseren belehren zu lassen, ich interpretiere den Code mal einfach so (ich habe bislang noch nicht mit GM gearbeitet, bin aber geübt in diversen Programmiersprachen).

      Freundliche Grüße
      @BladeRunner Jop, keine Ahnung warum ich das damals so gemacht habe. Mit dem draw_sprite_ext Befehl kann man einfacher die direction des sprites angeben.

      @acidrain833 Was genau funktioniert denn nicht?
      Ersetze im draw Event vom Turm auch das draw_sprite durch ein draw_sprite_ext. Und setze direction bei der rotation ein und das subimage bleibt 0. Die sprites habe ich leider nicht mehr.

      ancient-pixel.com
      youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
      naja es sobald ich a drücke dreht er sich die ganze zeit um 360 grad und wenn ich dann s drücke tut sich nichts...aber wenn das spiel startet und ich s drücke geht es auch ganze zeit um 360 grad und es stoppt eingach nicht mehr
      und das schiff schaut immer in eine richtung ...