Maus über Sprite - collisionscheck

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

  • Guten Abend!

    -> Also ein Objekt hat doch die Events: MOUSE_ENTER oder MOUSE_LEAVE.

    -> Im Step könntest du doch die akt. Mausposition mit der Sprite-Position prüfen.

    z.B.
    if( ( mouse_x > spr.x && mouse_x < spr.x + sprite_get_width(spr) ) && ( mouse_y > spr.y && mouse_y < spr.y + sprite_get_height(spr) ) )
    {
    ...
    }

    ...Natürlich könntest du auch noch die Origin (sprite_get_xoffset(index) oder sprite_get_yoffset(index) )
    und die Kollisionsmaske des Sprites in die Abfrage einbauen.
    var ww, hh;
    ww = sprite_get_bbox_left(sprite_index) - sprite_get_bbox_right(sprite_index);
    hh = sprite_get_bbox_bottom(sprite_index) - sprite_get_bbox_top(sprite_index);

    Das müsstest du bei Bedarf in die Abfrage einbauen.

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

  • Einen schönen Abend der Herr

    Das Problem bei MOUSE_ENTER oder MOUSE_LEAVE ist, dass es nur bei der Maske ist welche für die Berührung der Spielfigur gebraucht wird.

    Wir sind auf der ähnlichen Spur, ich versuchs mit der collisions_rectancle, aber es passt nicht ganz.
    Zum sehen wo die Collisions-Linien sind habe ich im Draw-Event mal diesen Code laufen:

    GML-Quellcode

    1. xoff = sprite_get_xoffset(sprite_index);
    2. yoff = sprite_get_yoffset(sprite_index);
    3. xwidth = sprite_get_width(sprite_index);
    4. yheight = sprite_get_height(sprite_index);
    5. draw_rectangle(x-xoff, y-yoff, x-xoff+xwidth, y-yoff+yheight, true)


    aber so siehts dann aus:

    Siehst du grüne Linie, die ist zu klein

    EDIT: oooh ja klar ist es zu klein. Ich habe das Objekt im Raum skaliert (vergrössert).
    Somit muss ich mit sprite_width + sprite_height arbeiten.

    GML-Quellcode

    1. draw_rectangle(x-sprite_width/2, y-(sprite_height/2), x-(sprite_width/2)+sprite_width, y-(sprite_height/2)+sprite_height, true)

    Nur ein Problem habe ich noch, die Origin des Sprite ist nicht genau zentriert. Wie kann ich somit die diffirenz von x zu sprite_get_xoffset messen? Damit das Rechteck ganz das Sprite richtig umschliesst.
    huhu

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

  • Brodi schrieb:


    GML-Quellcode

    1. xoff = sprite_get_xoffset(sprite_index);
    2. yoff = sprite_get_yoffset(sprite_index);
    3. xwidth = sprite_get_width(sprite_index);
    4. yheight = sprite_get_height(sprite_index);
    5. draw_rectangle(x-xoff, y-yoff, x-xoff+xwidth, y-yoff+yheight, true)


    Hallo,
    Wäre es nicht einfacher die eingebauten variablen:

    Quellcode

    1. bbox_left
    2. bbox_top
    3. bbox_right
    4. bbox_bottom

    zu benutzen? Oder ist das nur ein Sprite ohne Objekt?
  • Simon Gust schrieb:


    Hallo,
    Wäre es nicht einfacher die eingebauten variablen:

    Quellcode

    1. bbox_left
    2. bbox_top
    3. bbox_right
    4. bbox_bottom

    zu benutzen? Oder ist das nur ein Sprite ohne Objekt?


    Habe bisher noch nie bbox verwendet, aber genau das richtige eingebaute Hilfsmittel das ich jetzt dafür brauche. Hab mir gerade komplizierte mathematische Formel ausgedacht um mit sprite_height, sprite_get_height und der Y-Origin den skalierungsfaktor auszurechnen um den Versatz herauszubekommen.
    Dabei gehts ja so einfach jetzt:

    GML-Quellcode

    1. draw_rectangle(bbox_left, bbox_bottom-sprite_height, bbox_right, bbox_bottom, true)


    Danke Dir Simon <3 <3 <3


    huhu

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

  • Warum nicht Global:

    Quellcode

    1. offset_x = sprite_get_xoffset(bear);
    2. offset_y = sprite_get_yoffset(bear);
    3. draw_rectangle(bear.x-offset_x, bear.y-offset_y, bear.x+sprite_get_width(bear)-offset_x, bear.y+sprite_get_height(bear)-offset_y, true);


    Für dein Skalierungsproblem müsstest du noch den Return von "image_xscale" und "image_yscale" mit einbeziehen.

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

  • Brodi schrieb:


    Habe bisher noch nie bbox verwendet.

    So Funktionen wie place_meeting oder distance_to_object benutzen die bbox variablen.
    Für mein array-collision System brauche ich die bbox auch.
    Und ich glaub da gibts noch weitere Instanzen wo das ganz nützlich ist.
    Dumm nur das ich mein gesamtes Menu ohne Objekte für Buttons programmiert habe X/
  • Weihnachtswichtel schrieb:

    Wieso benutzt du die x und y Koordinaten deines Players als Bezugspunkt?

    Außerdem wäre dein x oder y je nach Standpunkt des Players falsch gesetzt.

    So wäre es nach deiner Methode mit Origin (z.B. 16):

    Quellcode

    1. draw_rectangle(x-sprite_width/2-16, y-(sprite_height/2)-16, x-(sprite_width/2)+sprite_width-16, y-(sprite_height/2)+sprite_height-16, true);


    Aber das ist doch Mist!

    Warum nicht Global:

    Quellcode

    1. offset_x = sprite_get_xoffset(bear);
    2. offset_y = sprite_get_yoffset(bear);
    3. draw_rectangle(bear.x-offset_x, bear.y-offset_y, bear.x+sprite_get_width(bear)-offset_x, bear.y+sprite_get_height(bear)-offset_y, true);


    Habe nie den Player als Standpunkt genommen. Habe ich wohl besser am Anfang sagen sollen.
    Dieser Bär ist ein Objekt mit einem Sprite, dessen Collisions-Maske im Sockel unten gewidmet ist. Damit der Player auch hinten durchlaufen kann. Für die Maus brauchte ich die andere Kollisionsabfrage.

    Eine neue Frage! 8o
    Ist es auch möglich eine pixel-perfekt collisions abfrage zu machen, unabhängig von der Maske (weil die ja schon im gebrauch ist) ?
    huhu

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

  • Brodi schrieb:


    Eine neue Frage!
    Ist es auch möglich eine pixel-perfekt collisions abfrage zu machen, unabhängig von der Maske (weil die ja schon im gebrauch ist) ?


    Hmm, kannst nur eine Kollisionsmaske haben, aber du könntest ein Zweites Objekt drüberstülpen welches für die Prezisionsabfrage zuständig ist.
  • Weihnachtswichtel schrieb:

    @Brodi:

    Aber das könntest du mit "image_xscale" / "image_yscale" viel einfacher und besser.


    Aaaaah haha stimmt, ja das wären die Skalierungs-werte die ich einfach hätte dazu rechnen können. Das wäre die Lösung gewesen die ich suchte, anstelle von bbox. :headtouch:

    Simon Gust schrieb:

    Brodi schrieb:

    Eine neue Frage! Ist es auch möglich eine pixel-perfekt collisions abfrage zu machen, unabhängig von der Maske (weil die ja schon im gebrauch ist) ?
    Hmm, kannst nur eine Kollisionsmaske haben, aber du könntest ein Zweites Objekt drüberstülpen welches für die Prezisionsabfrage zuständig ist.


    Jo das wärs. Habe bisher auch keine andere Möglichkeit herausgefunden. Merci
    huhu

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