O script
Começaremos inicializando nossos textdraws e configurando-os. Este é apenas um copiar e colar do editor de textdraw, nada para explicar aqui.Código:
#include <a_samp> novo texto: teleportBox; novo texto: teletransporteLS; novo texto: teletransporteSF; novo texto: teletransporteLV; public OnFilterScriptInit () { imprimir ("\ n --------------------------------------"); print ("Teletransporte de Textdraw - tuto para mostrar \ n como funciona a seleção de textdraw"); imprimir ("-------------------------------------- \ n"); teleportBox = TextDrawCreate (320.000000, 143.000000, "~ n ~ Menu de teletransporte ~ n ~~ n ~~ n ~~ n ~~ n ~~ n ~~ n ~~ n ~~ n ~~ n ~~ n ~ _") ; TextDrawAlignment (teleportBox, 2); TextDrawBackgroundColor (teleportBox, 255); TextDrawFont (teleportBox, 2); TextDrawLetterSize (teleportBox, 0.500000, 1.000000); TextDrawColor (teleportBox, -1); TextDrawSetOutline (teleportBox, 0); TextDrawSetProportional (teleportBox, 1); TextDrawSetShadow (teleportBox, 1); TextDrawUseBox (teleportBox, 1); TextDrawBoxColor (teleportBox, 255); TextDrawTextSize (teleportBox, 45,000000, 115,000000); teletransporteLS = TextDrawCreate (320.000000, 180.000000, "Los Santos ~ n ~ Airport"); TextDrawAlignment (teletransporteLS, 2); TextDrawBackgroundColor (teletransporteLS, 255); TextDrawFont (teletransporteLS, 2); TextDrawLetterSize (teletransporteLS, 0,260000, 0,799999); TextDrawColor (teletransporteLS, -1); TextDrawSetOutline (teletransporteLS, 0); TextDrawSetProportional (teletransporteLS, 1); TextDrawSetShadow (teletransporteLS, 1); teletransporteSF = TextDrawCreate (320.000000, 205.000000, "San Fierro ~ n ~ Airport"); TextDrawAlignment (teletransporteSF, 2); TextDrawBackgroundColor (teletransporteSF, 255); TextDrawFont (teletransporteSF, 2); TextDrawLetterSize (teletransporteSF, 0,260000, 0,799999); TextDrawColor (teletransporteSF, -1); TextDrawSetOutline (teletransporteSF, 0); TextDrawSetProportional (teletransporteSF, 1); TextDrawSetShadow (teletransporteSF, 1); teletransporteLV = TextDrawCreate (320,000000, 230,000000, "Las Venturas ~ n ~ Aeroporto"); TextDrawAlignment (teletransporte LV, 2); TextDrawBackgroundColor (teletransporteLV, 255); TextDrawFont (teletransporte LV, 2); TextDrawLetterSize (teletransporteLV, 0,260000, 0,799999); TextDrawColor (teletransportar LV, -1); TextDrawSetOutline (teletransporteLV, 0); TextDrawSetProportional (teletransporteLV, 1); TextDrawSetShadow (teletransporte LV, 1); return 1; }
A fim de tornar os textdraws clicáveis, precisaremos usar TextDrawSetSelectAble. Este código irá na parte inferior do OnGameModeInit (verifique o script de origem se você tiver problemas com ele):
Código:
TextDrawSetSelectable (teleportBox, false); TextDrawSetSelectable (teletransporteLS, verdadeiro); TextDrawSetSelectable (teleportSF, true); TextDrawSetSelectable (teleportLV, true);
Estou usando um script de filtro para este tutorial, então preciso destruir os textdraws quando estou descarregando o script.
Código:
public OnFilterScriptExit () { TextDrawDestroy (teleportBox); TextDrawDestroy (teletransporteLS); TextDrawDestroy (teletransporteSF); TextDrawDestroy (teletransporteLV); return 1; }
Estou usando um comando para buscar o menu de teletransporte. Eu sei que estou usando strcmp, mas não vou usar ZCMD para apenas um comando simples.
Neste comando estaremos mostrando os textdraws para o jogador e permitindo que ele selecione os textdraws:
Código:
public OnPlayerCommandText (playerid, cmdtext []) { if (! strcmp ("/ teleport", cmdtext, true)) { TextDrawShowForPlayer (playerid, teleportBox); // Mostra a caixa TextDrawShowForPlayer (playerid, teletransporteLS); // Mostra a opção LS TextDrawShowForPlayer (playerid, teleportSF); // Mostra a opção SF TextDrawShowForPlayer (playerid, teleportLV); // Mostra a opção LV SelectTextDraw (playerid, 0xA3B4C5FF); // Permite que o jogador selecione desenhos de texto. // O segundo parâmetro é a cor para a qual o textdraw muda quando você passa o mouse sobre ele. // Você também pode usar coisas como COLOR_RED, a escolha é sua. return 1; } return 0; }
Espero que você tenha entendido tudo até agora. Se não, deixe um comentário.
O jogador agora é capaz de selecionar textdraws (ou, pelo menos, os textdraws que permitimos a ele selecionar usando TextDrawSetSelectable). Depois que ele selecionou e clicou em um desenho de texto, precisamos processar seu 'clique'.
Vou postar o código básico:
Código:
public OnPlayerClickTextDraw (playerid, Texto: clickedid) { if (clickedid == teleportLS) // Se o jogador clicou no textdraw teleportLS, teletransporte-o para lá! { SetPlayerPos (playerid, 1630.2030, -2328.9673,13.5469); SetPlayerFacingAngle (playerid, 0,9392); } else if (clickedid == teleportSF) // O mesmo que acima, mas para SF { SetPlayerPos (playerid, -1424,6083, -290,9622, 14,1484); SetPlayerFacingAngle (playerid, 134.9570); } else if (clickedid == teleportLV) // Mesmo, mas para LV { SetPlayerPos (playerid, 1688.7990, 1447.7753, 10.7675); SetPlayerFacingAngle (playerid, 267.3902); } // Esconda os desenhos de texto após o jogador se teletransportar. TextDrawHideForPlayer (playerid, teleportBox); TextDrawHideForPlayer (playerid, teletransporteLS); TextDrawHideForPlayer (playerid, teleportSF); TextDrawHideForPlayer (playerid, teleportLV); CancelSelectTextDraw (playerid); // Tudo funcionou perfeitamente, agora pare o jogador para poder selecionar shizzle. return 1; }
'Feito', você pode dizer. No entanto, há uma falha ao usar CancelSelectTextDraw: ele chama OnPlayerClickTextDraw. Este código reSoltar em um retorno
Precisamos corrigir este código. CancelSelectTextDraw chama OnPlayerClickTextDraw com INVALID_TEXT_DRAW, portanto, a solução alternativa é fácil:
Código:
public OnPlayerClickTextDraw (playerid, Texto: clickedid) { if (_: clickedid! = INVALID_TEXT_DRAW) // Se o jogador clicou em um desenho de texto válido, continue com a codificação. (_: var remove a tag Text: para evitar incompatibilidade de tags) { if (clickedid == teletransporteLS) { SetPlayerPos (playerid, 1630.2030, -2328.9673,13.5469); SetPlayerFacingAngle (playerid, 0,9392); } else if (clickedid == teleportSF) { SetPlayerPos (playerid, -1424,6083, -290,9622, 14,1484); SetPlayerFacingAngle (playerid, 134.9570); } else if (clickedid == teleportLV) { SetPlayerPos (playerid, 1688.7990, 1447.7753, 10.7675); SetPlayerFacingAngle (playerid, 267.3902); } TextDrawHideForPlayer (playerid, teleportBox); TextDrawHideForPlayer (playerid, teletransporteLS); TextDrawHideForPlayer (playerid, teleportSF); TextDrawHideForPlayer (playerid, teleportLV); CancelSelectTextDraw (playerid); // Isso realmente chamará OnPlayerClickTextDraw novamente, mas com um ID de 65535. O código acima impede que resulte em um loop eterno. } return 1; }
Espero que você tenha aprendido algo com este tutorial. Se você ainda tiver dúvidas, poste-as neste tópico (Não me mande PM).

0 Comentários