Objekt Frei mit der Maus Bewegen

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

  • if!(mouse_check_button_released(mb_left)){
    if(mouse_check_button(mb_left)) and (position_meeting(x,y,self)){
    x=mouse_x;
    y=mouse_y;
    }
    }

    das ins objekt das gesteuert werden soll. teste das mal

    edit: sollte auch ohne mouse_check_button_released gehen.habs nur vorsichtshalber mit reingeschrieben.


  • Dann habe ich ja bereits schon das richtige geschrieben.

    Step Event:

    GML-Quellcode

    1. if (mouse_check_button(mb_left))
    2. {
    3. direction = point_direction(x, y, mouse_x, mouse_y);
    4. speed = 4;
    5. }
    6. else
    7. {
    8. speed = 0;
    9. }


    Du könntest jetzt noch dein Objekt in die Richtung drehen, in der es gehen soll mit: image_angle = direction;
    Das wäre zumindest der Vorteil, wenn du das ganze mit point_direction löst. Ansonsten würde move_towards_point auch zum gewünschten Ergebnis führen.

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

  • SmiaGOLD schrieb:

    Ich hab das eher so verstanden, dass er sowas will:

    GML-Quellcode

    1. ​if mouse_check_button(mb_left)
    2. {
    3. move_towards_point(mouse_x, mouse_y, 5);
    4. }
    5. else
    6. speed = 0;


    hab ich auch erst gedacht. aber der letzte satz hat mich vom gegenteil überzeugt: :)

    Ich meinte es so, wenn man z.B die Linke maus Taste Gedrückt hält, soll sich das Objekt Bewegen können.
    Und wenn ich aufhöre die Linke Maus Taste gedrückt zu halten, soll das Objekt da sein, wo ich es zuvor mit der Maus hinbewegt habe.


    aber wie auch immer, er hat jetzt die freie wahl


  • Ich hab's sonst nochmal etwas überarbeitet, damit der Spieler, wenn er quasi auf der Maus ist, nicht so rumzappelt. Kennt man ja vom Game Maker, dann ist das mit den Positionen ungenau und er will in jede Richtung hin :D

    Das hier gibt dem Spieler ein wenig Puffer zur Maus-Position. Du kannst selbstverständlich die Werte ( x -+ 10 und y -+10 ) individuell anpassen.

    GML-Quellcode

    1. if ((mouse_check_button(mb_left)) && ((mouse_x > x + 10 || mouse_x < x - 10) && (mouse_y > y + 10 || mouse_y < y - 10)))
    2. {
    3. direction = point_direction(x, y, mouse_x, mouse_y);
    4. image_angle = direction;
    5. speed = 8;
    6. }
    7. else
    8. {
    9. speed = 0;
    10. }
  • Cool Danke Leute! Für diese vielen Tipps! :)

    Noch eine kurze Frage, Aktuell ist es so bei mir, das wenn ich ein Objekt mit der Maus Bewegen möchte, er das auch macht.
    Aber wenn zwei Objekte die selbe Funktionen haben, Bewegen sich beide.(liegt vielleicht am Step Even? ?( ) Ich möchte, nur wenn quasi der Maus Zeiger das Objekt berührt, es sich Bewegen lässt.

    Aber wenn das zu schwierig oder nicht machbar ist, dann ist dass auch kein Problem! :)
    Dann werde ich das so lassen. Also Danke nochmal! :D
  • als erstes solltest du uns mal darüber aufklären was du jetzt genau willst. wie du gesehen hast besteht uneinigkeit darüber.

    willst du das dein Objekt mit der maus aktiviert wird und dann in richtung deiner maus fliegt. dann würde es deiner maus mit einer festgelegten geschwindigkeit folgen.

    oder willst du das objekt per Drag and Drop bewegen, also anfassen irgendwo hinziehen und dann loslassen.

    letzteres sollte eigentlich mit meinem code funktionieren


  • Letzteres.... Aber leider hat es nicht ganz Funkioniert, denn das Objekt Folgt der Maus nur, und es ist egal wo ich hinklicke, das Objekt wird immer wieder Aktiviert und Bewegt sich richtung Maus. Und es soll ja, wie du schon geschrieben hast, sich nur bewegen wenn man das Objekt mit der Maus anklickt und sich dann Frei Bewegen lassen.
  • Falls es darum geht das beide Objekte übereinander liegen,du könntest das lösen indem du zwei Objekten erstmals unterschiedliche Tiefen über

    GML-Quellcode

    1. ​object_set_depth
    zuweist. Nun kannst du abfragen welches Objekt über dem andren liegt

    GML-Quellcode

    1. if (position_meeting(mouse_x,mouse_y,self))
    2. {
    3. if (Depth<other.Depth){tue etwas}

    So kannst du sicher gehen das nur das drüber liegende Objekt bewegt wird.
  • Der Nörgler kommt vorbei :D

    @steven919
    depth wird klein geschrieben,
    other wird nicht von position_meeting bereitgestellt. Da musst du schon die ID über instance_position holen,
    man kann da noch eine weitere Abfrage machen, ob die depth bei beiden gleich ist. Dann ist das weiter oben, wo die ID größer ist.

    @icqgamer
    Man kann dieses rum gezappel leicht einfacher lösen:

    GML-Quellcode

    1. if (... abs(mouse_x-x) < 10 && abs(mouse_y-y) < 10)
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Husi012 schrieb:

    Der Nörgler kommt vorbei :D

    @steven919
    depth wird klein geschrieben,
    other wird nicht von position_meeting bereitgestellt. Da musst du schon die ID über instance_position holen,
    man kann da noch eine weitere Abfrage machen, ob die depth bei beiden gleich ist. Dann ist das weiter oben, wo die ID größer ist.

    @icqgamer
    Man kann dieses rum gezappel leicht einfacher lösen:

    GML-Quellcode

    1. if (... abs(mouse_x-x) < 10 && abs(mouse_y-y) < 10)


    Hast recht, ich weiß ja nicht was er genau braucht, er wird ja merken das man depth klein schreibt :P Er kann auch eine Variable im Objekt erstellen und den depth wert übergeben dann wird es eben vardepth.other . Ich nutze other erfolgreich in position_meeting, du meist wahrscheinlich depth wird nicht bereitgestellt?
  • Soweit ich denken kann, wird other nur vom collision event bereitgestellt.
    In den Docs steht auch, dass man instance_place nur nutzen soll, wenn man die Id auch wirklich braucht, da die Funktion etwas langsamer ist.
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Husi012 schrieb:

    Soweit ich denken kann, wird other nur vom collision event bereitgestellt.
    In den Docs steht auch, dass man instance_place nur nutzen soll, wenn man die Id auch wirklich braucht, da die Funktion etwas langsamer ist.


    Hmm gibt hier im Forum sogar ein Beispiel damit aus dem jahr 2012 Objekte übereinander nicht anklicken
  • Ich würde das einfach mit einem controlobjekt lösen

    GML-Quellcode

    1. // in obj_dnd_control
    2. //create:
    3. selected = noone;
    4. //step
    5. if (mouse_check_button_pressed(mb_left)) {
    6. selected = instance_position(mouse_x,mouse_y,obj_movable);
    7. }
    8. if (mouse_check_button_released(mb_left)) {
    9. selected = noone;
    10. }
    11. with (selected) {
    12. //dein drag code
    13. //beispiel:
    14. x = round(mouse_x);
    15. y = round(mouse_y);
    16. }
    Alles anzeigen
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
  • @steven919
    Dann ist dort der Code falsch. Ich zitiere aus den docs docs.yoyogames.com/source/dadi…isions/place_meeting.html
    Please note that should you need to get the unique instance id of the object being collided with, you should use instance_place.
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • ok wenn das nicht funktioniert mach folgendes. Das funktioniert sicher.


    das objekt das bewegt werden soll nenne ich obj_player

    create

    Quellcode

    1. mouseover=false; // checkt ob die Maus über dem objekt steht und durch linksklick aktiviert ist


    step

    Quellcode

    1. if(position_meeting(mouse_x,mouse_y,self)){
    2. if(mouse_check_button(mb_left)){
    3. mouseover=true;}
    4. if(mouse_check_button_released(mb_left)){
    5. mouseover=false;}}
    6. else if!(position_meeting(mouse_x,mouse_y,self)) and (mouseover=true){
    7. mouseover=false;}


    draw

    Quellcode

    1. if(mouseover=true){
    2. with(instance_nearest(mouse_x,mouse_y,self)){
    3. x=mouse_x;
    4. y=mouse_y;
    5. }}