bridge builder

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

  • bridge builder

    hallo

    ihr kennt doch sicher alle das game wordlofgoo, oder bridgebuilder oder so was in der art?
    bei worldofgoo kann man mithilfe kleiner pünktchen einen turm bauen, indem sie ineinander verstrebt werden.
    So eine Strebe ist aber nicht komplett starr, sondern lässt sich ein bischen stauchen und dehnen, darum kann der turm dann auch umfallen wenn er nicht stabil gebaut wird.
    Ähnlich ist es in dem game bridgebuilder, da muss man ne brücke bauen über die dann ein zug fährt.
    Auf Youtube hab ich auch ein Video von sowas gefunden (youtube.com/watch?v=1_XtmMbkKso&feature=related), sogar mit gamemaker gemacht.
    Ich vermute mal stark das das ganze mit gmphysics gemacht wurde.
    Da ich mich seit neuestem auch ein bischen damit auskenne, hab ich mir gedacht das müsste ich schaffen, nur brauch ich einen kleinen denkanstoss.
    Nun meine Frage:
    Wie funktioniert das ganze?
    Wurden da joints verwendet? Wenn ja welche? Hingle oder Slide?
  • ok das hab ich mir fast gedacht.
    wie würdest der code dann in etwa aussehen?
    Ich hab mir das so vorgestellt:
    Mit der Maus kann man punkte platzieren, und wenn sie sich in reichweite zu anderen punkten befinden (distance<50), soll eine linie gedrawt werden, und ein joint gemacht werden.
    das mit dem brechen löse ich einfach mit set_joint_break oder?

    EDIT:ich glaub ich hab das jetzt soweit, jetzt hab ich nur noch ein problem mit der adressierung von instancen:.
    wie kann ich von create event des objectes obj_punkt abfragen ob sich eine instanze des objectes obj_punkt in reichweite von 50 pixel befindet?
    wenn ja soll ein joint an deren position gemacht werden und eine linie von der x,y postiton zur x,y position der anderen instance die sich in reichweite befindet?

    das mit dem joint funkitoniert glaub ich schon:
    with(punkt)
    {
    if distance_to_object(other)<100 {j=create_joint(h,other.h,JOINT_HINGE,other.x,other.y)}
    }

    das mit linie drawen noch nicht:

    with(punkt)
    {
    if distance_to_object(other)<100 {draw_line(x,y,other.x,other.y}
    }


    EDIT2:
    ich hab grad ein noch größeres Problem gefunden:
    wenn ich mehrere punkte miteinander verbinde, fängt das ganze an zu zittern, wird immer stärker und "explodiert" dann regelrecht.
    Dateien

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von domi ()

  • ich hab jetzt eine neue idee, wie man das machen könnte:

    man müsste einfach nur einen hinge joint mit einem slider joint verbinden dann müsste es doch klappen.
    der hinge joint sorgt dafür, dass sich die verstrebungen drehen können und der slider joint sorgt dafür, dass sich die streben dehnen und stauchen lassen.
    dazu hab ich mal einen script geschrieben, leider funktioniert er noch nicht:

    create_soft_hinge:

    n1=argument0
    n2=argument1
    v1=instance_create(n1.x,n1.y,obj_face)
    v2=instance_create(n2.x,n2.y,obj_face)
    create_joint(n1,v1,JOINT_HINGE,n1.x,n1.y)
    create_joint(n2,v2,JOINT_HINGE,n2.x,n2.y)
    sl=create_joint(v1,v2,JOINT_SLIDER,point_direction(v1.x,v1.y,v2.x,v2.y))
    set_slider_limit(sl,0,point_distance(v1.x,v1.y,v2.x,v2.y)*2,0.5,0.5)

    mit der linken maustaste kann man punkte im raum platzieren, und mit der rechten maustaste kann man diese verbinden, also im right_mousebutton_release event:

    if global.on!=0
    {create_soft_hinge(instance_find(obj_vertex,global.on),self);global.on=0}

    Hat jemand ne plan warum das nicht funktioniert?
    oder kennt jemand einen einfacheren weg das zu realisieren?


    global.on ist die id des zweiten punktes der mit dem ersten (self) verbunden wird
  • ich habe zwar leider keine lösung hab das auch ma versucht wäre aber am fertigen programm interresiert wenns fertig is könntest du es dann hoch laden und mich verständigen?
  • wenn ich die engine wirklich mal hinbekomme, werde ich sie sicher veröffentlichen.
    Aber wie es jetzt aussieht bin ich noch weit davon entfernt.
    Hoppla, da ist mir gerade ein fataler Fehler in meinem script aufgefallen, vllt ist dieser Schuld.
  • ok ich hab jetzt ne methode gefunden mit der man so eine engine bauen könnte.
    am meisten hat mir der Thread "Physik des Flummiballs" oder so geholfen.
    Aber anstatt add_speed nehme ich add_force um das ganze in gmphysics zu realisieren und auszubauen.
    Hab jetzt leider kein gm zur hand, aber morgen oder übermorgen wed ich versuchen das ganze mit gm zu machen und werd den script dann hochladen.

    mfg
  • Ich hab das ganze jetzt schon mal hinbekommen, nur hab ich noch ein problem:
    die punkte lassen sich schon verstreben, aber wackeln dann immer mehr und mehr, bis sie quer durch den raum fliegen.
    Ich hab schon so ziemlich alles versucht, komm aber auf keine lösung.

    also hier ist der script für die physic die die punkte verstrebt:

    var i;

    i=0
    while i<ds_list_size(anderen)
    {

    gegner=ds_list_find_value(anderen,i);
    vsped=get_body_vspeed(h)
    hsped=get_body_hspeed(h)
    dist=point_distance(gegner.x,gegner.y,x,y);
    force_add=(dist-ds_list_find_value(laenge,i))*4;
    richtung=point_direction(x,y,gegner.x,gegner.y);
    set_body_hspeed(h,hsped+lengthdir_x(force_add,richtung))
    set_body_vspeed(h,vsped+lengthdir_y(force_add,richtung))
    i+=1
    }


    ach was ich lad einfach die gm6 hoch + gmphysics.
    einfach mit linker maustaste punkte setzen und mit rechter zwei punkte verbinden (gedrückt halten)
    mit dem grünen pfeil könnt ihr die physic starten und anhalten.
    Dateien
    • engine.rar

      (179,62 kB, 108 mal heruntergeladen, zuletzt: )
  • Ich kenn mich mit gmp nich aus und weiss nicht, ob man so Friction benutzen kann, aber wenn es add_force gibt, wäre ne alternative vielleicht ein add_force in gegengesetzte richtung.
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • friction heißt ja soviel wie trägheit und trägheit ist in der physic ja essentiell, sonst würde sie ja gar nicht funktionieren, also ist es irgendwie klar das es schon so etwas wie friction in gmp gibt.
    Daran kanns also glaub ich nicht liegen.
    Seht euch mal den code von ner ähnlichen engine an, nur halt ohne gmp sondern nur mir gml programmiert:

    var i, thisguy, speedlimit;
    speedlimit = 25;
    motion_add(270,.3);

    i = 0;
    while i<ds_list_size(partners)
    {
    thisguy = ds_list_find_value(partners,i);
    dist = point_distance(thisguy.x,thisguy.y,x,y);
    addspeed = (dist-ds_list_find_value(lengths,i))/10;
    motion_add(point_direction(x,y,thisguy.x,thisguy.y),addspeed);
    i+=1;
    }

    speed *= .98;
    if (speed > speedlimit)
    {
    speed = speedlimit;
    }


    eigentlich ist doch kein unterschied, außer das dieser code funktioniert und meiner nicht.