Laut dem Wiki: http://wiki.sa-mp.com/wiki/PlayerTextDrawSetSelectable
"Use PlayerTextDrawTextSize to define the clickable area."
Laut dem Wiki: http://wiki.sa-mp.com/wiki/PlayerTextDrawSetSelectable
"Use PlayerTextDrawTextSize to define the clickable area."
Korrekt, Problem besteht aber darin, dass ich die Positionen davon nicht herausfinde.
Ich habe das immer mit einem TextDrawEditor eingestellt. Weiß leider nicht von wem der war. Der war recht simple und lief über Dialoge.
Zuvor habe ich es per Augenmaß eingerichtet, was auch immer gut funktioniert hat.
Normalerweise sollte aber TextSize auch die Größe der Box regeln (wenn Box verwendet wird), wenn es mich nicht täuscht. Das heißt, du kannst ja sozusagen Ingame die Box als Prüfmaß hernehmen.
Der Lösungsvorschlag bringt mir leider irgendwie derzeit auch nichts. Vielleicht liegt es gerade am Wetter, dass meine Birne nicht 100%ig läuft.
GUI_Login[playerid][3] = CreatePlayerTextDraw(playerid, 459.745239, 253.500000, "usebox");
PlayerTextDrawLetterSize(playerid, GUI_Login[playerid][3], 0.000000, 2.340741);
PlayerTextDrawTextSize(playerid, GUI_Login[playerid][3], 331.587097, 20.000000);
PlayerTextDrawAlignment(playerid, GUI_Login[playerid][3], 1);
PlayerTextDrawColor(playerid, GUI_Login[playerid][3], 0);
PlayerTextDrawUseBox(playerid, GUI_Login[playerid][3], true);
PlayerTextDrawBoxColor(playerid, GUI_Login[playerid][3], 0);
PlayerTextDrawSetShadow(playerid, GUI_Login[playerid][3], 0);
PlayerTextDrawSetOutline(playerid, GUI_Login[playerid][3], 0);
PlayerTextDrawFont(playerid, GUI_Login[playerid][3], 0);
PlayerTextDrawSetSelectable(playerid, GUI_Login[playerid][3], 1);
Was willst du denn auch für eine Position herausfinden? Du musst sie doch selbst angeben.
Zu aller Erst: Der X-Parameter von PlayerTextDrawLetterSize liegt bei 0.0. Das ist so nicht möglich. Auch wenn eine Box angezeigt wird, diese wirst du trotzdem nicht anklicken können. Wenn du eine Box haben möchtest ohne Text, dann verwende ein "_", diese werden nämlich nicht angezeigt. Oder verwende direkt ein Sprite (Das bringt am wenigsten Probleme). Den zweiten Parameter (Y-Position) kriegst du mit einer Multiplikation von 0.135 raus. (Wie auf der Wiki-Seite: http://wiki.sa-mp.com/wiki/PlayerTextDrawLetterSize).
Das heißt, wenn die Box bei PlayerTextDrawTextSize(playerid, tmptxd, 499.745239, 20.000000); liegt, dann sollte LetterSize folgendermaßen aussehen: PlayerTextDrawLetterSize(playerid, tmptxd, 1.000000, 2.700000); (Hier berechnet: 20*0.135).
Die Positionen bei CreatePlayerTextDraw sind immer die Start-Positionen. Also sollte PlayerTextDrawTextSize im besten Fall über dessen sein (tausche in diesem Fall die X-Positionen der beiden Funktionen).
Mit folgendem Code wird eine rote Box erstellt, welche keine Zeichen besitzt, 20 Einheiten hoch ist und 168.158142 Einheiten breit:
new PlayerText:tmptxd = CreatePlayerTextDraw(playerid, 331.587097, 253.500000, "_");
PlayerTextDrawLetterSize(playerid, tmptxd, 1.000000, 2.700000);
PlayerTextDrawTextSize(playerid, tmptxd, 499.745239, 20.000000);
PlayerTextDrawAlignment(playerid, tmptxd, 1);
PlayerTextDrawColor(playerid, tmptxd, 0xFF0000FF);
PlayerTextDrawUseBox(playerid, tmptxd, true);
PlayerTextDrawBoxColor(playerid, tmptxd, 0xFF0000FF);
PlayerTextDrawSetShadow(playerid, tmptxd, 0);
PlayerTextDrawSetOutline(playerid, tmptxd, 0);
PlayerTextDrawFont(playerid, tmptxd, 0);
PlayerTextDrawSetSelectable(playerid, tmptxd, 1);
PlayerTextDrawShow(playerid, tmptxd);
SelectTextDraw(playerid, 0x000000FF);
Alles anzeigen
Der ganze Bereich ist anklickbar.
Wie gesagt, wenn du dir es einfacher machen möchtest, dann benutze einfach ein Sprite (gibt ja einen Quadrat), dann musst du nicht die Start- und End-Positionen berechnen.
Guten Abend,
Ich bin grade dabei ein Dynamisches Fraktionssystem zuschreiben und komme irgendwie nicht weiter,
wie kann ich wenn ich alle Fraktionen auflist per schleife im DIALOG_STYLE _LIST das letzte listitem herrausfinden?
Ich bedanke mich schonmal im vorraus für eure unterstützung.
MfG,
iTzTrappY
Könntest einfach ne Variable hochzählen lassen (vorher prüfen ob die Fraktion existiert etc.) müsstest dann aber bei -1 anfangen da listitems bei 0 anfangen (bin mir da nicht sicher)
Könntest einfach ne Variable hochzählen lassen (vorher prüfen ob die Fraktion existiert etc.) müsstest dann aber bei -1 anfangen da listitems bei 0 anfangen (bin mir da nicht sicher)
Stimmt danke
Da musst du eigentlich nichts abziehen, da ja dein index bei 0 beginnt und dein listitem auch
//Mal bisschen Pseudo-Code:
new string[MAX_FRAKTIONEN * 16];
for(new i; i<MAX_FRAKTIONEN; i++)
{
format(string,sizeof(string),"%s%s\n",string,Fraktion[i][Frak_Name]);
}
if(string[0] == EOS) return SCM(playerid,-1,"* Es existieren noch keine Fraktionen!");
ShowPlayerDialog(playerid,500,DIALOG_STYLE_LIST,"Fraktions Liste",string,"Okay","");
Es ist wichtig, dass du keine Fraktionen auslässt.
Sagen wir beispielsweise dein Array sieht so aus:
Fraktion[0][Frak_Name] = "LSPD";
Fraktion[1][Frak_Name] = "Empty";
Fraktion[2][Frak_Name] = "SFPD";
Wichtig ist, dass du dann auch das Empty anzeigst, weil sonst ja deine listitems komplett durcheinander geraten.
Falls du das nicht willst, gibt es viele Möglichkeiten das zu Problem anderweitig zu lösen..entweder mit Arrays oder du packst die Fraktionsid einfach in den String und splittest die wieder raus xD
Alles anzeigenDa musst du eigentlich nichts abziehen, da ja dein index bei 0 beginnt und dein listitem auch
C//Mal bisschen Pseudo-Code: new string[MAX_FRAKTIONEN * 16]; for(new i; i<MAX_FRAKTIONEN; i++) { format(string,sizeof(string),"%s%s\n",string,Fraktion[i][Frak_Name]); } if(string[0] == EOS) return SCM(playerid,-1,"* Es existieren noch keine Fraktionen!"); ShowPlayerDialog(playerid,500,DIALOG_STYLE_LIST,"Fraktions Liste",string,"Okay","");
Es ist wichtig, dass du keine Fraktionen auslässt.
Sagen wir beispielsweise dein Array sieht so aus:
CFraktion[0][Frak_Name] = "LSPD"; Fraktion[1][Frak_Name] = "Empty"; Fraktion[2][Frak_Name] = "SFPD";
Wichtig ist, dass du dann auch das Empty anzeigst, weil sonst ja deine listitems komplett durcheinander geraten.
Falls du das nicht willst, gibt es viele Möglichkeiten das zu Problem anderweitig zu lösen..entweder mit Arrays oder du packst die Fraktionsid einfach in den String und splittest die wieder raus xD
Ich möchte als letztes listitem machen das man eine erstellen kann, aber danke für die hilfreichen Informationen.
MfG,
iTzTrappY
Somit läuft der Timer nicht permanent (?).
Da würde ich trotzdem einen Timer nehmen, der permanent läuft und in der Schleife prüft, ob der Spieler im DM ist.
Das ist bei mehreren Spielern besser, da nur ein Timer läuft.
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(PlayerInDM[i])
{
//Mache etwas
}
}
Hey,
ich scheitere gerade an der einfachsten Logik und bin irgendwie am verzweifeln.
Ich habe folgenden Befehl:
new Float:X,Float:Y,Float:Z;
new nachricht[128], text[128];
new pActor,Farbe;
GetActorPos(pActor,X,Y,Z);
if (sscanf(params, "iss",pActor,Farbe,text))return SendClientMessage(playerid,COLOR_WHITE, "[hilfe] -");
format(nachricht, sizeof(nachricht),"%s",text);
Create3DTextLabel(nachricht,Farbe,X,Y,Z+0.3,5.0,0);
So jetzt das Problem: Der Befehl lautet InGame dann: /textdraw [ID des Actor] [Farbe] [Text], das Problem ist, wenn ich die Farbe eingebe, die ich oben definiert habe z.B. #define COLOR_WHITE 0xFFFFFFAA und probiere dann dort in dem Befehl einzugeben(Mit COLOR_WHITE) kommt immer ein schwarzer Text InGame. (Text und mit der ID funktioniert alles)
Wo liegt der Fehler?
PS: Hab erst angefangen mit dem Scripten, bitte nicht all zu streng sein mit dem Code^^
Ich bedanke mich im Voraus für die Hilfe
Alles anzeigenHey,
ich scheitere gerade an der einfachsten Logik und bin irgendwie am verzweifeln.
Ich habe folgenden Befehl:
new Float:X,Float:Y,Float:Z;new nachricht[128], text[128];new pActor,Farbe;GetActorPos(pActor,X,Y,Z);if (sscanf(params, "iss",pActor,Farbe,text))return SendClientMessage(playerid,COLOR_WHITE, "[hilfe] -");format(nachricht, sizeof(nachricht),"%s",text);Create3DTextLabel(nachricht,Farbe,X,Y,Z+0.3,5.0,0);
So jetzt das Problem: Der Befehl lautet InGame dann: /textdraw [ID des Actor] [Farbe] [Text], das Problem ist, wenn ich die Farbe eingebe, die ich oben definiert habe z.B. #define COLOR_WHITE 0xFFFFFFAA und probiere dann dort in dem Befehl einzugeben(Mit COLOR_WHITE) kommt immer ein schwarzer Text InGame. (Text und mit der ID funktioniert alles)
Wo liegt der Fehler?
PS: Hab erst angefangen mit dem Scripten, bitte nicht all zu streng sein mit dem Code^^
Ich bedanke mich im Voraus für die Hilfe
Sowas kann nicht funktionieren.
COLOR_WHITE ist nicht das selbe wie "COLOR_WHITE"
Das eine ist eine definition, das andere ist ein string.
Du kannst entweder den benutzer einen Farbcode eingeben lassen, oder du machst es so:
new Float:X, Float:Y, Float:Z,
nachricht[128], text[128],
pActor, Farbe[32], colorcode;
if (sscanf(params, "is[32]s[128]", pActor, Farbe, text)) return SendClientMessage(playerid, COLOR_WHITE, "[hilfe] -");
GetActorPos(pActor, X, Y, Z);
format(nachricht, sizeof(nachricht), "%s", text);
if (!strcmp(Farbe, "weiß", true)) colorcode = COLOR_WHITE;
else if (!strcmp(Farbe, "schwarz", true)) colorcode = COLOR_BLACK;
else if (!strcmp(Farbe, "rot", true)) colorcode = COLOR_RED;
// etc.
else return SendClientMessage(playerid, COLOR_WHITE, "Ungültige Farbe.");
Create3DTextLabel(nachricht, colorcode, X, Y, Z+0.3, 5.0, 0);
Jetzt hatte ich dir gerade geantwortet
GUI_Login[playerid][1] = CreatePlayerTextDraw(playerid, 326, 258.166687, "usebox");
PlayerTextDrawLetterSize(playerid, GUI_Login[playerid][1], 0.000000, 2.470367);
PlayerTextDrawAlignment(playerid, GUI_Login[playerid][1], 1);
PlayerTextDrawColor(playerid, GUI_Login[playerid][1], 0);
PlayerTextDrawUseBox(playerid, GUI_Login[playerid][1], true);
PlayerTextDrawBoxColor(playerid, GUI_Login[playerid][1], 102);
PlayerTextDrawSetShadow(playerid, GUI_Login[playerid][1], 0);
PlayerTextDrawSetOutline(playerid, GUI_Login[playerid][1], 0);
PlayerTextDrawFont(playerid, GUI_Login[playerid][1], 0);
PlayerTextDrawTextSize(playerid, GUI_Login[playerid][1], 447, 20);
PlayerTextDrawSetSelectable(playerid, GUI_Login[playerid][1], true);
PlayerTextDrawShow(playerid,GUI_Login[playerid][1]);
GUI_Login[playerid][2] = CreatePlayerTextDraw(playerid, 326, 311.250000, "usebox");
PlayerTextDrawLetterSize(playerid, GUI_Login[playerid][2], 0.000000, 2.405555);
PlayerTextDrawTextSize(playerid, GUI_Login[playerid][2], 447, 2.405555);
PlayerTextDrawAlignment(playerid, GUI_Login[playerid][2], 1);
PlayerTextDrawColor(playerid, GUI_Login[playerid][2], 0);
PlayerTextDrawUseBox(playerid, GUI_Login[playerid][2], true);
PlayerTextDrawBoxColor(playerid, GUI_Login[playerid][2], 102);
PlayerTextDrawSetShadow(playerid, GUI_Login[playerid][2], 0);
PlayerTextDrawSetOutline(playerid, GUI_Login[playerid][2], 0);
PlayerTextDrawFont(playerid, GUI_Login[playerid][2], 0);
PlayerTextDrawTextSize(playerid, GUI_Login[playerid][2], 447, 20);
PlayerTextDrawSetSelectable(playerid, GUI_Login[playerid][2], true);
PlayerTextDrawShow(playerid,GUI_Login[playerid][2]);
Alles anzeigen
Kannst ja mal n Blick darauf werden, falls es doch noch Unklarheiten geben sollte
Hi. Ich versuche gerade, einen Actor nach Erstellung einen User anschauen zu lassen. Dazu habe ich folgende Funktion gefunden, die ich etwas für meine Zwecke angepasst habe:
http://forum.sa-mp.com/showthread.php?t=28664&page=3
Jetzt wird die Richtung des Actors allerdings erst geändert, wenn er neu gestreamt wird. Hat jemand eine gute Idee für einen Workaround, ohne den Spieler temporär wegporten zu müssen? Mir fiele noch ein, den Actor einfach mit der richtigen Angle neu zu erstellen, allerdings hatte ich gehofft, da eine besser Lösung zu finden.
Danke im Voraus.
Mein Pawno Compiler brauch ungewöhnlich lange zu compilieren bei knapp 1600 Zeilen woran kann dies Liegen?
Ein möglicher Grund sind viele Variablen oder sehr große Arrays, oder beides zusammen.
Die Anzahl der Zeilen ist eher zweitrangig.
Was heißt ungewöhnlich lange? Der Code meines ehemaligen Gamemodes hat ca. 1 Minute kompiliert.
30 Sekunden,
Als ich gestern weiter machte ging es noch schneller und dann hatte ich glaub das Faktionsvehicle system geschrieben und dannach braucht er länger :o
dann hatte ich glaub das Faktionsvehicle system geschrieben und dannach braucht er länger :o
Möglicherweise hast du dort ein großes Array eingebaut, eventuell unabsichtlich.
Beachte, dass mehrdimensionale Array sich natürlich aufmultiplizieren.
Wie groß ist deine AMX Datei?
Möglicherweise hast du dort ein großes Array eingebaut, eventuell unabsichtlich.
Beachte, dass mehrdimensionale Array sich natürlich aufmultiplizieren.
Wie groß ist deine AMX Datei?