Kollisionsmaske muss bei größer werdendem Objekt unverändert bleiben

  • GM 8

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

  • Kollisionsmaske muss bei größer werdendem Objekt unverändert bleiben

    Hallo,

    ich arbeite momentan an einer Weltkarte, die ich für ein Projekt brauche und da habe ich ein Problem mit dem mouseover Effekt.

    Ich habe ein Script geschrieben, dass automatisch das Land aufleuchten und etwas größer werden lässt, auf dem man sich gerade mit der Maus befindet und beim verlassen wieder in der Ursprungszustand versetzt.

    Mein Problem ist nun, dass beim größer werden auch die Kollisionsmaske sich ändert und ich dann bei einigen Ländern so ne endlosschleife kriege (mouseover-mouseout-mouseover-mouseout...). Deswegen möchte ich gerne das Bild größer machen (auf 120%), aber die Kollisionsmaske soll bleiben, wie sie ist, um so eine exakte Bedienung zu ermöglichen.

    Kann mir da jemand weiter helfen?

    Gruß
  • Wie genau skalierst du das jeweilige Objekt?
    Das einfachste wäre es im Draw-Event die Grafik zu zeichnen und dort den Skalierungswert ändern. Diese Skallierung würde dann nähmlich keine Auswirkungen auf die Maske haben.
    Kurzgesagt: Skaliere nicht das Objekt, sondern die Grafik im Draw-Event.
  • Ja, indirekt.
    Mach es halt so:
    Dann ändert sich die Größe bei "betreten" und verlassen.

    Mouse Enter

    GML-Quellcode

    1. image_xscale = 2
    2. image_yscale = 2


    Mouse Leave

    GML-Quellcode

    1. image_xscale = 1
    2. image_yscale = 1


    EDIT (07.01.12, 18:55):

    HALT STOPP.
    Kommando zurück.

    image_xscale und image_yscale beeinflussen auch die Collision events.
    Benutze stattdessen eine eigene Variable und Im Draw Event dann
    draw_sprite_ext

    EDIT2 (07.01.12, 18:56): Rechtschreibkorrektur

    EDIT3 : (07.01.12, 19:07):
    Hier ist der verbesserte Code:

    Create Event

    GML-Quellcode

    1. scale = 1


    Step Event:

    GML-Quellcode

    1. if (collision_point(mouse_x,mouse_y,self,1,0))
    2. {
    3. if scale < 2
    4. {
    5. scale += 0.08
    6. }
    7. }
    8. else
    9. {
    10. if scale > 1
    11. {
    12. scale -= 0.08
    13. }
    14. }
    Alles anzeigen


    Draw Event:

    GML-Quellcode

    1. draw_sprite_ext(sprite_index,image_index,x,y,sacle,scale,0,c_white,1)


    EDIT4 :
    LEWA's Code ist ways better.
    Da stimmt alles, nimm den.

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

  • Variable definieren: (Create-event)

    GML-Quellcode

    1. scale = 1;


    beim hochskalieren:

    GML-Quellcode

    1. if (scale < 2.2) {
    2. scale += 0.08;
    3. }


    beim zeichnen (im draw-event)

    GML-Quellcode

    1. var deinsprite;
    2. deinsprite = spr_beispiel;
    3. draw_sprite_ext(deinsprite,-1,x-(sprite_get_width(deinsprite)/2),y-(sprite_get_height(deinsprite)/2),scale,scale,0,c_white,1);


    bei der Variable "deinsprite" einfach den Spritenamen der gezeichnet werden soll eingeben. ;)

    /Edit: Ups, könnte sein dass sich der Origin beim zeichnen verschiebt. X(
    Habs ausgebessert, weiss aber nicht ob das mit dem Origin jetzt auch funktioniert.

    Falls der Obere draw-befehl bei dir Originprobleme verursacht, versuch den hier:

    Spoiler anzeigen

    GML-Quellcode

    1. var deinsprite;
    2. deinsprite = spr_beispiel;
    3. draw_sprite_ext(deinsprite,-1,x-(sprite_get_width(deinsprite)*scale/2),y-(sprite_get_height(deinsprite)*scale/2),scale,scale,0,c_white,1);


    Die Origin deines Sprites sollte dabei immer auf x=0 und y= 0 bleiben. Der Script übernimmt die Originpositionierung automatisch.

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

  • Hallo Shapow,

    also so funktioniert es:

    GML-Quellcode

    1. if (position_meeting(mouse_x, mouse_y, object_index)) {
    2. draw_sprite_stretched( germany, 1, x, y, sprite_width*1.2, sprite_height*1.2 );
    3. }
    4. else {
    5. draw_sprite_stretched( germany, 0, x, y, sprite_width, sprite_height );
    6. }


    Jetzt habe ich aber Probleme mit dem Origin Wert. Also ich habe den immer recht zentiert gelegt, damit er bei der Animation in alle Richtungen wächst. Nun ist es aber so, dass er die neue Grafik falsch positioniert.

    Gruß


    EDIT:
    Genau mit dem Origin hab ich jetzt Probleme^^ Aber ich teste mal eben deins...
  • Bei mir ist der Origin Wert aber nicht 100%ig mittig, ist das ein Problem? Ich könnte die notfalls alle mittig setzen.


    ? Inwiefern meinst du das?
    Bei den Scripts oben brauchst du bei deinen Sprites den Originwert garnicht mittig zu setzen. Belass ihn einfach auf den Default einstellungen.
    Der Script berechnet sich selber die Mitte aus der Sprite höhe und breite und zeichnet ihn entsprechend so, als ob er die Origin mittig gesetzt hätte.
  • OKay, das war ein Irrtum. Hatte versehentlich noch eine Zeile drin, die das ausgangsbild falsch positioniert hat.

    Die Kollision ist jetzt aber fehlerhaft. Er reagiert nur, wenn ich mich UNTERHALB des Bildes befinde, nicht mehr auf dem Bild.

    Welche Abfrage ist besser:

    if (position_meeting(mouse_x, mouse_y, object_index))
    oder
    if (collision_point(mouse_x,mouse_y,self,1,0))

    Gruß


    EDIT:
    So klappt's:

    Origin CENTER;
    draw_sprite_ext(sprite, subImage, x, y, scale, scale, 0, c_white, 1);

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

  • Vllt kann mir noch jemand sagen, was besser ist:
    if (position_meeting(mouse_x, mouse_y, object_index))
    oder
    if (collision_point(mouse_x,mouse_y,self,1,0))

    Gruß

    Wenn dir bei position_meeting drei Argumente reichen würde ich tippen die zu nehmen...
    collision_point besitzt mehr Argumente deshalb nehme mal das erste, so vermute ich es mal. Oft kann aber eine Funktion trotzdem langsamer sein als die andere. Kuck am besten in der Game Maker Hilfe 6.1 nach.
    vielleicht wirst du fündig ;) oder stöber mal in alten Threads, da kannst du solche fragen auch finden ;)

    MFG: mar96k
  • koMan kann ja auch bei collision_point das
    "Precise checking" auf 0, also false stellen, dann is die funktion zwar ungenauer,
    aber wesentlich schneller. Soetwas musst du dich aber eigentlich nur fragen, wenn der
    Objektcount über 200 drüber geht. (Extrem schlechte PCs können dann nicht/nur knapp
    über 40 Bilder kommen)

    EDIT: 400ster Post, yiey!

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

  • Ja, bei mir ist das ja so, dass ich die Weltkarte für den Browser mache, also GameMaker:HTML5.
    Und da hab ich das Problem, dass der transparente Bereich von PNGs nur per Kollisonscheck gefunden werden kann. MouseEnter reagiert nämlich auch auf dem transparenten Bereich der PNGs und bei einigen Ländern ist das echt mies^^

    Ich werd mal dieses NICHT präzise testen, vllt reicht das schon aus. Weil mir geht es nicht um die Umrandung der Länder, sondern dass der MouseOver erkannt wird. Er sollte halt nur nicht außerhalb erkannt werden.