mehrere Sprites in Schleife zeichnen

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

  • mehrere Sprites in Schleife zeichnen

    Hi

    Ich wollte ein Script erstellen, welches ein Sprite an die Position einer in einen Array gespeicherten Instanz zeichnet, wobei der Array = instance_create ist, und somit jede Instanz mit dem entsprechenden Index induviduell aufgerufen werden kann.

    Wichtig zu wissen, ist etwa noch, dass vorher eine Anzahl an Instanzen mit einem eigenen Index in einer Random-Position erstellt werden.
    Mein Script etwas vereinfacht:


    GML-Quellcode

    1. n=0
    2. while (n<global.partcount[index[0]])//n<anzahl der Instanzen mit entsprechendem Index
    3. {
    4. pos=global.index[index[n]]//instanz mit entsprechendem Index
    5. draw_sprite_ext(sprite,sprite_index,pos.x,pos.y,pos.image_xscale,pos.image_yscale,rotation,color,alphaa);
    6. n+=1
    7. }


    Leider hat das nicht funktioniert, es wurde immer nur die zuletzt erstellte Instanz mit dem Sprite gezeichnet, was möglicherweise daran liegt, dass die Refresh-Rate des Bildschirms zu niedrig ist oder gar hier einfach nur das letze Sprite gezeichnet wird, da es ja eine Funktion in einem Draw Event ist und somit auch nur einmal pro Event gezeichnet wird, keine Ahnung, nur Spekulationen eines Laien :P. Zumindest würde ich jetzt gerne wissen, wie man über eine Art Schleife mehrere gleiche Sprites zeichnen kann.

    Hoffentlich konnte ich das verständlich erklären und hoffentlich könnt ihr mir helfen, vielen Dank im vorraus :)
    "das war meine letzte flamewar PM an dich ."
  • für solche fälle gibt es extra die for schleife

    for( initialisierung; bedingung; aktion) {
    Hauptteil
    }

    eine gewöhnliche for schleife würde so aussehen:

    GML-Quellcode

    1. for( i=0 ; i<10 ; i+=1 ) {
    2. // tu irgendwas
    3. }


    sie hat den vorteil das per schleifendurchgang mit i einfach gerechnet werden kann.

    Bei dir sind ein paar fehler, ich weis nicht wie der GM darauf reagiert wenn man einfach die befehle so lässt...

    draw_sprite_ext(sprite,sprite_index,pos.x,pos.y,pos.image_xscale,pos.image_yscale,rotation,color,alphaa);

    das ist glaube ich schonmal ganz schlecht.
    in der hilfe steht die funktion so:
    draw_sprite_ext(sprite,subimg,x,y,xscale,yscale,rot,color,alpha)

    also würde deins heissen:

    GML-Quellcode

    1. for(i=0; i<global.partcount[0]; i+=1 ) {
    2. draw_sprite_ext(global.index[i].sprite_index,0,global.index[i].x,global.index[i].y,1,1,global.index[i].direction,c_white,1);
    3. }


    subimg, imagescale x und y und color sowie alpha kannst du noch verändern.

    Du scheinst noch nicht richtig verstanden zu haben wie man die vorgegebenen codefunktionen einsetzt.

    brauchst du eigentlich den ganzen schnickschnack mit rotation, imagescale und blend? sonst nimm doch einfach die normale draw_sprite funktion:

    GML-Quellcode

    1. draw_sprite(global.index[i].sprite_index,0,global.index[i].x,global.index[i].y
  • Danke :)

    Leider ändert das rein gar nichts, ich hab wohl die Frage nicht so gut gestellt..

    Ich habe keine for-Schleife verwendet, weil ich nicht genau verstanden hatte, wie sie funktioniert.
    Die ganzen Parametern in der draw_sprite_ext- funktion sind überlegt, sonst wärs ja nicht so ;)

    Ich möchte auf jede Instanz, die auf den Index Argument0 hört, ein Sprite zeichnen, das versuche ich mit der Schleife, da nicht bei jeder Instanz das Sprite gezeichnet werden soll.
    "das war meine letzte flamewar PM an dich ."
  • Versuchs mal so: (objects[] speichert die Objekte, arg ist dein Index)

    GML-Quellcode

    1. for (i=0;i<n;i++)
    2. {
    3. if (objects[i].arg==argument0)
    4. {
    5. draw_sprite_ext(....)
    6. }
    7. }


    Ich hoffe, ich hab dich richtig verstanden, du willst also eine
    bestimmte Anzahl von Objekten, die anders gezeichnet werden,
    wenn eine Eigenschaft einen bestimmten Wert hat. (Wenn nicht
    bitte ich um nicht beachtung dieses Posts ;) )

    Zum Thema for-Schleifen:
    Spoiler anzeigen

    eine for-schleife besteht aus drei argumenten, wobei
    das erste und letzte leer bleiben können.
    Die Argumente sind durch ; getrennt.
    Das erste: Wenn du eine Zählvariabele hast, ist es meist sinnvoll, sie auf einen bestimmten
    anfangswert zu setzen. Das kannst du hier machen.

    Das zweite: Hier steht das Argument, das auch in der While schleife steht.

    Das dritte: Hier steht die Schrittgröße: dieses codestück wird nach jedem
    schleifendurchgang ausgeführt, somit kannst du hier deine Variabele erhöhen
    oder erniedrigen.
    ___________________________________________________________
    Beware of wild pointers
    ______Hinweis für Allergiker: Kann Spuren von Ironie enthalten_____
  • Zum besseren Verständnis meiner Frage lade ich mal meine gmk Datein hoch, bitte kein all zu hartes Kommentar zu irgendwelchen Lächerlichkeiten, die in meiner Unerfahrenheit nunmal auftauchen :P

    Es sollten alle instanzen diesen roten Sprite haben, ist allerdings nur bei einer der Fall.
    Dateien
    "das war meine letzte flamewar PM an dich ."
  • ähm..wenn ich dich richtig verstehe, dann nein ;)
    Ich würde das object selbst gerne möglichst unangetastet lassen, also von aussen "bedienen".

    edit:
    was ist eigentlich der unterschied der while- und der for-schleife? gravierende oder einfach nur weniger arbeit?

    ich habe bei der schleife jeweils bei jedem schleifendurchgang den aktuellen index abgefragt und einzeln gezeichnet, heraus kam bei jedem schleifendurchgang der selbe index(also die instanz-id)!? habe ich das prinzp falsch verstanden?! wieso funktioniert das dann in anderen skripts?
    "das war meine letzte flamewar PM an dich ."

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

  • Benutzer online 1

    1 Besucher