Verbindung zwischen zwei Objekten

  • GM 8

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

  • Verbindung zwischen zwei Objekten

    Zuerst einmal ein herzliches HALLO an euch da draußen bin neu hier im Forum ;)

    ich hab da eine Idee im kopf aber weiß nicht ob die umzusetzen ist...


    und zwar ist die Situation folgende:

    es gibt ein hauptobjekt(Spielfigur), das die ganze zeit fest stehen bleibt.
    Auf Tastendruck bewegt sich dann ein zweites Objekt (Haken o.Ä) in eine
    bestimmte Richtung vom Spieler weg und kommt zurück sobald es auf
    Gegenstände o.Ä. stößt.

    Bis hierhin ja ganz einfach...



    Nun ist aber die Frage, ob es eine Möglichkeit gibt, eine art "Schnur"
    zwischen den Objekten entstehen zu lassen, so dass es so aussieht als ob
    die Spielfigur den Haken an einer Schnur auswirft und ihn durch ziehen
    wieder einholt.

    mfG,
    shorty
  • Die simpelste Lösung wäre schlicht die Funktion draw_line, mit der du eine Linie von Punkt A nach Punkt B zeichnen lassen kannst. Dazu benutzt du dann einfach die Koordinaten des Spielerobjekts und die des Hakenobjekts.

    Wenn die Schnur allerdings aus einem Sprite bestehen soll, wird das Ganze schon etwas komplizierter. Dann müsstest du mit den Vektorfunktionen lengthdir_x und lengthdir_y arbeiten und je nach Distanz zwischen Haken und Schnur entweder mehr oder weniger Schnursprites zeichnen lassen.

    Das sähe dann etwa so aus:

    GML-Quellcode

    1. var i, rot; // diese beiden variablen verfallen nach ende des skripts, um arbeitsspeicher zu sparen.
    2. rot=point_direction(x,y,haken.x,haken.y); // <- tippfaulheit :3
    3. for(i=0;i<point_distance(x,y,haken.x,haken.y);i+=sprite_get_width(schnursprite)) // i ist hier die Zählervariable, die nach jedem Schleifendurchlauf um die Spritebreite der Schnur erhöht wird, bis sie die Entfernung zwischen Spieler und Haken überschreitet. Ich benutze die for-Schleife übrigens nur aus Gewohnheit - für dich wär wahrscheinlich die einsteigerfreundliche repeat-Schleife eher was.
    4. {
    5. draw_sprite_ext(schnursprite,schnurimage,x+lengthdir_x(i,rot),y+lengthdir_y(i,rot),1,1,rot,c_white,1); // das ist die Zeile, um die's geht. Das Schnursprite (mit dem entsprechenden image-index) wird, ausgehend von den Koordinaten des Spielers, öfter gezeichnet, wenn der Haken weiter entfernt ist und weniger oft, wenn er wieder zurückkommt. Schau dir diese Funktion am besten in der Hilfedatei an, um alle Parameter nachvollziehen zu können. Schau dir vor allem auch lengthdir_x und _y an, über die wirst du bestimmt noch öfter stolpern.
    6. // Da die Koordinaten des Sprites von i abhängig sind und i in jedem Schleifendurchlauf erhöht wird, werden die Sprites so mehr oder weniger nahtlos aneinandergeheftet.
    7. }


    Ich hab das jetzt nicht getestet, aber es sollte vom Prinzip her funktionieren.
    Tortzdem halte ich für einen Einsteiger wie dich die draw_line-Option immer noch für besser. Da musst du dir bedeutend weniger den Kopf zerbrechen. ;)
  • Ok ich habe jetzt draw_line_width benutzt und eigentlich klappts super...
    Bis auf die Tatsache, dass plötzlich der Haken nicht mehr angezeigt wird und ich konnte noch nicht herausfinden warum ?(

    p.s.: da ich schon mit andren programmiersprachen wie c++ oder auch php gearbeitet habe sind allgemeine sachen wie schleifen u.s.w. nich unbedingt mein problem ;)

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

  • Ist nun zwar schon gelöst, aber ich will noch kurz erklären, warum das hier:

    Hellfish schrieb:

    sobald du draw Funktionen benutzt wird der sprite ncihtmehr gedrawed, den musst du dann darunter mit draw_sprite oder draw_sprite ext nochmal drawn

    der Fall ist.

    In einem leeren Draw-Event (d.h. in einem, das im Objekt-Editor nicht mal in die Eventliste aufgenommen wurde) befindet sich standardmäßig - auch in der Lite-Version des GM - folgender Code:

    GML-Quellcode

    1. {
    2. draw_sprite_ext(sprite_index,image_index,x,y,image_xscale,image_yscale,image_angle,image_blend,image_alpha);
    3. }


    Sobald der User das Draw-Event eines Objektes modifiziert, wird dieser Code entfernt und stattdessen der ausgeführt, den der User angegeben hat. Aus diesem Grund musst du das Sprite eben selbst nochmal zeichnen lassen. Hat den Vorteil, dass du alle Parameter der Funktion entweder variabel (wie die Koordinaten in meiner for-Schleife oben) oder konstant (wie das c_white für image_blend) halten kannst.

    Außerdem vielleicht noch interessant: Was im Draw-Event an erster Stelle steht, wird auch zuerst gezeichnet. Wenn du also dein Sprite zeichnen lässt und dann mit draw_rectangle ein großes weißes Rechteck ziehst, wirst du nur das Rechteck sehen, da das Sprite von ihm verdeckt wird. Aus diesem Grund hab ich die Zeichne-dein-eigenes-Sprite-Funktion grundsätzlich an letzter Stelle in allen Draw-Events.
    So, das wär's dann auch schon wieder. Hoffentlich hat's was geholfen. :D