[Gelöst] INI: ini_read_string soll Spritenamen einlesen, gibt aber 0 zurück

  • GM 8

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

  • [Gelöst] INI: ini_read_string soll Spritenamen einlesen, gibt aber 0 zurück

    :)

    Ich versuche mich gerade zum ersten Mal an extern gespeicherten Daten, weil ich machen will, dass man sich bei meinem Weltraumspiel vor Spielbeginn ein Schiff aussuchen kann. Mit den Werten (real) klappt das offenbar auch. Nun will ich logischerweise auch in der ini-Datei angeben, welches Sprite das Schiff haben soll. Und da hakt es.

    Ich hab es versucht mit:

    GML-Quellcode

    1. sprite_index = ini_read_string("ship", "sprite", "");

    GML-Quellcode

    1. sprite = ini_read_string("ship", "sprite", "");
    2. sprite_index = string(sprite);

    und

    GML-Quellcode

    1. sprite_index = sprite_get_name(ini_read_string("ship", "sprite", ""));


    Normalerweise ändert man mit sprite_index doch das Sprite, also auch mit dem Namen als Angabe. Offenbar gibt ini_read_string, wenn es um ein Sprite geht, aber nicht den Spritenamen, der in der ini-Datei geschrieben steht, sondern eine ID und die ist ominöserweise immer 0. Dementsprechend kann ich die ID auch nicht in den Namen ummappen, weil das gewünschte Sprite als ID nicht 0 hat. Versteh ich nicht, weil ini_read_string doch einen String zurückgeben müsste...

    Auszug aus ini-Datei (Spritename mit und ohne " bereits ausprobiert - Fehlanzeige):
    Spoiler anzeigen

    [ship]
    sprite = "spr_ship01"

    Der Fehler ist immer "trying to draw non-existing sprite".
    Wie muss das aussehen, damit das Sprite aus der ini-Datei korrekt geladen wird? Kann doch nicht so schwer sein.

    GML-Quellcode

    1. if ! (freedom) { instance_destroy(gamemaker); instance_create(x, y, html5); }

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von Bonsaiheld ()

  • sprite_index ist kein string. Du musst eine Sprite ID (also einen real) zuweisen.

    sprite_index = spr_Player; heißt z.B. das der Inhalt von der Variable (bzw. Konstante) spr_Player in sprite_index gespeichert wird. spr_Player ist also nur eine Variable die den wirkliche Sprite ID (mit der der GM intern arbeitet) beinhaltet:

    GML-Quellcode

    1. show_message(string(spr_Player));


    Es ist wichtig zwischen String und Variable zu unterscheiden:

    • "spr_Player"
    • spr_Player
    #edit:
    Speicher also einfach sprite_index als Real. Die einzige Möglichkeit um aus einem String (also "spr_Player") wieder die Sprite ID zu bekommen ist/war execute_string oder einfach alle Sprites durchloopen. (beides wohlmöglich nicht effizent!)
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • henrik1235 schrieb:

    #edit:
    Speicher also einfach sprite_index als Real. Die einzige Möglichkeit um aus einem String (also "spr_Player") wieder die Sprite ID zu bekommen ist/war execute_string oder einfach alle Sprites durchloopen. (beides wohlmöglich nicht effizent!)
    Der Unterschied zwischen string und Variable ist mir bekannt. Ich hab nur aus Verzweiflung alles ausprobiert, was mir einfiel. Ich komm in der Regel erst hier im Forum mit einem Problem, wenn ich nicht wirklich weiterkomme. :)

    GML-Quellcode

    1. sprite = ini_read_string("ship", "sprite", "");
    2. show_message(string(sprite));

    gibt den korrekten Spritenamen aus (also einfach den Wert aus der ini-Datei). Aber nützt mir noch nichts, weil ich das Sprite trotzdem nicht laden kann.

    execute_string() soll sehr langsam sein... Gibt es wirklich keine andere Möglichkeit? Wenn ich spr_ship01 als Variable in der ini-Datei speicher, also ohne die ", ist das Ergebnis ebenfalls "Trying to draw non-existing sprite...".

    Wie macht man das denn dann? Wie kann ich aus einer ini_Datei ein Sprite auslesen und dann zeichnen? Irgendwie fehlt mir hier eine sprite_get_index()-Funktion, bei der ich einfach nur den Spritenamen angebe und es gibt mir die ID zurück. :huh:

    GML-Quellcode

    1. if ! (freedom) { instance_destroy(gamemaker); instance_create(x, y, html5); }

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

  • Du kannst ja fürs Schreiben ini_write_real("Section", "Key", Sprite); benutzen, und fürs Lesen spr = ini_read_real("Section", "Key", Default);


    #edit:

    Scheinbar verstehe ich das was du nun willst erst jetzt, du könntest das Sprite ja extern dazu legen? (Dazu Filename, und dann mit sprite_add laden)
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • Habs hinbekommen. Offenbar geht das auch ohne execute_string.

    Script: sprite_get_index(name);
    pastebin.com/GWqhtMRP

    GML-Quellcode

    1. //sprite_get_index(name)
    2. //1000 should be high enough to cover all sprites.
    3. //If not, just increase it :P
    4. var i;
    5. for (i = 0; i < 1000; i += 1)
    6. {
    7. if (sprite_get_name(i) == argument0)
    8. {
    9. return i;
    10. }
    11. }
    12. return -1;
    Alles anzeigen

    Das ist, glaube ich das, was du mit "alle Sprites durchloopen" meintest.

    Funktioniert perfekt und gibt sofort die korrekte ID aus. Eine Verzögerung fällt mir auch nicht auf, es passiert allerdings auch nur einmal im Create Event.
    Die Funktion sollte im GameMaker eingebaut sein, finde ich. Das ginge bestimmt auch ohne alle Sprites durchzuchecken. Mit dem Script starte ich jetzt jedenfalls auch mal eine Scriptsammlung für mich. Das brauch ich bestimmt nochmal. :)

    EDIT: Und ja, extern speichern will ich mittelfristig so viel wie möglich. Im Moment sind nur die Hintergrundbilder und die Musik extern, also die größten Teile.

    GML-Quellcode

    1. if ! (freedom) { instance_destroy(gamemaker); instance_create(x, y, html5); }

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