Magnetismus

  • GM 7
  • Ich arbeite an einem neuen Spiel indem man durch Magnetismus und Gravitation einen Ball durch das Level navigieren muss.
    Die Wände werden durch Blöcke zusammen gesetzt.
    Jetzt sollen die Wände den Ball entweder abstossen oder Anziehen, die Gravitation aber nicht ausschalten.
    Wie kann ich die Richtung und die Geschwindigkeit berechnen mit der der Ball sich von den Blöcken weg/hin bewegt?
    Die Suche hat mir zwar ein ergebnis geliefert, ich konnte aber nicht darauf zugreiffen.
    Ich haffe ihr könnt mir einen guten GML code geben oder wneigstens ein paar Anregungen und Ideen.

    -kn12
  • Hallo. Ich denke mal, dass du das mit einer relativen Geschwindikeitserhöhung schaffst, die in Richtung der Wand oder von der Wand weg wirkt.

    Ich mache ein Beispiel :

    Wenn der Player der Wand zu nahe kommt, wirkt einfach Gravity in die Richtung der Wand mit zunehmender Geschwindigkeit, je nähe du kommst.

    --> Das gegenteil ist auch möglich

    Die Richtung hängt davon ab, wo du den Magneten setzen willst --> zB. Mitte der Wand
    Die Geschwindigkeit musst du ja nicht "berechnen" du musst nur die Gravity erhöhen.



    Mfg
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von xx-XtremeX-xx ()

  • Ich glaube, sein Problem ist, dass die Richtung "seiner" Gravity 270 ist, und die Wände links und rechts.
    Du müsstest also entweder die Richtung der gravity in Relation zur Anziehung berechnen, oder eine zusätzliche Variable erstellen:
    step:

    GML-Quellcode

    1. anziehung = 1/distance_to_point(magnet.x,magnet.y)*irgendein Faktor; //Die Stärke der Anziehung
    2. if magnet.x < x
    3. anziehung = -anziehung; //Wenn der Magnet links ist -> "negative" Anziehung
    4. hspeed += anziehung; //Die Anziehung wird zur horizontalen Geschwindigkeit addiert.

    "Is this one sloshing?"
    Four words you don't want to hear when you pick up a coffin...
  • Würd ich mit motion_add lösen. Es gibt eine Gravity und jeder Stein lässt Kraft auf den BAll ausüben (uhh Deutsch, nix gut). Nimm die Formel (m1*m2)/distance² ist zwar für Gravitation, müsste aber eigentlich auch gut wirken. Achja du solltest die erst ab einer bestimmten Entfernung wirken lassen. KA, 300 Pixel oder so. Genaueres vielleicht morgen.
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]
  • es ist etwas komplizierter:
    Die Wände bestehen aus einzelnen Block objekten.
    Jeder Block wirkt Magnetisch auf den Ball.
    Also muss ich für jeden Block einen Vektor berechnen und den Durchschnitt davon mit motion_add hinzufügen.
    das Problem ist, dass ich neben dem magnetismus mithilfe der pfeiltasten die Gravitationsrichtung einstellen kann.
    also dass der Ball zum bsp. am anfang nach unten sinkt dann die -> taste gedrückt wird und der ball jetzt nach links "sinkt".
    Neben dem sollte aber auch der magnetismus der Wände wirken. Ich hab schon was und werde es morgen mal posten.
    Trotzdem danke für die vielen Tips und Ideen.

    -kn12
  • Für was Durchschnitt errechnen? Du kannst doch einfach für jeden dieser magnetischen Blöcke doch einfach einen Vector zur aktuellen Bewegung des Ball addieren, zb mit motion_add.
    Könntest ja im Step Event der Blöcke sowas hineinschreiben:

    GML-Quellcode

    1. maxdist=100
    2. if point_distance(x,y,player.x,player.y)<maxdist {
    3. player.tempwall=id
    4. with player
    5. {
    6. motion_add( (-(point_distance(x,y,tempwall.x,tempwall.y)+maxdist)/maxdist)*maximale_Anziehungskraft ,
    7. point_direction(x,y,tempwall.x,tempwall.y)
    8. )
    9. }
    10. }
    Alles anzeigen

    Oder hab ich das falsch verstanden bzw funktioniert das nicht?

    Andere Idee:

    GML-Quellcode

    1. player.x+=lengthdir_x((-(point_distance(x,y,tempwall.x,tempwall.y)+maxdist)/maxdist)*maximale_Anziehungskraft ,
    2. point_direction(x,y,tempwall.x,tempwall.y))
    3. player.y+=lengthdir_y((-(point_distance(x,y,tempwall.x,tempwall.y)+maxdist)/maxdist)*maximale_Anziehungskraft ,
    4. point_direction(x,y,tempwall.x,tempwall.y))
    "das war meine letzte flamewar PM an dich ."

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von blubberblub ()

  • blubberblub schrieb:

    Für was Durchschnitt errechnen? Du kannst doch einfach für jeden dieser magnetischen Blöcke doch einfach einen Vector zur aktuellen Bewegung des Ball addieren, zb mit motion_add.

    Ich wollte das nur nochmal hervorheben. Zuerst den Durschnitt zu erechnen ist genauso sinnlos wie bei a+b+c+d+e+f Klammern zu setzen.

    Und vergiss auch nicht, dass eine längere Wand aus 16*16 Blöcken auch der Anzahl entsprechend eine hohe Gesamtanziehungskraft hat.
  • Bei quadratischer Beziehung zwischen Kraft und Distanz ist der Effekt aber stark reduziert, und sollte eigentlich natürlich Wirken
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]
  • Benutzer online 1

    1 Besucher