Guten Abend,
aufgrund eines Threads möchte ich nun eine gute und angenehme Technik erklären, mit der man Platzsparend und in weniger als 5 Minuten viele Objekte mit Texturen versehen kann.
Schritt 1: Enum
enum walls
{
}
Aber warum? Es ist - einfach gesagt - eine große Box mit vielen kleinen Schubladen. Diese Schubladen werden wir später mit Daten füllen. ( Viele kennen das ja aus den Login & Registersystemen)
Nun müssen wir neue Schubladen anlegen. Dazu überlegen wir nochmal, was wir wollen. Wir wollen ein Objekt erstellen. Deswegen schauen wir uns die Parameter von "CreateDynamicObject" an.
Diese sind:
Model - Modelid des Objektes
X, Y & Z - Koordinaten des Objektes
Rx, Ry & Rz - Rotation des Objektes
World - ID der Welt ( default : -1 )
Interior - Interiorid ( default : -1 )
playerid - Playrid ( default : -1 )
Streamdistance - Wann das Objekt streamt
Drawdistance
Wir füllen also die Box mit den Schubladen
enum wall
{
mod, //modelid
Float:x, //x achse
Float:y, //y achse
Float:z, // z achse
Float:rx, // rotation auf der x achse
Float:ry, // rotation auf der y achse
Float:rz, // rotation auf der z achse
world, // welt
inter, // interior
player, // player
streamd, //streamdistance
drawd //drawdistance
}
Schritt 2: Daten
Die Box ist nun fertig. Nun ist es an der Zeit, diese zu füllen.
Dies geschieht mit
static const NAME[][NAME_DES_ENUMS] = {
};
Warum const? constbedeutet, dass die Daten immer gleich bleiben. Beispiel:
const variable = 5;
variable = 4;
//Error! Ich darf "variable" nicht ändern
A static variable is like a global new variable but with a more limited scope. When static is used globally the resulting created variables are limited to only the section in which they were created (see #section). So taking the earlier "new" example: - Wiki
Das heißt, Variablen, die mit static deklariert werden, sind nur auf lokaler Ebene "sichtbar". Sie sind also für andere Script unsichtbar.
Die Formatierung ist folgendermaßen
static const NAME[][NAME_DES_ENUMS] = {
{model..},
{model..}
};
Schritt 3: Konvertieren
Pro-Tipp:
Zum konvertieren der MapDaten, empfiehlt sich http://convertffs.com/
Hier kann man sein eigenes Format angeben. ( Change - add custom Format )
In unserem Fall brauchen wir {{model},{x},{y},{z},{rx},{ry},{rz},-1,-1,-1,200,-1},
Wenn wir also unserer Objekte konvertiert haben, können wir sie einsetzen.
static const wall_obj[][wall] = { // WÄNDE
{19446,219.6636000,1834.9028300,10003.3134800,0.0000000,0.0000000,0.0000000,-1,-1,-1,200,0},
{..},
{..} // <- letzter Eintrag hat kein Komma!
};
Nun haben wir die Schublade mit Informationen gefüllt, die wir zum erstellen brauchen.
Schritt 4: Laden
Jetzt erstellen wir die Objekte.
Dazu gehen wir zu OnGameModeInit und erstellen eine Schleife, die die Daten der einzelnen Schubladen durchgeht.
new g;
for(;g< sizeof(wall_obj);g++)
{
CreateDynamicObject(wall_obj[g][mod],wall_obj[g][x],wall_obj[g][y],wall_obj[g][z],wall_obj[g][rx],wall_obj[g][ry],wall_obj[g][rz],wall_obj[g][world],wall_obj[g][inter],wall_obj[g][player],
wall_obj[g][streamd],wall_obj[g][drawd]);
}
Die Objekte werden nur erstellt. Nun wollen wir diese noch mit einer Textur versehen
Dafür verwenden wir SetDynamicObjectMaterial
Pro-Tipp: http://textures.future-elife.com/?page=textures . Hier suche ich meine Texturen. Super Seite mit vorgefertigtem Code.
Ich mache das dann immer folgendermaßen.
new g;
for(;g< sizeof(wall_obj);g++)
{
// SetObjectMaterial(CreateObject(...), 0, 18202, "w_towncs_t", "hatwall256hi", 0xFFFFFFFF); <- Ich kopiere also den Code von der Website.
CreateDynamicObject(wall_obj[g][mod],wall_obj[g][x],wall_obj[g][y],wall_obj[g][z],wall_obj[g][rx],wall_obj[g][ry],wall_obj[g][rz],wall_obj[g][world],wall_obj[g][inter],wall_obj[g][player],
wall_obj[g][streamd],wall_obj[g][drawd]);
}
Nun schreibe ich vor CreateDynamicObject SetDynamicObjectMaterial(
for(;g< sizeof(wall_obj);g++)
{
// SetObjectMaterial(CreateObject(...), 0, 18202, "w_towncs_t", "hatwall256hi", 0xFFFFFFFF); <- Ich kopiere also den Code von der Website.
SetDynamicObjectMaterial(CreateDynamicObject(wall_obj[g][mod],wall_obj[g][x],wall_obj[g][y],wall_obj[g][z],wall_obj[g][rx],wall_obj[g][ry],wall_obj[g][rz],wall_obj[g][world],wall_obj[g][inter],wall_obj[g][player],
wall_obj[g][streamd],wall_obj[g][drawd]);
}
Jetzt setze ich hinter die letzte rechteckige Klammer ein Komma "," und kopiere den Rest des Codes der Website. 0, 18202, "w_towncs_t", "hatwall256hi", 0xFFFFFFFF);
for(;g< sizeof(wall_obj);g++)
{
// SetObjectMaterial(CreateObject(...), 0, 18202, "w_towncs_t", "hatwall256hi", 0xFFFFFFFF); <- Ich kopiere also den Code von der Website.
CreateDynamicObject(wall_obj[g][mod],wall_obj[g][x],wall_obj[g][y],wall_obj[g][z],wall_obj[g][rx],wall_obj[g][ry],wall_obj[g][rz],wall_obj[g][world],wall_obj[g][inter],wall_obj[g][player],
wall_obj[g][streamd],wall_obj[g][drawd]), 0, 18202, "w_towncs_t", "hatwall256hi", 0xFFFFFFFF);
}
Fertig. Die Objekte sind nun fertig texturiert.
Mit dieser Technik sparen wir uns sehr viel Arbeit und Mühe.
Grüße, Raven.