Probleme mit ds_list

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

  • Probleme mit ds_list

    Ich habe Ein Objekt Flotte, daß eine ds_list mit einzelnen Schiffen enthält. Wird die Flotte aufgeteilt, erstellt dieses (fehlerhafte?) Skript eine weitere Flotte....

    Die GML gibt's hier
    Da kann man sehen, daß die Flotten nicht richtig aufgeteilt werden
    (zu Testen einfach Scouts produzieren und mit Keypad+ das Tempo auf max stellen)

    GML-Quellcode

    1. // "split_fleet"
    2. //called by obj_fleet on global_left pressed event
    3. // argument0: Zielsystem
    4. left=0;
    5. for (i=0;i<ds_list_size(list);i+=1) if leave[i] left+=1 // ausgewählte Schiffe zählen -
    6. // leave[i] wird vom Objekt ckicktext_c gesetzt
    7. if ! ( left=0 || left=i) // nicht keins oder alle Schiffe ausgewählt , also splitten
    8. {
    9. fleet_info(id) // Klicktexte löschen
    10. // neue Flotte (für nicht ausgewählte Schiffe) erstellen :
    11. dang = instance_create(x,y,obj_fleet)
    12. ds_list_add(lord.flotte,dang) // lord = spieler
    13. dang.lord = lord
    14. dang.index = lord.fleet
    15. lord.fleet += 1
    16. dang.sys = sys // aktuelles System wenn im Orbit (-1 wenn nicht)
    17. dang.target = target // neuer Flotte altes Zielsystem zuweisen
    18. dang.col = lord.colo // Farbe
    19. dang.list = ds_list_create() // hier werden die einzelnen Schiffe reingeschrieben
    20. for (i=0;i<ds_list_size(list);i+=1) // list_size : Anzahl Schiffe
    21. if leave[i] // Schiff ausgewählt
    22. {
    23. ds_list_add(dang.list,ds_list_find_value(list,i)) // Schiff aus alter Flotte(list) zu neuer Flotte(dang.list) hinzufügen
    24. ds_list_delete(list,i) // aus alter Flotte entfernen
    25. }
    26. for (i=0;i<ds_list_size(list);i+=1) leave[i]=0 // Schiff-Auswahl löschen
    27. }
    28. target=argument0 // neues Zielsystem zuweisen
    Alles anzeigen
  • Ich schaue mir grade diesen Teil an:

    GML-Quellcode

    1. for (i=0;i<ds_list_size(list);i+=1) // list_size : Anzahl Schiffe
    2. if leave[i] // Schiff ausgewählt
    3. {
    4. ds_list_add(dang.list,ds_list_find_value(list,i)) // Schiff aus alter Flotte(list) zu neuer Flotte(dang.list) hinzufügen
    5. ds_list_delete(list,i) // aus alter Flotte entfernen
    6. }



    Sagen wir mal, für Schiff 1, 2 und 3 existiert leave. Das heißt ja, 1,2 und 3 müssen in eine neue Flotte.
    i ist 0, das ist das Schiff 1. Das wird in die neue Flotte hinzugefügt und aus der alten gelöscht. Dadurch rutschen alle oberen Einträge um eines nach unten! Beim nächsten Schiff, nämlich Nummer 2, da i jetzt 1 ist, wird das Schiff Nummer 3 in die neue Liste gelegt und aus der alten gelöscht, da ja 0 nun Schiff 2 ist und 1 Schiff 3. Beim dritten Durchlauf existiert auf Position 2 nicht mal mehr ein Schiff, nur noch auf 0.

    Das Ergebnis: Schiff 1 und 3 in der neuen Flotte, 2 in der alten. Obwohl alle drei in der neuen sein sollten. Erkennst du jetzt deinen gedanklichen Fehler?
    "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
    - Joseph Weizenbaum