Hi,
wie könnte ich das realisieren wenn ich bsp
Auto(KoordsX,KoordY,KoordZ)
auslesen möchte. Also das aus einer Datei auslesen genau die Koordinaten aus der Datei
Hi,
wie könnte ich das realisieren wenn ich bsp
Auto(KoordsX,KoordY,KoordZ)
auslesen möchte. Also das aus einer Datei auslesen genau die Koordinaten aus der Datei
Schau dir mal die Funktion hier an, ist vom GrandLarceny geklaut:
stock LoadStaticVehiclesFromFile(const filename[])
{
new File:file_ptr;
new line[256];
new var_from_line[64];
new vehicletype;
new Float:SpawnX;
new Float:SpawnY;
new Float:SpawnZ;
new Float:SpawnRot;
new Color1, Color2;
new index;
new vehicles_loaded;
file_ptr = fopen(filename,filemode:io_read);
if(!file_ptr) return 0;
vehicles_loaded = 0;
while(fread(file_ptr,line,256) > 0)
{
index = 0;
// Read type
index = token_by_delim(line,var_from_line,',',index);
if(index == (-1)) continue;
vehicletype = strval(var_from_line);
if(vehicletype < 400 || vehicletype > 611) continue;
// Read X, Y, Z, Rotation
index = token_by_delim(line,var_from_line,',',index+1);
if(index == (-1)) continue;
SpawnX = floatstr(var_from_line);
index = token_by_delim(line,var_from_line,',',index+1);
if(index == (-1)) continue;
SpawnY = floatstr(var_from_line);
index = token_by_delim(line,var_from_line,',',index+1);
if(index == (-1)) continue;
SpawnZ = floatstr(var_from_line);
index = token_by_delim(line,var_from_line,',',index+1);
if(index == (-1)) continue;
SpawnRot = floatstr(var_from_line);
// Read Color1, Color2
index = token_by_delim(line,var_from_line,',',index+1);
if(index == (-1)) continue;
Color1 = strval(var_from_line);
index = token_by_delim(line,var_from_line,';',index+1);
Color2 = strval(var_from_line);
//printf("%d,%d,%f,%f,%f,%f,%d,%d",total_vehicles_from_files+vehicles_loaded+1,vehicletype,SpawnX,SpawnY,SpawnZ,SpawnRot,Color1,Color2);
AddStaticVehicleEx(vehicletype,SpawnX,SpawnY,SpawnZ,SpawnRot,Color1,Color2,(30*60)); // respawn 30 minutes
vehicles_loaded++;
}
fclose(file_ptr);
printf("Loaded %d vehicles from: %s",vehicles_loaded,filename);
return vehicles_loaded;
}
Dort sehen die Dateien so aus:
513,291.1346,2535.5850,17.3778,180.2974,21,36 ; Stuntplane
Du musst dann halt in der Funktion auf XYZ reduzieren, wenn du in den Dateien nur XYZ hast.
EDIT: token_by_delim brauchst dann natürlich auch noch:
stock token_by_delim(const string[], return_str[], delim, start_index)
{
new x=0;
while(string[start_index] != EOS && string[start_index] != delim) {
return_str[x] = string[start_index];
x++;
start_index++;
}
return_str[x] = EOS;
if(string[start_index] == EOS) start_index = (-1);
return start_index;
}
Wie macht man das bei dini ?
Ja das bringt mir nichts!
Es sieht genau so aus in der Datei:
CreateIrgendwas(x,y,z);
Und jetzt brauch ich x,y,z
Dann schreib halt die Funktion, die dir Eric gepostet hat, um.
Wenn du Pawn beherrscht, sollte das kein Problem sein.
Versuch doch die Funktion von Eric so umzuschreiben, das du die einzelnen Zeilen erhälst, und teile sie dann per sscanf auf. Ich wüsste nur gerade nicht wie man das mit den klammern dann macht
//Edit: ok, ein kurtzer blick ins Englische forum genügt^^ Die erste klammer die geöffnet wird, geht mit in den string, und die letzte wird einfach als trennzeichen benutzt. Versuch mal obs so geht:
new File:file_ptr, line[256], Float:SpawnX, Float:SpawnY, Float:SpawnZ;
file_ptr = fopen(dateiname, io_read);
while(fread(file_ptr, line) > 0)
{
sscanf(line, "{s}p<,>ffp<)>f", SpawnX, SpawnY, SpawnZ);
printf("X: %f, Y: %f, Z: %f",SpawnX, SpawnY, SpawnZ);
}
fclose(file_ptr);
Das könnte eventuell hinhauen die Idee ist gut... Muss das nur noch weng ausbarbeiten da es nicht nur eine Zeile ist sondern mind. 100 xD
//Edit
Habe es anderweitig gelöst, da ich sscanf nicht benutze und es ein bisschen Probleme gab