Problem mit Ansteuerung von Sessions in ds_list

  • GM 7

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

  • Problem mit Ansteuerung von Sessions in ds_list

    Hallo,

    ich bin neu hier und habe gleich eine Frage. Ich programmieren gerade an einer StarWars-Simulation und sitze schon viele Stunden daran, auch wenn der Output nich recht armselig ist. Im Moment stehe ich vor einem Problem mit ds_list. Es können mit der Maus Einheiten markiert werden, welche dann in einer Liste namens global.stack landen. Bei der Darstellung der Grafik wird dann geprüft, ob die aktuelle Einheit in der Liste aufgeführt ist. Nun möchte ich aber mehrere Einheiten gleichzeitig bewegen. Bis jetzt wird nur die letzte, in global.selection gespeicherte Einheit bewegt.

    Die Auswahl erfolgt mittels Global Left Pressed.

    GML-Quellcode

    1. if (instance_position(mouse_x,mouse_y,obj_unit) != noone) //obj_unit ist Grundobjekt aller Einheiten
    2. {
    3. if (not keyboard_check(vk_shift)) // Shift zur Mehrfachauswahl
    4. {
    5. ds_list_clear(global.stack);
    6. }
    7. ds_list_add(global.stack,instance_position(mouse_x,mouse_y,obj_unit));
    8. global.selected = instance_position(mouse_x,mouse_y,obj_unit);
    9. sound_play(snd_select);
    10. } else {
    11. if (not ds_list_empty(global.stack))
    12. {
    13. ds_list_clear(global.stack);
    14. global.selected = noone;
    15. //sound_play(snd_unselect);
    16. }
    17. }
    Alles anzeigen


    Wenn ich z.B. eine der Einheiten zeichne, geschieht das so:

    GML-Quellcode

    1. // Aktionen wenn ausgewählt
    2. if (ds_list_find_index(global.stack,id)<>-1) // Test, ob in Liste
    3. {
    4. draw_set_blend_mode(bm_normal)
    5. draw_sprite_ext(sprite_index,-1,x,y,1,1,angle,c_red,1);
    6. draw_set_blend_mode(bm_normal)
    7. draw_set_color(c_blue);
    8. draw_set_alpha(0.1);
    9. if (ds_list_size(global.stack) > 1)&& (global.selected == id)
    10. {
    11. draw_set_color(c_green);
    12. }
    13. draw_circle(x,y,range,false);
    14. draw_set_alpha(0.5);
    15. if (mouse_check_button(mb_right) == true)
    16. {
    17. draw_set_alpha(1);
    18. }
    19. draw_arrow(x,y,tox,toy,20);
    20. } else {
    21. draw_sprite_ext(sprite_index,-1,x,y,1,1,angle,c_white,1);
    22. draw_set_color(c_red);
    23. draw_set_alpha(0.3);
    24. draw_arrow(x,y,tox,toy,10);
    25. }
    26. // Lebensleiste anzeigen
    27. draw_set_alpha(0.8);
    28. //show_debug_message(sprite_yoffset);
    29. draw_healthbar(x-sprite_width,y-sprite_height,x+sprite_width,y-sprite_height+5,points,c_black,c_red,c_lime,0,true,true);
    30. draw_set_alpha(1);
    31. // Aufräumen
    32. draw_set_color(c_black);
    Alles anzeigen


    Nun möchte ich aber mehrere Einheiten an ein Ziel schicken. Die EInheiten brauche dazu Abgaben in der Variablen tox und toy.

    In der bisherigen Version geht das so:

    GML-Quellcode

    1. if (global.selected <> noone) && !(keyboard_check(vk_control))
    2. {
    3. unit = global.selected;
    4. unit.tox = mouse_x;
    5. unit.toy = mouse_y;
    6. if (!unit.unturnable)
    7. {
    8. unit.angle = point_direction(unit.x,unit.y,mouse_x,mouse_y);
    9. }
    10. }
    Alles anzeigen


    Jetzt soll das aber mit der Mehrfachauswahl kompatibel sein.

    Plan:

    GML-Quellcode

    1. if (!ds_list_empty(global.stack)) //&& (keyboard_check(vk_control) == false)
    2. {
    3. for (i=0;i<ds_list_size(global.stack);i+=1)
    4. {
    5. unit = global.stack[i];
    6. unit.tox = mouse_x;
    7. unit.toy = mouse_y;
    8. if (!unit.unturnable)
    9. {
    10. unit.angle = point_direction(unit.x,unit.y,mouse_x,mouse_y);
    11. }
    12. }
    13. }
    Alles anzeigen


    Das aber funktioniert nicht, die Meldung lautet

    Quellcode

    1. Unknown variable stack or array index out of bounds
    und hier ist mein Latein am Ende. Die Meldung bedeutet wohl, dass der ZugrAls Anhang Quellcode des Spiels. Kleine Hilfe mit F1 im Spiel.

    Danke schonmal für Hilfe,
    leoschabel

    EDIT:

    Das Problem hat sich mit einem Blick in die englische Hilfe erledigt. In der englischen Version war zu lesen:

    Quellcode

    1. ds_list_find_value(id,pos) Returns the value stored at the indicated position in the list.


    In dem übersetzen Pendant:

    Quellcode

    1. ds_list_find_value(id,pos) Gibt an, ob der Wert an der angegebenen Position in der Liste gespeichert ist.
    sowie

    Quellcode

    1. Du kannst die Werte über einen Index adressieren.
    , was mich dazu gebracht hat, die Liste wie einen Array anzusteuern. Mit ds_list_find_value(id,pos) klappt es aber.

    Allerdings habe ich eine andere Frage: Ist es möglich, innerhalb von GM zu erkennen, wenn das Spielfenster deaktiviert ist? (Vermeidung von Scrollen). Und ist es irgendwie möglich, zu verhindern, dass sich Instanzen "verklemmen" und nicht mehr bewegen wollen? Thx.
    Dateien
    • StarWars.zip

      (125,87 kB, 119 mal heruntergeladen, zuletzt: )
    .signature{
    display: none !important;
    }

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

  • Du kannst unter global Game Settings "Freeze the game when the form looses focus" anmachen, dann
    stoppt das Spiel, sobald das Fenster nicht mehr aktiv ist.
    ___________________________________________________________
    Beware of wild pointers
    ______Hinweis für Allergiker: Kann Spuren von Ironie enthalten_____
  • Das mit der Liste habe ich inzwischen auch herausgefunden, siehe Edit.

    Zum Deaktivieren des Spielsfensters: das Ganze wird ein Netzwerkspiel, da geht das nicht. Mein Problem ist nur, dass ich Scrollen ermögicht habe, indem ich ein unsichtbares Objekt an den Mauszeiger gehängt habe und dies wiederum an den View. Wenn ich jetzt ein anderes Fenster aktiviere, scrollt der View (logischerweise) aber weiter in die entsprechende Richtung. Ich suche nur nach einer Möglichkeit, das Scrollen zu unterbinden.

    Aber danke schonmal,
    leoschabel
    .signature{
    display: none !important;
    }