Bitte um Hilfe bei Skin Auswahl per TextDraw

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
  • Hallo ( @Jeffry ),
    ich habe angefangen mit den Grundlagen der Funktion, nun weiß ich leider nicht weiter.
    Ich habe auch schon versucht per Beispiele welche ich durch Google gefunden habe, mir weiter zu helfen, leider erfolglos.


    Es soll so sein, das man nur zwischen den Skins wählen kann die im davor festgelegten Array sind.
    Wenn man dann ein Skin ausgesucht hat und Ihn auswählt, soll noch abgefragt werden ob die PoliceEXP ( eine EXP Variable ) für den Skin ausreicht, wenn nicht soll er den Skin nicht erhalten.


    Hier meine Codes & TextDraws ( bei den TextDraw ist die TextDrawSize noch verbuggt, ich weiß nicht wie ich es entbugge Bsp Bild)
    Ich bitte um eure Hilfe, ich komme nämlich alleine nicht weiter.




  • Fangen wir am besten erst mal damit an, dass du die Textdraws anklicken kannst.


    Dafür musst du die Größe das anklickbaren Bereiches mit TextDrawTextSize anpassen. https://wiki.sa-mp.com/wiki/TextDrawTextSize
    Der X Wert ist die Position PLUS die Größe des nach rechts anklickbaren Bereiches. Der Y Wert ist die geschätzte Höhe.


    Angenommen du erstellst dein Textdraw bei X = 120 und Y = 90. Dann machst du den Text "Hallo Welt" da rein. Sagen wir, der Text ist so groß, dass er in etwa über ein Zehntel deines Bildschirmes geht (musst du abschätzen, oder mit einem Lineal abmessen), dann heißt das 640 durch 10, das wäre 64. Somit ist TextDrawTextSize-X = 120 + 64 = 184.
    Nun misst, bzw. schätzt, du die Höhe des Textdraws, sagen wir mal du bekommst den Text in etwa 20 mal untereinander hin, bis dein Bildschirm von oben nach unten voll damit wäre. Heißt also: 480 durch 20, das gibt 24. Somit wäre TextDrawTextSize-Y = 24.


    640 und 480 sind die vollen Werte für Breite und Höhe, unabhängig von der Auflösung.


    Probiere mal, ob du damit klar kommst.

  • Dafür musst du die Größe das anklickbaren Bereiches mit TextDrawTextSize anpassen. wiki.sa-mp.com/wiki/TextDrawTextSize
    Der X Wert ist die Position PLUS die Größe des nach rechts anklickbaren Bereiches. Der Y Wert ist die geschätzte Höhe.


    Angenommen du erstellst dein Textdraw bei X = 120 und Y = 90. Dann machst du den Text "Hallo Welt" da rein. Sagen wir, der Text ist so groß, dass er in etwa über ein Zehntel deines Bildschirmes geht (musst du abschätzen, oder mit einem Lineal abmessen), dann heißt das 640 durch 10, das wäre 64. Somit ist TextDrawTextSize-X = 120 + 64 = 184.
    Nun misst, bzw. schätzt, du die Höhe des Textdraws, sagen wir mal du bekommst den Text in etwa 20 mal untereinander hin, bis dein Bildschirm von oben nach unten voll damit wäre. Heißt also: 480 durch 20, das gibt 24. Somit wäre TextDrawTextSize-Y = 24.


    640 und 480 sind die vollen Werte für Breite und Höhe, unabhängig von der Auflösung.

    Diesen Beitrag von dir in einem anderen Beitrag habe ich schon gelesen, leider verstehe ich es auch nicht.

  • Also:
    Beispiel dieses Textdraw:
    SkinTD[1] = TextDrawCreate(333.333343, 327.703582, "Weiter");


    Du erstellst es an X = 333.3 und Y = 327.7.


    Ich schätze jetzt (das wird nicht richtig sein!), dass dein Textdraw von der Breite her 15 mal nebeneinander auf den Bildschirm passt, also:
    640 / 15 = 42.6 => Somit ist TextDrawTextSize-X: 333.3 + 42.6 = 375.9


    Dann schätze ich, dass dein Textdraw 20 mal übereinander von oben nach unten in den Bildschirm gestapelt werden kann, also:
    480 / 20 = 24.0 => Somit ist TextDrawTextSize-Y: 24.0


    Das ergibt:
    TextDrawTextSize(SkinTD[1], 375.9, 24.0);


    Achtung: Die Schätzungen, dass es 15 mal nebeneinander und 20 mal übereinander in den Bildschirm passt sind komplett geraten, dass musst du selbst anhand der Größe abschätzen, und gegebenenfalls die Rechnung ändern.



    Kommst du damit so klar?

  • Ich habe mich gerade noch ein bisschen mit dem TDEditor beschäftigt und habe herraus gefunden, dass man es simple per TDEditor machen kann.
    Jetzt habe ich eben alle TextDrawTextSize angepasst und nun funktioniert es einwandfrei.


    Trotzdem danke das du versucht hast mir es zu erklären. :love:
    Jetzt können wir mit dem eigentlichen anfangen.

  • Unter den Includes:
    new pStep[MAX_PLAYERS];


    Beim Textdraw:
    if(clickedid == SkinTD[1]) // Kleidungs Auswahl: Weiter
    {
    if(PlayerInfo[playerid][p_PolizeiUmkleiden] == true && PlayerInfo[playerid][p_ZivUmkleiden] == false)
    {
    if(pStep[playerid] < sizeof(PolizeiSkins)-1)
    {
    pStep[playerid]++;
    SetPlayerSkin(playerid, PolizeiSkins[pStep[playerid]][SkinID]);
    }
    }
    return 1;
    }
    if(clickedid == SkinTD[2]) // Kleidungs Auswahl: Zurück
    {
    if(PlayerInfo[playerid][p_PolizeiUmkleiden] == true && PlayerInfo[playerid][p_ZivUmkleiden] == false)
    {
    if(pStep[playerid] > 0)
    {
    pStep[playerid]--;
    SetPlayerSkin(playerid, PolizeiSkins[pStep[playerid]][SkinID]);
    }
    }
    return 1;
    }


    Bei der Auswahl:
    if(PolizeiSkins[pStep[playerid]][PolizeiEXP] > PlayerInfo[playerid][EXP]) return SendClientMessage(playerid, 0xFF0000FF, "Error: Nicht genug Experience.");


    Dort wo der SPieler in die Selektion gesetzt wird:
    pStep[playerid] = 0;

  • Vielen Dank Jeffry! Es funktioniert einwandfrei.


    Das Problem mit der Tür besteht immer noch. Also das Problem welches ich im Kleinen Scripting Fragen erläutert hatte.
    Ich habe einfach mal ein Video dazu gemacht, dass du es dir vielleciht besser vorstellen kannst.


    Video

    MoveObject(SFPDINTDOOR[0], -1597.89685, 704.36829, 12.79330, 1.0, 0.00000, 0.00000, 324.67960);

  • Ah, gut dass du das Video gemacht hast.
    Das liegt daran, dass du die Position nicht änderst, sondern nur die Rotation. In dem Fall muss die Position minimal geändert werden (habe den Y Wert um 0.06 kleiner gemacht) und die Geschwindigkeit extrem klein sein.
    Versuche es so:
    MoveObject(SFPDINTDOOR[0], -1597.89685, 704.30829, 12.79330, 0.02, 0.00000, 0.00000, 324.67960);


    Passe gegebenenfalls die 0.02 etwas an, je größer desto schneller, je kleiner desto langsamer die Türe.

  • Von den vier Türen, öffnet nur die, die du mir angepasst hast langsam.
    Alle anderen habe ich ein bisschen geändert, aber die Tür wird trotzdem blitzschnell geöffnet.


    Das sind die Standard Koordinaten der Türen ( noch nicht Angepasst ).
    MoveObject(SFPDINTDOOR[1], -1596.85254, 692.64398, 12.79330, 0.02, 0.00000, 0.00000, 173.29387);
    MoveObject(SFPDINTDOOR[2], -1608.36401, 697.15552, 12.79330, 0.02, 0.0000, 0.0000, 191.1149);
    MoveObject(SFPDINTDOOR[3], -1600.89868, 696.17023, 12.79330, 0.02, 0.0000, 0.0000, 351.0745);

  • Du musst die Position etwas verschieben, damit sich die Türe flüssig rotieren kann.
    Nimm die zweite Koordinate und rechne sie -0.06, dann hast du die gleiche Geschwindigkeit.
    Du kannst es auch einfach so hinschreiben, dann ist es vielleicht besser ersichtlich:
    MoveObject(SFPDINTDOOR[1], -1596.85254, 692.64398 - 0.06, 0.02, 0.00000, 0.00000, 173.29387);


    Analog für die anderen Türen.