Platzsparend Objekte erstellen und texturieren

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • 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.

  • Nur mal so als Frage:
    Kann man die Objekte nicht einfach über die Datenbank erstellen lassen, oder würde dies zu Komplikationen kommen?
    Würde da die Datenbank überhaupt mitspielen, oder würde diese abstürzen?

  • in weniger als 5 Minuten viele Objekte mit Texturen versehen kann


    Also für mich sieht das sehr umständlich aus. Ich bleibe da lieber bei meiner Variante.


    Ich erstelle mir einfach eine globale Varaiable
    new textur;
    Nehme mir die Objekte die ich Textureiren will und packe sie in eine neue pwn Datei und suche dann nach ); und erstetze es mit );SetObjectMaterial(textur, 0, 8647, "vegashsetx", "badhousewallc01_128", 0);
    Das selbe mache ich mit dem Objekt. Suche nach CreateObject und ersetze es mit textur = CreateObject
    Am ende sieht das ganze dann so aus.
    new textur;
    textur = CreateObject(18981, 1427.87622, -1137.05530, 11.84030, 0.00000, 0.00000, 0.00000);SetObjectMaterial(textur, 0, 8647, "vegashsetx", "badhousewallc01_128", 0);
    Und schon ist die Sache gegessen. Dauert keine 2 Minuten.

  • @Rocky: Das ist auch eine Variante, aber mir wäre das viel zu unübersichtlich.

    Sieht sehr nach c&p aus, sonst ist aber ziemlich nützlich! 9/10

    :huh: Ich habe das selbst geschrieben. Ich wüsste nicht, wo es ich es kopiert haben soll.


    Kann man die Objekte nicht einfach über die Datenbank erstellen lassen, oder würde dies zu Komplikationen kommen?
    Würde da die Datenbank überhaupt mitspielen, oder würde diese abstürzen?

    Klar, kann da gerne noch einen extra Absatz machen, der das ganze genau erklärt.

  • Also da bleibe ich bei meiner Methode das via einem Define zu lösen auch, bei deiner Variante belegst du nochmal extra Speicher und bringst deine .amx noch zu anschwellen.



    #define Gras(%0) SetDynamicObjectMaterial(%0,0, 10560, "baseballground_sfs","Grass_128HV",0xFFFFFFFF)
    Gras(CreateDynamicObject(19381, 1286.54358, -1295.11670, 12.42060, 0.00000, 90.00000, 0.00000));

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • @BlackAce: Dass das geht weiß ich, wollte aber nur wissen ob das bei zu vielen Objekten vielleicht zu Komplikationen kommen kann.


    Klar, kann da gerne noch einen extra Absatz machen, der das ganze genau erklärt.


    Extra für mich brauchst du das nicht machen, da ich weiß wie es funktioniert.
    Aber andere, die es vielleicht nicht wissen, könnten es vielleicht gebrauchen ;)

  • Oha, so weit hab ich gar nicht gedacht. Ist natürlich auch eine Möglichkeit.

  • @BlackAce: Dass das geht weiß ich, wollte aber nur wissen ob das bei zu vielen Objekten vielleicht zu Komplikationen kommen kann.



    Extra für mich brauchst du das nicht machen, da ich weiß wie es funktioniert.
    Aber andere, die es vielleicht nicht wissen, könnten es vielleicht gebrauchen ;)


    Eventuell hast du ja mein Ingame Mapeditor schon einmal gesehen , bei dem gab es bisher auch noch keine Probleme mit dem Laden der Daten oder updaten
    und getestet habe ich das mal bis 4000 Objekte