hab ein riesen problem beim anklicken etc...

  • GM 8

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

  • hab ein riesen problem beim anklicken etc...

    hi leute, ich wollte mal auf wunsch meines bruders ein strategiebrettspiel das ich mal entworfen hatte auf gml programmieren.
    aber ich hatte vorher nicht damit gerechnet, was ich da für probleme mit bekomme 8|
    also ich habe mehrere instanzen zweier objekte in einem raum. wenn eine instanz angeklickt wird, soll sie aktiviert sein, und bewegbar sein. man kann insgesammt 5 kästchen laufen. egal mit welcher instance, das heißt ich kann mit 5 verschiedenen instancen einen schritt machen, oder mit einer instanz 5 schritte etc...
    das problem das ich habe ist jetz volgendes, wie aktiviere ich eine einzelne instance? wie deaktiviere ich sie wieder? wie erstelle ich ein raster, indem sich die instanzen bewegen können, und wie begrenze ich die bewegungsreichweite der instancen?

    ich weiß das das eine ganze menge fragen sind, und desshalb frage ich hier nicht wie ich das machen soll, sondern wo ich ein tutorial finde, in dem diese dinge programmiert werden.

    gruß gruen


  • Hab Ansätze für zwei Sachen, falls du die Figuren mit der Maus bewegen lassen willst:

    Das mit dem Raster:

    GML-Quellcode

    1. //a = Breite der Kästchen
    2. x = round(mouse_x/a)*a
    3. y = round(mouse_y/a)*a


    Das mit dem Abstand:
    Beim Clicken speicherst du die ursprünglichen Koordinaten der Figur und prüfst ob der Unterschied kleiner als -5*a oder größer als 5*a ist. Falls es Zutrifft setzt du x auf old_x+5*a usw...
  • hm, ein Tutorial mit genau sowas wird es eher nicht geben befürchte ich...
    Kann dir aber ein paar Fragen beantworten:



    aktivieren/deactivieren

    mach einfach ins mouse left pressed event: global.acti_instance = id;
    wenn du irgendwo die instanz deactivieren (z.b im mouse left released event) willst, mach global.activ_instance = noone;

    du kannst jederzeit überprüfen ob die instanz aktiviert is indem due if id = global.activ_instance abfragst.

    So, nun das hauptproblem mit dem Begrenzen der Bewegung.


    Es kommt darauf an wie dein Spiel sein soll, muss der Spieler erst das feld aussuchen und dann klicken damit das Object dahinspringt?

    wenn ja, dann kommt folgendes ins draw (!) event:

    GML-Quellcode

    1. if id = global.activ_instance
    2. {
    3. xx = mouse_x;
    4. yy = mouse_y;
    5. xx = round(xx/64)*64;
    6. yy = round(yy/64)*64; // 64 ist die Breite bzw höhe des Gitters
    7. draw_set_color(c_red)
    8. draw_rectangle(xx,yy,xx+64,yy+64,false) // hier kannst du auch ein sprite zeichnen lassen um den Player zu zeigen wo das Object nach der Bewegung sein wird
    9. if mouse_check_button_released(mb_left)
    10. {
    11. x = xx;
    12. y = yy;
    13. moves += 1;
    14. }
    15. if moves > 4 global.activ_instance = noone;
    16. }
    17. draw_sprite(sprite_index,image_index,x,y);
    Alles anzeigen




    Hoffe das hilft ;)

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • ja danke erstmal, ich werd mich jetz ma dahinter setzen um zu verstehen wie das ablaufen muss:)


    aber über weitere antworten würde ich mcih freuen :)

    edit:

    ok ich habe mich echt bemüht, aber ich verstehe deinen code leider nicht dragon :(....
    kann mir das einer mal genauer erklähren? ich mein z.B. das xx und yy, das hast du auf mouse_x und mouse_y refferenziert, aber wie soll ich die im create event deklarieren? xx=1;????
    Ich verstehe den code leider auch nicht ganz.

    gruß gruen


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

  • DragonGamer schrieb:

    hm, ein Tutorial mit genau sowas wird es eher nicht geben befürchte ich...
    Kann dir aber ein paar Fragen beantworten:



    aktivieren/deactivieren

    mach einfach ins mouse left pressed event: global.acti_instance = id;
    wenn du irgendwo die instanz deactivieren (z.b im mouse left released event) willst, mach global.activ_instance = noone;

    du kannst jederzeit überprüfen ob die instanz aktiviert is indem due if id = global.activ_instance abfragst.

    So, nun das hauptproblem mit dem Begrenzen der Bewegung.


    Es kommt darauf an wie dein Spiel sein soll, muss der Spieler erst das feld aussuchen und dann klicken damit das Object dahinspringt?

    wenn ja, dann kommt folgendes ins draw (!) event:

    GML-Quellcode

    1. if id = global.activ_instance
    2. {
    3. xx = mouse_x;
    4. yy = mouse_y;
    5. xx = round(xx/64)*64;
    6. yy = round(yy/64)*64; // 64 ist die Breite bzw höhe des Gitters
    7. draw_set_color(c_red)
    8. draw_rectangle(xx,yy,xx+64,yy+64,false) // hier kannst du auch ein sprite zeichnen lassen um den Player zu zeigen wo das Object nach der Bewegung sein wird
    9. if mouse_check_button_released(mb_left)
    10. {
    11. x = xx;
    12. y = yy;
    13. moves += 1;
    14. }
    15. if moves > 4 global.activ_instance = noone;
    16. }
    17. draw_sprite(sprite_index,image_index,x,y);
    Alles anzeigen




    Hoffe das hilft ;)
    leider funktioniert das nicht. der debugmode zeigt auch an, das die variable global.activ_instance immer -4 ist, aber nirgendswo wird sie auf -4 gesetzt. und ändern tut sie sich auch nicht. kann mir einer bitte mal ein kleines beispiel machen, oder zeigen, wie man ganz einfach die angeklickte instance per klick in bewegung setzen kann???
    gruß stef


  • Der code fürs anwählen der Einheit ist nicht in meinem Code gewesen...

    Das musst du selber machen. Einfach schreiben: global.activ_instance = id;

    Egal, hab den Code mal überarbeitet, sollte jetzt praktisch alles enthalten was du brauchst, bzw was du beschrieben hast.

    Das ist alles was du brauchst.



    GML-Quellcode

    1. if id = global.activ_instance // wenn diese Instanz ausgewählt ist
    2. {
    3. if mouse_check_button(mb_left) // wenn der Mausknopf gedrückt ist
    4. {
    5. xx = mouse_x;
    6. yy = mouse_y; // die sekundären coordinaten auf mauscoordinaten sezen
    7. xx = round(xx/64)*64;
    8. yy = round(yy/64)*64; // 64 ist die Breite bzw höhe des Gitters, die Koordinaten werden am Gitter ausgerichtet.
    9. if !(l_x = xx) or !(l_y = yy) // wenn die Koordinaten nicht mit den des letzten steps übereinstimmen, d.h. wenn die Einheit einen Schritt gemacht hat
    10. {
    11. moves += 1; // gemachte schritte erhöhen.
    12. }
    13. l_x = xx;
    14. l_y = yy; // koordinaten werden in die variablen gepeichert um zu prüfen ob object bewegt wurde
    15. draw_set_color(c_red)
    16. draw_rectangle(xx,yy,xx+64,yy+64,false) // hier kannst du auch ein sprite zeichnen lassen um den Player zu zeigen wo das Object nach der Bewegung sein wird
    17. if moves > 4 // wenn mehr als 4 Schritte gemacht wurden.
    18. {
    19. global.activ_instance = noone;
    20. moves = 0;
    21. x = xx;
    22. y = yy;
    23. }
    24. }
    25. }
    26. else // wenn die Instanz nicht angeklickt ist
    27. {
    28. if mouse_check_button_pressed(mb_left) && position_meeting(mouse_x,mouse_y,self) // wenn geklickt wurde und maus darüber ist
    29. {
    30. global.activ_instance = id; // anwählen
    31. }
    32. }
    33. draw_sprite(sprite_index,global.activ_instance = id,x,y); // sprite zeichnen, diese sollte als zweites subimage ein angewählte Version haben. Wenn der ausdruck global.activ_instance = id true ist (also = 1, angewählt) wird das zweite bild gezeichnet, sonst das erste (0)
    Alles anzeigen


    EDIT:

    ok, ich habs mal ein wenig beschrifftet. Ins creation event reicht es wenn du schreibst:

    global.activ_instance = noone;
    xx = x;
    yy = y;
    l_x = 0;
    l_y = 0;
    moves = 0;

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

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

  • @Dragon

    vielen dank das du dir die zeit genommen hast mir das mal zu zeigen. funktioniert auch. muss den noch anpassen, weils noch nicht ganz so funktioniert wie ichs wollte, aber das sollte ich jetzt auch ohne größere probleme hinbekommen :).

    Danke nochmal :)

    p.s. währ mal ne gute idee ein tutorial dafür zu machen. wenn ich des am ende drauf hab, mach ich des vermutlich mal :)

    gruß gruen


  • Benutzer online 2

    2 Besucher