Objekt soll sich bei Kollision mit Linie zerstören

  • GM 7

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

  • Objekt soll sich bei Kollision mit Linie zerstören

    Hi,

    Also ich hab jetzt so nen Objekt programmiert mit dem man Linien "ziehen" kann (Wie in Paint...also mit der Maus).
    Nun will ich aber dass man mit den Linien auch andere Objekte "durchstreichen" kann und diese sich dann löschen...
    (Das sollte natürlich auch mit mehreren Objekten gehen... Also wenn ich eine Linie durch 5 Objekte zieh dass sich die alle dann löschen)
    Hab bis jetzt aber leider nur des "Linienzieh"-Objekt programmiert:

    Spoiler anzeigen
    Information about object: test1

    Sprite: <no sprite>
    Solid: false
    Visible: true
    Depth: 0
    Persistent: false
    Parent: <no parent>
    Mask: <same as sprite>

    Create Event:
    execute code:

    pressed_mb=false
    mouse_x_prev=0
    mouse_y_prev=0

    Step Event:
    execute code:

    if mouse_check_button_pressed(mb_left) {
    pressed_mb=true
    mouse_x_prev=mouse_x
    mouse_y_prev=mouse_y }
    if mouse_check_button_released(mb_left) {
    pressed_mb=false }

    Draw Event:
    execute code:

    draw_set_color(c_white)
    if pressed_mb=true then {
    draw_line(mouse_x_prev,mouse_y_prev,mouse_x,mouse_y) }
    else {
    }


    Aber jetzt weiß ich nemme weiter wie ich des mit dem "Wenn-Kollision-Mit-Linie-Dann-Ich-Destroy-Mich-Selbst" proggen soll ...
    Kann mir da jmd. auf die Sprünge helfen? Ich glaub das muss man mit Collision_line machen oder? Naja...
    Wer was nützliches weiß kanns ja posten! ;)

    Dankööö
    Ihc hab so voll den ij
  • collision_line(x1,y1,x2,y2,obj,prec,notme) Diese Funktion prüft, ob eine Kollision zwischen dem Liniensegment von (x1,y1) zu (x2,y2) und Instanzen des Objektes obj vorliegt. Dies ist eine mächtige Funktion. Du kannst sie beispielsweise benutzen, um zu prüfen, ob eine Instanz eine andere Instanz "sehen" kann, indem Du prüfst, ob das Liniensegment zwischen den beiden eine Wand schneidet.
    Das gibt (glaub ich) die Id des Objects zurück.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • collision_line(x1,y1,x2,y2,obj,prec,notme)

    Gibt die id des objektes zurück das mit der "unischtbaren collision line" in berührung kommt.

    D.h. im Klartext:

    GML-Quellcode

    1. obj = collision_line(x-x/2,y-y/2,x+x/2,y+y/2,objdaszerstörtwerdensoll,true,true)
    2. if(obj){
    3. with(obj.id){
    4. instance_destroy();
    5. }
    6. }


    hoffe es geht so...


    Gruss
    Xtreme
    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!
  • Ich würde es so machen:

    GML-Quellcode

    1. while (collision_line(x1,y1,x2,y2,obj,true,true)>0)//solange noch eine id zurückgegeben wird (kein negativer wert)
    2. {
    3. with (collision_line(x1,y1,x2,y2,obj,true,true))//mache mit einer der instanzen, die auf der linie liegen folgende aktion...
    4. {
    5. instance_destroy()//...Zerstören
    6. }
    7. }

    Einsetzen:
    x1, y1, x2, y2 sind die Koordinaten der beiden Punkte
    obj ist das Objekt von dem die Instanzen sind oder ein parentobjekt oder all

    Ich denke das passt so :)
    lg peyj
  • So hab jetzt alles gleich gelassen im test1 und in test2 habe ich jetzt im stepevent:

    GML-Quellcode

    1. while (collision_line(test1.mouse_x_prev,test1.mouse_y_prev,mouse_x,mouse_y,test2,true,true)>0)//solange noch eine id zurückgegeben wird (kein negativer wert)
    2. {
    3. with (collision_line(test1.mouse_x_prev,test1.mouse_y_prev,mouse_x,mouse_y,test2,true,true))//mache mit einer der instanzen, die auf der linie liegen folgende aktion...
    4. {
    5. instance_destroy()//...Zerstören
    6. }
    7. }


    Aber das funktioniert nich so wie icke dat will...
    1. Ich brauch keine Linie zuziehen dass die Objekte gelöscht werden
    2. Das letzte Objekt wird nie gelöscht xD

    Wer weiß was falsch is?

    EDIT: *BUGFIXED* xD das Problem dass ich einfach nur über die Objekte drüber fahren muss um sie zulöschen habe ich gelöst in dem ich folgendes geschreiben hab (für die,die es interessiert ;))

    GML-Quellcode

    1. while (collision_line(test1.mouse_x_prev,test1.mouse_y_prev,mouse_x,mouse_y,test2,true,true)>0)//solange noch eine id zurückgegeben wird (kein negativer wert)
    2. {
    3. with (collision_line(test1.mouse_x_prev,test1.mouse_y_prev,mouse_x,mouse_y,test2,true,true))//mache mit einer der instanzen, die auf der linie liegen folgende aktion...
    4. {
    5. if test1.pressed_mb=true
    6. instance_destroy()//...Zerstören
    7. else
    8. {}
    9. }
    10. }


    (Also noch ne Abfrage reingehauen dass es nur löschen soll wenn der Mousebutton gepresst is...)
    Der Code funktioniert SUPER!!!
    Aber wie kann ich programmieren dass die Objekte erst nach dem loslassen des Mousebuttons gelöscht wern?

    DANKE!
    Ihc hab so voll den ij

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Dick-Software Studios ()

  • Mh, schreib:

    GML-Quellcode

    1. if mouse_check_button_released(mb_left)
    2. {
    3. var a;
    4. while (collision_line(test1.mouse_x_prev,test1.mouse_y_prev,mouse_x,mouse_y,test2,true,true)>0)//solange noch eine id zurückgegeben wird (kein negativer wert)
    5. {
    6. with (collision_line(test1.mouse_x_prev,test1.mouse_y_prev,mouse_x,mouse_y,test2,true,true))//mache mit einer der instanzen, die auf der linie liegen folgende aktion...
    7. {
    8. instance_destroy()//...Zerstören
    9. }
    10. }
    Alles anzeigen


    oder tu den code ohne Abfrage in ein global-mouse-released event.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • SUPER!!! DANKE DRAGONGAMER!!! Jetzt funkts xD
    Nur wird jetzt exakt einer nie gelöscht/ist unlöschbar ^^

    EDIT: So ne K**** ! Ich hab jetzt eingestellt das die test2´s sich bewegen und jetzt kann man die aber plötzlich nicht mehr löschen X(
    Ich weiß net was falsch is...

    Hier dat File:

    gm-d.de/wbb/index.php/Attachme…bd60bc591a57eab01afd0b0dd

    EDIT 2: Sogar wenn der Speed von denen = 0 ist... merkwürdig...
    Ihc hab so voll den ij

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Dick-Software Studios ()

  • Hab in meinem Code noch ganz am Schluss eine Klammer vergessen, glaube aber das müsstest du gefixt haben sonst käme ne Fehlermeldung.



    Irgendwas stimmt mit deiner Zip-datei da was nicht. Wenn ich versuche sie zu öffnen kommt ne Fehlermeldung die Datei sei beschädigt...

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • DragonGamer schrieb:

    Irgendwas stimmt mit deiner Zip-datei da was nicht. Wenn ich versuche sie zu öffnen kommt ne Fehlermeldung die Datei sei beschädigt...

    mmh... Ich probiers nochmal xD (testline.zip)
    ansonsten kann ich euch ja einfach sagen was nicht stimmt:
    Also ich hab jetzt dem test2 objekt (das dass man durchstreichen kann)
    ins createevent geschrieben:
    execute code:

    speed_var=5
    set speed to speed_var and direction to point_direction(x,y,test1.x,test1.y)

    Also eine Variable für den speed eingegeben und das Objekt dann mit dieser variable (mit D&D ;D) auf test1 (das mittig des Bildschirms liegt) zulaufen lassen...
    Das funktioniert auch alles aber ich kann test 2 dann nicht mehr durchstreichen (AUCH WENN SPEEDVAR=0 IST!!!) <<<--- das find ich merkwürdig...

    Naja hier nochmal alle Informations:
    test1:
    Spoiler anzeigen
    Information about object: test1

    Sprite: sprite1
    Solid: false
    Visible: true
    Depth: -1
    Persistent: false
    Parent: <no parent>
    Mask: <same as sprite>

    Create Event:
    execute code:

    pressed_mb=false
    mouse_x_prev=0
    mouse_y_prev=0
    field_size=50
    health=100
    create instance of object test2 at position (random(640),random(480))

    Step Event:
    execute code:

    if mouse_check_button_pressed(mb_left) {
    pressed_mb=true
    mouse_x_prev=mouse_x
    mouse_y_prev=mouse_y }
    if mouse_check_button_released(mb_left) {
    pressed_mb=false }

    Draw Event:
    execute code:

    draw_sprite(sprite1,0,x,y)
    draw_set_color(c_white)
    if pressed_mb=true then {
    draw_line_width(mouse_x_prev,mouse_y_prev,mouse_x,mouse_y,1) }
    else {
    }
    draw_set_color(c_red)
    draw_set_alpha(0.5)
    draw_rectangle(x-field_size,y-field_size,x+field_size,y+field_size,false)
    draw_set_color(c_white)
    draw_set_alpha(1)
    draw_set_font(font0)
    draw_text(5,5,'Health: '+string(health))


    test2:
    Spoiler anzeigen
    Information about object: test2

    Sprite: sprite0
    Solid: false
    Visible: true
    Depth: 0
    Persistent: false
    Parent: <no parent>
    Mask: <same as sprite>

    Create Event:
    execute code:

    speed_var=0
    set speed to speed_var and direction to point_direction(x,y,test1.x,test1.y)

    Step Event:
    execute code:

    if mouse_check_button_released(mb_left)
    {
    var a;

    while (collision_line(test1.mouse_x_prev,test1.mouse_y_prev,mouse_x,mouse_y,test2,true,true)>0)//solange noch eine id zurückgegeben wird (kein negativer wert)
    {
    with (collision_line(test1.mouse_x_prev,test1.mouse_y_prev,mouse_x,mouse_y,test2,true,true))//mache mit einer der instanzen, die auf der linie liegen folgende aktion...
    {
    instance_destroy()//...Zerstören
    }
    }
    }



    Danke!
    Ihc hab so voll den ij
  • Hi,

    Habs ausprobiert - das Problem war, dass du notme auf true gesetzt hast - ausserdem gab die while() eine fehlerhafte Rückmeldung. Ich hab es dir korrigiert - es funzt nun - kannst das ja dann noch anpassen.
    Noch zwei Tipps: Da du schon beginnst mit GML zu arbeiten rate ich dir gerade alles komplett in GML zu machen - es ist nicht schwer und viel überischtlicher auch - und du kannst einen grösseren Bereich ansprechen.
    Und ich würde jeweils den Code mit Kommentaren und vorallem mit Tabs oder Leerschlägen formatieren - das ist, vorallem bei Verschachtelungen, extrem mühsam (auch für die leser des Codes, die dir helfen möchten) wenn du es nicht machst.

    Gruss,

    Xtreme

    EDIT: Die 1. while (siehe Code oben) ist unnötig, da wir mit collision line auf das allgemeine objekt zugreiffen hier test2 - d.h. es wird mit with(obj) schon für alle geschaut die auf der Linie sind. Übrigens collision_line gibt -4 zurück wenn keine Kollision stattfindet.

    EDIT2: Ne die mouse_check_button_release ist schon das richtige.
    Dateien
    • testline.zip

      (26,96 kB, 137 mal heruntergeladen, zuletzt: )
    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 3 mal editiert, zuletzt von xx-XtremeX-xx ()

  • 2 Fehler:


    1. das letzte argument der fubktion collision_line ist "notme", das heißt wenn das true ist wird die Instanz die den Code ausführt nicht beachtet, also stell es auf false oder besser lass den test1 object den Code ausführen.


    2. mein fehler, sorry, sorry 1000 mal xD

    hab mouse_check_button_released geschrieben :/ anstelle von mouse_check_button().

    jetzt funktionierts :)



    EDIT: schade zu spät xD

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • BOAHHHH!! DANKÖÖÖ!!!
    Jetzt funktioniert alles endgültig!!!

    Eine Frage hab ich da aber noch... :P
    Was muss ich bei instance_create eingeben wenn ich ein Test2 so erstellen will,dass es außerhalb vom Room created wird aber nicht irgendwo ausserhalb sondern gerade so ausserhalb dass es sich beim bewegen auf das test1-objekt in den Raum bewegt... so ungefähr:

    versteht ihr?
    Ihc hab so voll den ij
  • Versuch mal sowas (ungetestet):

    var a, xx, yy;
    a = choose(1,2,3,4)

    if a = 1
    {
    xx = random(room_width);
    yy = -20;
    }

    if a = 2
    {
    xx = random(room_width);
    yy = room_height+20;
    }

    if a = 3
    {
    xx = -20;
    yy = random(room_height);
    }


    if a = 4
    {
    xx = room_width+20;
    yy = random(room_height);
    }

    instance_create(xx,yy,test2);


    EDIT1:
    Du könntest das Object auch in einem Kreis rund um das Object erstellen lassen. In etwa so:

    xx = test1.x+lengthdir_x(sqrt(sqr(room_width)+sqr(room_height))/2+30,random(360));
    yy = test1.y+lengthdir_x(sqrt(sqr(room_width)+sqr(room_height))/2+30,random(360));
    instance_create(xx,yy,test2);



    EDIT2:

    Ja, aber du kannst in dem anderen Code das "var a;" löschen, ka warum ichs dahin geschrieben hab xD, sorry

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von DragonGamer ()

  • kann ich für "a" auch "b" einsetzen weil du hast mir ja einen Code gegeben der schon "a" enthält ?(

    EDIT: hab "b" eingesetzt funktioniert Klasse!!! Das nenn ich mal ne tolle Engine für ein Game ;) Danke nochmals (btw: choose nicht chose ;) )
    Ihc hab so voll den ij