collision_line....stuff.

  • GM 6

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

  • collision_line....stuff.

    Das Problem ist wie folgt:
    Ich hab einen Laser. Der soll vom obj_wallblock aufgehalten werden. Wo dieses obj_wallblock ist, prüfe ich per

    GML-Quellcode

    1. collision_line(x,y,1280,y,obj_wallblock,1,1)

    Von dem nehm ich mir dann die X-Koordinate, aus der sich dann die Länge des Lasers ergibt.
    Aber: Wenn auf dieser Linie mehrere obj_wallblock liegen, nimmt der sich gern mal den falschen (vermutlich den mit der niedrigeren ID) vor und geht durch den anderen einfach durch. Kann ich dem irgendwie sagen, dass er das näher liegende Objekt nehmen soll von den beiden oder muss ich die Objekte beim Levelbau dann immer in genau der richtigen Reihenfolge setzen?
  • Wäre gut möglich dass collision_line() nur die Instanz mit der niedrigsten ID zurückgibt. Bin mir da jetzt auch nicht sicher und in der Hilfe steht nur "these functions return the id of one of the instances that collide".

    Probiers daher mal mit einer if-abfrage + for-schleife.
    Die If Abfrage um die Richtung des Lasers abzufragen und mit der for-Schleife überprüfst du dann Feld für Feld mit collision_point() in Richtung des Lasers ob es eine Kollision mit obj_wallblock gibt. Damit hast du dann auch die Länge des Lasers.

    mfg
    G
  • Du musst ja nicht jede Zelle Abfragen, sondern nur die vom Ursprungspunkt des Lasers bis zur ersten Kollision.

    Mal angenommen der Laser ist horizontal von links nach rechts,
    ab x=0,
    Raum-Breite = 1024,
    Zellengröße = 32
    --> 1024/32 = maximal 32 Felder die überprüft werden.

    Du musst es auch nicht in jedem Step überprüfen. 1-5 mal pro Sekunde über ein Alarm Event reicht evtl. schon damit es flüssig aussieht.
    Richtig umgesetzt dürfte diese Methode mMn keine Performance-Probleme bereiten.

    Naja, egal. Evtl. hat ja jemand ne bessere Idee wie du's mit collision_line lösen kannst.
  • Eventuell könntest du move_contact_solid verwenden. Du machst dir ein Objekt dessen Kollisionsmaske nur einen Pixel groß ist. Dieses bewegst du dann mit move_contact_solid in die gewünschte Richtung, wobei natürlich nur die Objekte, die den Laser aufhalten können, solid sein dürfen. Da du also lediglich die eine Funktion aufrufen musst, sollte es auch schnell genug sein.
  • Ich habe es bei Hard Recoil folgendermaßen geregelt:

    In einem Script wir mithilfe einer maximalen Distanz auf eine Collisionsline geprüft. Solange diese besteht, wird die Distanz halbiert, besteht sie nicht mehr kann man die Distanz in bestimmten Abständen nach vorn tasten lassen, bis sie wieder besteht.

    © 2008 by Teamgrill Productions

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

  • Hi,

    nur so eine Idee:
    könnte es sein, dass "collision_line" immer das Objekt zurückgibt, welches als erstes die Linie schneidet?
    Das heißt, wenn Dein Laser nach rechts abgefeuert wird, müsstest Du deinen Code nehmen:

    GML-Quellcode

    1. collision_line(x,y,1280,y,obj_wallblock,1,1)


    Soll der Laser jedoch nach links abgefeuert werden, müsstes Die Linie auch anders überprüfen:

    GML-Quellcode

    1. collision_line(x,y,-1280,y,obj_wallblock,1,1)


    Wie gesagt: nur ne Idee; habs auch nicht getestet, weil ich z.Z. keinen GM vor mir hab.
    "Es gibt nie ein glückliches Ende, denn es endet nichts." - Schmendrick

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Klaus C. Haber ()

  • GSlash schrieb:

    Du musst ja nicht jede Zelle Abfragen, sondern nur die vom Ursprungspunkt des Lasers bis zur ersten Kollision.

    Mal angenommen der Laser ist horizontal von links nach rechts,
    ab x=0,
    Raum-Breite = 1024,
    Zellengröße = 32
    --> 1024/32 = maximal 32 Felder die überprüft werden.

    Du musst es auch nicht in jedem Step überprüfen. 1-5 mal pro Sekunde über ein Alarm Event reicht evtl. schon damit es flüssig aussieht.
    Richtig umgesetzt dürfte diese Methode mMn keine Performance-Probleme bereiten.

    Naja, egal. Evtl. hat ja jemand ne bessere Idee wie du's mit collision_line lösen kannst.

    Sir, my sincerest apologies to you. This script:

    GML-Quellcode

    1. //It's "obj_wall" now because obj_wallblock and a few others have it set as parent... and lasers shooting through walls are scary. Gah!
    2. dir = argument0
    3. coll = 0
    4. switch direction {
    5. case 0: while !collision_line(x,y,x+coll,y,obj_wall,1,1) do coll += 32 ;break;
    6. case 90: while !collision_line(x,y,x,y-coll,obj_wall,1,1) do coll += 32 ;break;
    7. case 180: while !collision_line(x,y,x-coll,y,obj_wall,1,1) do coll += 32 ;break;
    8. case 270: while !collision_line(x,y,x,y+coll,obj_wall,1,1) do coll += 32 ;break;
    9. }
    10. return coll

    Utilizes very much what you proposed and does not cause considerable frame rate drops even when put in the step event.

    @Klau Schaber:
    Nein, das alte Script ist immer vom Ursprung des Lasers gen Bildschirmrand gegangen, also wäre der erste Schnitt auch immer der gewesen, der näher am Laser dran ist.