Würde gerne etwas lernen

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

  • Würde gerne etwas lernen

    hy freunde


    also ich würde gerne etwas neues lernen und zwar wie man mit der maus zb wenn man gedrückt hält ein rechteck erzeugt das die größe verändert.
    bei manchen spielen wird sowas verwendet um mehrere instanzen auszuwählen..

    ist nur aus interesse .
    weil ich das zufällig in einem spanischen tutorial gesehn hab aber leider war die quali so schlecht das man es sich nicht wirklich anschauen konnte.
  • Das geht ganz einfach, wenn du klickst speicherst du die Koordinaten an der sich die maus gerade befindet (zB klickX = mouse_x) und dass der Spieler vielleicht die taste gedrückt lassen wird(mbHold = true). Wenn der Spieler dann die Maustaste dann immernoch drückt und mbHold true ist dann lässt du mit draw_rectangle ein rechteck von den klickKoordinaten zu den Mauskoordinaten zeichnen.
    Wenn der Spieler die Maustaste loslässt, dann wird mbHold auf false gesetzt und damit das drawen unterbrochen.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • @Atomicmaster das finde ich persönlich sehr unsauber ^^
    Du kannst auch einfacher point_in_rectangle benutzen und evtl das Rechteck für die jeweilige Instanz um bbox_* vergrößern und eine unpräzise aber ausreichende Kollisionsüberprüfung bewerkstelligen. ;)

    @acidrain833
    Benutze mal bessere Titel :)
    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
  • @Aku_Ryou


    hy danke für deine tolle antwort und ich habs probiert jedoch fängt er das rechteck immer in der oberen ecke an egal wo ich klicke..aber das ziehen geht...

    hier mein code

    obj_rechteck
    create event

    GML-Quellcode

    1. x = mouse_x;
    2. y = mouse_y;
    3. mbhold = false;



    obj_rechteck
    step event

    GML-Quellcode

    1. if mouse_check_button(mb_left)
    2. {
    3. mbhold = true;
    4. klick_x = x;
    5. klick_y = y;
    6. }
    7. else
    8. {
    9. mbhold = false;
    10. }



    obj_rechteck
    draw event

    GML-Quellcode

    1. if (mbhold)
    2. {
    3. draw_rectangle(klick_x,klick_y,mouse_x,mouse_y,true);
    4. }




    was mach ich falsch??

    und kannst mir noch jemand erklären wie man damit mehrere instanzen wählen kann?

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

  • ah ok versteh was du meinst.....aber leider nicht was du mit checked meinst.
    aber danke du bist wirklich einer der besten hier..immer nett und hilfsbereit....+1 :) Schleim,Schleim


    EDIT: habs hinbekommen...war eigentlich ganz einfach....danke aku....

    jetzt muss ich nur mehr herausfinden wie man das mit dem markieren am besten machen kann.

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

  • Die instanzen brauchen eine variable ob sie ausgewählt worden sind oder nicht, nur wenn diese variable true ist hören sie auf deine bewegungsbefehle etc.
    Es gibt ganz viele Möglichkeiten wie du rausfiltern kannst welche instancen sich in deinem Auswahlrechteck befinden.

    Du könntest zB alle Instancen außerhalb des Rechtecks deaktivieren, dann allen anderen instancen wenn sie das parent auswählbar haben die variable auf true stellen und dann wieder alle instancen aktivieren. (instance_deactivate_region, instance_activate_all)

    Du kannst ein obj stretchen, dass bei Kollision in allen kollidierten instances die var auf true stellt

    Du fragst alle Instances ob ihre koordinaten ein point_in_rectangle sind.

    usw. es wäre aber vorallem gut wenn du die IDs der ausgewählten instancen in einer list speicherst damit du dann besser mit ihnen umgehen kannst (spezialfähigkeiten, einheitenformation etc)
    die "richtige" methode ist einfach sehr stark davon abhängig wie du bis jetzt mit den einheiten umgehst, den Fog of war machst, instances deaktivierst usw.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Ich würde auf jeden Fall point_in_rectangle bevorzugen.
    Beispielsweise muss man dazu einfach nur diesen Code benutzen:

    GML-Quellcode

    1. //mx1,my1 (Position der Maus beim eindrücken)
    2. //mx2,my2 (Position der Maus beim loslassen)
    3. with(deinObjekt){
    4. selected = false;
    5. if(point_in_rectanagle(x,y, mx1,my1, mx2,my2))
    6. selected = true;
    7. }


    Am Rande: Variablen können im With-Statement vom eigentlichen Objekt übernommen werden:

    GML-Quellcode

    1. variable = "bla";
    2. with(object){
    3. //hier kannst du 'variable' auch benutzen, wenn sie nicht im 'With-Objekt' (nenn ich einfach mal so) schon definiert ist
    4. }
    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
  • irgendwie mach ich was falsch es geht nicht....also hier mal mein code:

    obj_mouse
    step event

    GML-Quellcode

    1. //speichere die koordinaten beim pressen
    2. x = mouse_x;
    3. y = mouse_y;
    4. if mouse_check_button_pressed(mb_right)
    5. {
    6. klick_x = mouse_x;
    7. klick_y = mouse_y;
    8. }
    9. if mouse_check_button(mb_right)
    10. {
    11. klickend_x = mouse_x;
    12. klickend_y = mouse_y;
    13. mbhold = true;
    14. }
    15. else
    16. {
    17. mbhold = false;
    18. }
    Alles anzeigen



    obj_mouse
    draw event

    GML-Quellcode

    1. // zeichne das auswahlrechteck
    2. if (mbhold)
    3. {
    4. draw_set_color(c_lime);
    5. draw_set_alpha(1);
    6. draw_rectangle(klick_x,klick_y,klickend_x,klickend_y,true);
    7. draw_set_alpha(0.2);
    8. draw_rectangle(klick_x,klick_y,klickend_x,klickend_y,false);
    9. draw_set_alpha(1);
    10. }
    Alles anzeigen


    obj_controller
    global mouse left pressed

    GML-Quellcode

    1. // Obj controller ist als parent bei den schiffen also beim worker und fighter
    2. ​if (selected)
    3. {
    4. if (target != -1 && instance_exists(target))
    5. {
    6. with (target) instance_destroy();
    7. }
    8. target = instance_create(mouse_x, mouse_y, obj_target);
    9. state = 'move'
    10. }
    Alles anzeigen



    obj_controller
    global mouse left released

    GML-Quellcode

    1. ​if (instance_exists(obj_mouse))
    2. {
    3. scr_select();
    4. }




    obj_controller
    draw event

    GML-Quellcode

    1. // zeichne einen kreis um die schiffe wenn sie ausgewählt sind
    2. if (selected)
    3. {
    4. draw_set_colour(c_blue);
    5. draw_set_alpha(1);
    6. draw_circle(x,y,120,true);
    7. draw_set_alpha(0.2);
    8. draw_circle(x,y,120,false);
    9. draw_set_alpha(1);
    10. }
    Alles anzeigen


    scr_select

    GML-Quellcode

    1. //überprüfe ob ein schiff im rechteck ist
    2. with (obj_controller)
    3. {
    4. selected = false;
    5. if point_in_rectangle(x,y,klick_x,klick_y,klickend_x,klickend_y)
    6. {
    7. selected = true;
    8. }
    9. }



    beschreibung in den codes......was mach ich falsch...wsie werden einfach nciht ausgewählt