Lokale Variable (bug ?!)

  • Allgemein

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

  • Lokale Variable (bug ?!)

    Hi,

    Ich habe entweder einen Bug oder sonst was gefunden, aber wenn ich eine
    Lokale Variable in einem Objekt im Create Event definiere und die Objekte nach und
    nach in einem Raum erstellen lasse, dann hat jeder den Selben Wert der im
    Create event erstellt wird (random).

    Beispiel:
    Es sollen 3 Objekte nacheinander erstellt werden. Der Create Wert ist wie folgt:

    GML-Quellcode

    1. randomize()
    2. a=random(10)


    Immer nach 30 Steps wird ein neues Objekt erstellt bis 3 im Raum sind.
    Nach jedem erstellen eines Objektes bekommen die den selben Wert:
    wenn a=10 ist, dann hat jedes gleiche Objekt a=10.

    Wieso ? Jedes selbe Objekt sollte doch seinen eigenen Wert dann haben, oder haben die das
    geändert ?

    Quasi:
    Objekt: zu erst erstellt: a=7
    Objekt: als zweites erstellt: a=8 | Das erst erstellte Objekt bekommt jetzt auch a=8
    usw...

    Sorry für meine etwas... na ja schlechte Erklärung ^^
  • Wie kontrollierst du das erstellen der Objekte?
    Außerdem solltest du beachten, dass random() Fließkommazahlen zurückliefert (also 0.00 bis 9.99 in deinem Fall), daher solltest du das objekt mit round() auf den nächsten Integer runden.

    Objekt das 3 mal erstellt wird
    :event_create: Create Event:

    GML-Quellcode

    1. var a;
    2. a = round(random(10)); //Random liefert Zahlen im Range von 0 - 9,99 zurück, Round rundet diese auf ganze Zahlen, also 1 - 10


    und dann3 Objekte erstellen.

    Eine Möglichkeit wäre:

    GML-Quellcode

    1. var i;
    2. for(i=0; i<3; i+=1){
    3. with(instance_create(x, y, objekt)){
    4. var a;
    5. a = round(random(10));
    6. }
    7. }


    EDIT: youre right, übler Methodendreher reinbekommen, ist korrigiert

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von domis4 ()

  • Man sollte randomize(); nur ein einziges mal beim Starten des Spiels aufrufen. Sonst startet die zufällige Zahlenfolge immer wieder beim Anfang. Und da diese Funktion die Systemzeit für den Seed benutzt, wird man auch immer den gleichen Seed herausbekommen, da die Zeitabstände wo alle Objekte erstellt werden zu klein sind, um eine Auswirkung auf den Seed haben. Und ich glaube der Code von domis4 sollte eher

    GML-Quellcode

    1. var a;
    2. a = round(random(10)); //Random liefert Zahlen im Range von 0 - 9,99 zurück, Round rundet diese auf ganze Zahlen, also 0 - 10

    heißen. Ich würde aber generell für ganzzahlige Zufallszahlen irandom oder irandom_range benutzen.
  • Ok... Ich habe den Fehler... Ich trottel...

    Also man setzt einen Offset mit der variable "a" oder momentan "offset". Da das aber Sprite bedingt und nicht objekt bedingt ist (uups)
    wird er bei jedem Objekt (selben Sprite) angesetzt.

    Kann ich denn den Befehl:

    GML-Quellcode

    1. sprite_set_offset(sprite_index,offset,8)

    auch Objekt bedingt einsetzen ? Ohne das ich für jedes Objekt den selben sprite
    noch mal zeichnen muss (spr_1, spr_2, spr_3 ...) ?
  • Nico001 schrieb:

    Kann ich denn den Befehl:

    GML-Quellcode

    1. sprite_set_offset(sprite_index,offset,8)

    auch Objekt bedingt einsetzen ? Ohne das ich für jedes Objekt den selben sprite
    noch mal zeichnen muss (spr_1, spr_2, spr_3 ...) ?

    Du könntest im Draw-Event den Offset setzen und danach draw_self aufrufen (hab ich jedoch nicht getestet), oder es mit den d3d_transform Funktionen versuchen.

    Chris987 schrieb:

    Man sollte randomize(); nur ein einziges mal beim Starten des Spiels aufrufen. Sonst startet die zufällige Zahlenfolge immer wieder beim Anfang. Und da diese Funktion die Systemzeit für den Seed benutzt, wird man auch immer den gleichen Seed herausbekommen, da die Zeitabstände wo alle Objekte erstellt werden zu klein sind, um eine Auswirkung auf den Seed haben.

    30 Steps sollten ausreichen, um den Seed zu beeinflussen.