Hey,
STRING-Objekte sind etwas kniffliger als solche Typen wie var, int oder char. Dabei handelt es sich um Objekte, die man "korrekt" erstellen muss. Im letzten Post habe ich was von SOUND-Objekten geschrieben, und zwar, dass die Engine für dich den Sound erstellt, wenn du
außerhalb einer Funktion definierst, es aber
innerhalb nicht so klappt.
Bei Strings ist das genauso. Du kannst
außerhalb von Funktionen schreiben:
STRING* meinstring = "#30";
Innerhalb von Funktionen musst du aber str_create benutzen - du kannst lokal nur den Zeiger* erstellen, und musst dann mittels der str_create Anweisung getrennt den Auftrag geben, den String im Speicher zu erstellen:
function meine_funktion() {
STRING* mein_string;
mein_string = str_create("Dies ist mein String!");
error(mein_string);
str_remove(mein_string);
}
Du solltest auch nicht vergessen, nicht mehr benötigte Strings mittels str_remove wieder zu entfernen. Andernfalls bleiben sie im Speicher - Memory leak!
Die einfachste Lösung für dein Problem wäre daher, die Definition von "nextlevel" einfach aus der Funktion auszulagern. Das kann aber auch ein allgemeiner, globaler "tempstring" sein, den du überall wieder verwendest. Das ist am Anfang IMHO einfacher, als stets mit lokalen Strings zu hantieren (was aber vll. eleganter ist).
var aktuelles_level = 1;
STRING* nextlevel = "#30";
function lade_neues_level()
{
str_cpy(nextlevel, "level");
str_cat(nextlevel, str_for_num(NULL, aktuelles_level));
str_cat(nextlevel, ".wmb");
error(nextlevel);
level_load(nextlevel);
aktuelles_level = aktuelles_level +1;
}
Oder alternativ:
var aktuelles_level = 1;
function lade_neues_level()
{
STRING* nextlevel;
nextlevel = str_create("#30"); //Würde auch in einer Zeile gehen, ist aber so klarer :)
str_cpy(nextlevel, "level");
str_cat(nextlevel, str_for_num(NULL, aktuelles_level));
str_cat(nextlevel, ".wmb");
error(nextlevel); //hier sollte korrekt "level1.wmb" ausgegeben werden!
level_load(nextlevel);
aktuelles_level = aktuelles_level +1;
str_remove(nextlevel);
}
Übrigens kannst du für aktuelles_level auch einen anderen Typ als
var benutzen, z.B. "int" für ganze Zahlen (es gibt doch kein Level 2,323 oder?) oder falls es unter 255 Level bleiben auch char. In dem Fall solltest du aber str_for_int statt str_for_num verwenden.
+++++++++++++
Und wo ich all das geschrieben habe: Ich glaube nicht, dass das dein Problem löst. Die Frage ist,
gibt es denn "level1.wmb"? Dein Code verwendet
error, d.h. vor dem laden sollte ein Dialogfeld aufgehen, dass den String ausgibt. Passiert das? Und wenn es passiert, was steht in dem Feld - es sollte "level1.wmb" sein.
Deine "level1.wmb"-Datei muss sich im Verzeichnis des Spiels (da, wo auch deine Skriptdatei, die du benutzt, sitzt) befinden. Und achtung, uns interessiert nicht eine ".wmp", wir brauchen die ".wmb"-Datei.
* - das Sternchen "*" hinter dem Typ deutet an, dass es nur ein Zeiger ist - das bedeutet, dass du dort nur die Adresse im Speicher hinterlegst, und gar nicht das Objekt selbst. Bei einem Sound kannst du dir das so vorstellen: Die Engine lädt also deine vll 1 MB große Sound-datei und die befindet sich nun irgendwo im Speicher, und zwar in diesem Beispiel beginnend bei Memory-Block 300. Dann würde der SOUND-Zeiger "mein_sound" nicht diese 1 MB Sounddaten beinhalten, sondern nur die Zahl 300. Da die Engine aber weiß, dass es sich um einen SOUND-Zeiger handelt, weiß sie, dass sie ab dieser Adresse den Sound auslesen kann.
Für Zeiger benutzt man auch "->" statt den Punkt ".", wie du in HeelX Beispielcode oben gesehen hast. Das korrigiert lite-C aber i.d.R. (für alle nicht zu komplexen Codebeispiele) für dich.
Keine Sorge, wenn das noch eher verwirrend klingt! Zeiger sind ein wichtiges Konzept, und man kann eine Menge damit machen, aber man braucht eine Weile um "reinzukommen". Das passiert aber früher oder später von allein, also keine Panik!