For Schleife mit zufälligen Werten in der Ausgabe

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

  • For Schleife mit zufälligen Werten in der Ausgabe

    Hallo,

    ich lasse ein Sprite über ein Grid verteilt im ganzem Raum drawen

    GML-Quellcode

    1. // DrawWaves
    2. {
    3. var i;
    4. for (i = -20; i < view_wview; i += 40)
    5. for (j = -20; j < view_hview; j += 40)
    6. {
    7. draw_sprite_ext(spr_WaterWaves,water_image_index,i,j,water_image_scale,water_image_scale,water_image_rot,c_white,water_image_alpha);
    8. }
    9. }
    Alles anzeigen


    Nun möchte ich aber immer zufällige Werte für z. B. sprite_index
    Das ist über das Create Event des Objects schon so geregelt

    GML-Quellcode

    1. // WaterWaves
    2. water_image_index = random(5);
    3. water_image_scale = choose(0.7,0.8,0.9,1);
    4. water_image_rot = random(360);
    5. water_image_rot_dir = choose(1,2);
    6. water_image_rot_speed = choose(0.5,1,1.5,2,2.5);
    7. water_image_alpha = choose(0.7,0.8,0.9,1);


    Was natürlich klar ist, dass alle gedrawten Sprites nun gleich aussehen und sich exakt gleich verhalten.
    Wie bekomme ich das unterschiedlich hin?

    Gruß,
    Shari
    Dieser Beitrag wurde bereits 1909 mal editiert, zuletzt von »Sharivari« (Morgen, 19:89)
  • Hab das mal so gelöst (Ob es der "beste" / "Richtigste" Weg ist weiss ich nicht :)):

    GML-Quellcode

    1. // DrawWaves
    2. {
    3. var i;
    4. for (i = -20; i < view_wview; i += 40)
    5. for (j = -20; j < view_hview; j += 40)
    6. {
    7. WichSprite = asset_get_index("sprite" + string(irandom_range(1,5)));
    8. draw_sprite_ext(WichSprite,water_image_index,i,j,water_image_scale,water_image_scale,water_image_rot,c_white,water_image_alpha);
    9. }
    10. }
    Alles anzeigen


    Ich habe 5 Sprites gemacht die alle "Sprite1" - "Sprite5" heissen und verschiede Farben haben. Ich lasse mit irandom_range zwischen 1-5 zufällig eine Sprite "Nummer" auswählen und setze es mit asset_get_index zu einem "Asset" zusammen und speicher das in der WichSprite Variable. Und tada es werden immer und immer und immer wieder zufällige Sprites gezeichnet.

    Edit: Bild im Anhang

    Edit2: Wenn du die Werte vom Create Event in den Step Event packst, werden die bei jedem Step neu ausgewürfelt und die Sprites verhalten sich anders. Nur Bewegen sie sich wie wild hin und her... :)
    Um das "Professionell" zu machen müsstest du denk ich mal mit Arrays Arbeiten, die Werte dort abspeichern im Create Event und dann zeichnen lassen. Aber da kenn ich mich nun nich so genau aus leider...
    Aber vll hilft dir das als Denkstanstoss...
    Bilder
    • gmd1.png

      119,38 kB, 1.036×818, 109 mal angesehen

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

  • Du solltest tatsächlich ein grid anlegen in dem die Werte drinnen stehen, also zb (50736020507), das zerlegst du dann wieder in die einzelwerte wenn du das grid an der stelle i,j ausliest.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • edit: hat sich erledigt... Aber falls du eine Lösung gefunden hast las es mich wissen... hab es nun auch 2-3 stunden probiert... aber iwie nicht richtig hinbekommen :)

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

  • Habs hinbekommen, über Umwege:

    Controller Object -> Step:

    GML-Quellcode

    1. if global.met = false
    2. {
    3. var i,j;
    4. for (i = -20; i < view_wview; i += 40)
    5. for (j = -20; j < view_hview; j += 40)
    6. {
    7. {instance_create(i,j,obWaterEffect);}
    8. }
    9. }
    Alles anzeigen


    global.met musste ich einbauen, um zu sehen ob schon einmal ein Objekt über ein anderes gelegt wurde.
    Ohne diese Kontrollvariable wurde nämlich immer und immer wieder ein Objekt nach dem anderen an der gleichen Stelle erstellt.

    Geprüft wird das einfach über das obWaterEffect -> Step

    GML-Quellcode

    1. if position_meeting(x,y,obWaterEffect){
    2. global.met = true;}


    Hab mal das Ergebnis angehangen :)

    Gruß,
    Shari
    Dateien
    • Water.rar

      (914,47 kB, 118 mal heruntergeladen, zuletzt: )
    Dieser Beitrag wurde bereits 1909 mal editiert, zuletzt von »Sharivari« (Morgen, 19:89)
  • Augenscheinlich funktioniert es, aber ich habe mal den Room Speed auf 9999 gestellt und mir dann die Real FPS anzeigen lassen. Die sind extrem Niedrig. Scheint so, als würde die Schleife unendlich durchlaufen und die FPS in den Keller werfen.
  • Ich hab keinen GM8 mehr installiert, aber kann es sein das du hier, jede Menge Objekte(100+) hast die auch alle position meeting abfragen? Anstatt ein Object das einfach alles drawed? MIt meiner Methode kannst du das ganze Wasser in ein Object packen egal wie groß die Wasserfläche ist.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Ja genau, sehr speicherlastig und unelegant gelöst, ich weiß.

    Aber leider verstehe ich deine Variante nicht, bzw. hab nicht mal ansatzweise einen Plan wie ich das machen soll. Mir wäre es mit einem Objekt und Draw Event auch wesentlich angenehmer.
    Dieser Beitrag wurde bereits 1909 mal editiert, zuletzt von »Sharivari« (Morgen, 19:89)
  • NP, habs auch nur kurz angerissen. Also du hast ein Object. Im Create Event erstellst du ein ds_grid.

    GML-Quellcode

    1. waves = ds_grid_create(64,48);
    2. for ( i = 0 ; i < 64 ; i += 1)
    3. {
    4. for ( j = 0 ; j < 48 ; j += 1)
    5. {
    6. // WaterWaves
    7. water_image_index = random(5);
    8. water_image_scale = choose(0.7,0.8,0.9,1);
    9. water_image_rot = random(360);
    10. water_image_rot_dir = choose(1,2);
    11. water_image_rot_speed = choose(0.5,1,1.5,2,2.5);
    12. water_image_alpha = choose(0.7,0.8,0.9,1);
    13. //mach daraus eine zahl die du später zerlegen kannst
    14. wert = (water_image_index*10000000) + ((water_image_scale*10)*1000000) + (water_image_rot*100000) + (water_image_rot_dir*100) + ((water_image_rot_speed*10)*10) + (water_image_alpha*10)
    15. ds_grid_set(waves,i,j,wert);
    16. }
    17. }
    Alles anzeigen


    Die Zahl kannst du später wieder zerlegen, vor allem wenn du die Rotation haben möchtest. Dann musst du durch die Schleife durchgehen und beim errechnen des neuen werts, einmal alles zerlegen, speed zu rotation addieren udn wieder zusammen bauen und dann drawen lassen.
    Es könnte auch mit einem string gehen und dann mit den String funktionen zerlegen, statt mit divs und modulos.

    Wenn du die rotation haben willst: aus dem wert : 57180157 => .5/.7/180/1/.5/.7

    GML-Quellcode

    1. rotation = floor(ds_grid_get(waves,i,j)/1000)mod1000; //=180

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)