Objekte random von der liste

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

  • Objekte random von der liste

    Hallo.
    Ich hab folgendes Problem. Ich möchte eine List (mit DS_list, bekomme ich auch noch hin) erstellen. Und dann dieser Liste Objekte hinzufügen und mit einer Taste (Maus) Random an einer bestimmten Position createn. Wäre cool wenn mir da einer helfen könnte, bekomme es leider nicht hin. Hab alles versucht....

    Danke! :)
  • Hi,
    ich verstehe die Frage leider nicht ganz. Willst du alle Objekte, die in einer Liste sind an einer zufälligen Position spawnen, oder nur ein zufälliges aus der Liste?
    Ich schätze mal willst zweiteres. So könntest du das machen:

    GML-Quellcode

    1. // Erstellen und hinzufügen
    2. var liste = ds_list_create();
    3. ds_list_add(liste, obj_eins);
    4. ds_list_add(liste, obj_zwei);
    5. // Zufälliges Objekt aus der Liste holen
    6. var anzahl = ds_list_size(liste);
    7. var index = irandom_range(0, anzahl - 1);
    8. var obj = ds_list_get(liste, index);
    9. // An der Position x = 123, und y = 456 das zufällige Objekt erstellen
    10. instance_create(123, 456, obj);
    Alles anzeigen
    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
  • NelconMadar schrieb:

    Hat leider bei mir nicht funkioniert... bei mir kommt immer ein fehler bei "var anzahl". Oder war "anzahl" nur ein beispiel? Für weitere Tipps wäre ich hoffen. :)
    Zuerst fügst du Objekte deiner Liste hinzu, im Beispielcode wäre es obj_eins und obj_zwei. Da kannst du aber natürlich auch andere Sachen einfügen, wir wissen ja nicht, was du genau willst )ich vrstehe dein Anliegen auch nicht so recht).

    Wenn du etwas in deiner Liste gespeichert hast, gibt dir "var Anzahl" wieder, wie viele Objekte in der Liste gespeichert wurden (also die Größe der Liste. 1 Objekt = +1 Größe)
    Das "var" vor Anzahl definiert, dass es nur eine lokale Variable ist, welche lediglich in diesem Code verwendet wird. Das heißt, wenn du woanders mit der Variable anzahl arbeitest, wird er die Variable nicht kennen.
    Du kannst natürlich auch einen beliebigen anderen Namen für anzahl wählen, du kannst ja deine Variablen nennen wie du fröhlich bist. Dann musst du sie allerdings auch überall anpassen.

    Es wäre hilfreich, wenn du die Fehlermeldung mitteilen könntest, die du bekommen hast. Eventuell war noch nichts in deiner Liste drin, weshalb die Fehlermeldung kam.
  • Erstmal große dank für die mühen mir das alles zu erklären! :) Bin ich sehr dankbar dafür! Da aber jetzt mehrere geschrieben haben, das sie nicht genau wissen was ich will oder eben meine versuche ich das kurz zu erklären.

    Also ich möchte eigentlich nur 1 Karte (also obj_Karte1) in meinem Deck (Also der liste hinzufügen) Dann möchte ich per klicken einer taste "enter" oder "Mouse" taste das er dann random von der eben erstellten liste und hinzugefügten Karten eine random an eine bestimmte von mir angegebenen Postion createt oder eben gespawnt.
    Und die karte die gespwant wurde bestenfalls dann wieder von der liste löscht.

    PS: meiner fehlermeldung war immer "Var anzahl" oder "var obj = ds_list_get(liste, index);"

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

  • Neu

    Mir ist die Fragestellung leider immer noch nicht klar geworden.

    Was ich verstanden habe:
    Beispiel:
    Du hast eine Liste an 10 Karten. Jetzt willst du bei einer Aktion (Mausklick oder Enter) eine zufällige Karte aus dieser Liste ziehen. Diese Karte wird dann an deine angegebene Position erstellt und anschließend aus der Liste gelöscht.


    NelconMadar schrieb:

    PS: meiner fehlermeldung war immer "Var anzahl" oder "var obj = ds_list_get(liste, index);"
    Wir brauchen vorallem die Fehlermeldung. Also was daran falsch ist. Praktisch wäre auch dein gesamter Code :)
    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
  • Neu

    NelconMadar schrieb:

    Erstmal große dank für die mühen mir das alles zu erklären! :) Bin ich sehr dankbar dafür! Da aber jetzt mehrere geschrieben haben, das sie nicht genau wissen was ich will oder eben meine versuche ich das kurz zu erklären.

    Also ich möchte eigentlich nur 1 Karte (also obj_Karte1) in meinem Deck (Also der liste hinzufügen) Dann möchte ich per klicken einer taste "enter" oder "Mouse" taste das er dann random von der eben erstellten liste und hinzugefügten Karten eine random an eine bestimmte von mir angegebenen Postion createt oder eben gespawnt.
    Und die karte die gespwant wurde bestenfalls dann wieder von der liste löscht.

    PS: meiner fehlermeldung war immer "Var anzahl" oder "var obj = ds_list_get(liste, index);"
    Verstehe!

    Ich habe mal ein kleines Projekt im GM2 gemacht und alles auskommentiert.

    Create Event:

    GML-Quellcode

    1. // Es soll der Zufall entscheiden!
    2. randomize();
    3. // Liste erstellen
    4. liste_karten = ds_list_create();
    5. // Karten zu der erstellen Liste hinzufügen
    6. ds_list_add(liste_karten, obj_Card_1);
    7. ds_list_add(liste_karten, obj_Card_2);
    8. ds_list_add(liste_karten, obj_Card_3);


    Step Event:

    GML-Quellcode

    1. // Wenn die linke Maustaste oder die Enter-Taste betätigt wird:
    2. if (mouse_check_button_released(mb_left) || keyboard_check_released(vk_enter))
    3. {
    4. // Wenn keine Karten mehr im Deck vorhanden sind, soll der nachfolgende Code nicht ausgeführt werden,
    5. // weil es sonst zu einer Fehlermeldung kommen würde
    6. if (ds_list_size(liste_karten) <= 0)
    7. {
    8. exit;
    9. }
    10. // Eine zufällige Karte auswählen. irandom_range anstatt random_range, weil diese Funktion nur Ganzzahlen ausgibt!
    11. // Es soll ein Wert zwischen 0 und der Größe der Liste gefunden werden
    12. var karte_pos = irandom_range(1, ds_list_size(liste_karten)) - 1;
    13. // Die soeben erhaltene Zahl zwischen 0 und der Größe nun als "Positionsvariable" verwenden, um den Wert
    14. // an der Position zu finden und in karte_create zu speichern
    15. var karte_create = ds_list_find_value(liste_karten, karte_pos);
    16. // Das Objekt an x= 64, y = 64 erstellen
    17. // Wenn du nicht den GMS 2 verwendest, benutze einfach instance_create(x, y, obj);
    18. instance_create_layer(64, 64, "Instances", karte_create);
    19. // Die Position/Karte löschen
    20. ds_list_delete(liste_karten, karte_pos);
    21. }
    Alles anzeigen


    Beachte, dass du eventuell auch mit der Depth-Variable arbeiten musst, da die Objekte sonst ggf. unter dem vorhandenen Objekt erstellt werden und du die neuen Karten nicht siehst, weil sie unter einer anderen sind.