[Tutorial] Manual sobre Dialogs [Atualizado 0.3.7]
#1

Estou atualizando meus tutoriais de dialog para 0.3.7 por pedidos de amigos e editando todos meus antigos sobre o mesmo assunto para esse. ( 21/04/2015 e 22/04/2015 ).
#EmFinalizaзгoAinda

Antes de comeзarmos a desenvolver nossos dialogs, devemos aprender algumas coisas bбsicas:

Barra de Escape

Quote:

Em vбrias linguagens de programaзгo o caractere de aspas duplas (") й utilizado para delimitar uma cadeia de caracteres. Caso seja necessбrio utilizar o caractere de aspas duplas dentro da cadeia sem evocar seu significado de delimitar, utiliza-se o caractere de escape para que o compilador interprete as aspas duplas como um caractere da cadeia. Em geral, este caractere й a barra contrбria (\). - Wikipйdia

Ou seja, ele quer dizer que, se vocк por:
PHP код:
SendClientMessage(playerid, -1"Olб Mundo, meu nome й "Jonathan" "); 
O compilador irб reclamar e vai causar erro de Sintaxe. Entгo o certo de se fazer й adicionar a barra contrбria(escape) para que o compilador entenda como um simples caractere do seu texto. Veja:
PHP код:
SendClientMessage(playerid, -1"Olб Mundo, meu nome й \"Jonathan\" "); 
O que й \n e \r?

Ambos servem para pular linhas, mas diferem no quesito do Sistema O.
O \r й usado para pular linhas apenas no Windows, e \n Linux e Windows. Por isso a gente encontra apenas \n, e nгo \r. Fique espero em questхes sobre essas em concursos .

Exemplo:
PHP код:
print("Oi, eu sou o: \nJFS");
/* Saнda:
Oi, eu sou o:
JFS
*/ 
Usando o \t em dialog

Й como se fosse um TAB. Melhoraram bastante na 0.3.7!
Veja um exemplo em imagem de como era.
Veja um exemplo de como estб agora. Aliбs, usando DIALOG_LIST estб do mesmo jeito. Sу que agora temos mais duas opзхes de dialogs, uma delas й a da segunda imagem. Sobre isso vou falar ao decorrer do tutorial.

Entendo a funзгo format

Vamos primeiro entender o bбsico de todas as linguagens de programaзгo e o que mais usamos:

Quote:

%i - Para nъmeros Inteiros
%d - Para nъmero inteiros
%s - Para tipo String - Sequкncia de caracteres
%f - Para tipo Float, nъmeros decimais.

Quando devo usar format? Quando vocк quer incluir variбveis dentro de caracteres.
O que й variбvel? Assunto meio complexo, mas o que vocк deve saber aqui, й que elas comeзam com new na linguagem pawn, diferente das POO.
Qual diferenзa do %i e %d? Nenhuma, tanto faz um ou outro. Os dois sгo inteiros.

Exemplos:


PHP код:
new Strj[128];
// Exemplo nъmeros inteiros:
new numero 18;
format(Strjsizeof(Strj), "Esse Nъmero й %d"numero);
format(Strjsizeof(Strj), "Esse Nъmero й %i"numero);
// Exemplo nъmeros do tipo String(Caracteres)
new nome[] = "Jonathan";
format(Strjsizeof(Strj), "Meu Nome й: %s"nome);
// Exemplo nъmeros do tipo Float
new numero 18.5;
format(Strjsizeof(Strj), "Esse nъmero й: %f"numero); 
Observaзхes: Usei apenas uma variбvel Strj para nгo ficar criando toda hora e alocando mais memуria no servidor. Botei 128 pois й o nъmero de carбteres mбximo no chat. No caso do Dialog, vocк vai precisar muito mais, pois nгo й sу aquela linha pequena do Chat, vocк pode por muito mais informaзхes. Lembrando que o sizeof retorna o valor da variбvel, que no caso aн й 128(Strj).

Com isso, concluнmos que vamos usar format em alguns casos, pois й para vocк puxar uma variбvel. Exemplo em um dialog de entrada:

Quote:

Seu Nick: %s estб registrado!
Bem-Vindo ao servidor, digite sua senha para conectar-se!

O %s й um caracter do tipo String, ou seja, usamos para pegar o nome do Player.


Colocando Cores em Dialogs/Mensagens

Essas cores, para vocк estб vendo pela primeira vez, sгo em hexadecimais. Vocк pode ver aqui diversos jeitos diferentes de se fazer. Vou fazer aqui uma menos usual e menos trabalhosa:

PHP код:
#define COR_VERMELHO_HEX "{00FF00}" 
PHP код:
SendClientMessage(playerid, -1"Aqui estб branco por conta do ( -1 ), e "COR_VERMELHO_HEX" aqui estб vermelho por conta da sua cor definida em cima."); 
Podemos tambйm fazer direto:
PHP код:
SendClientMessage(playerid, -1"{FFFFFF}Aqui estб branco, {00FF00}Aqui verde, {FFFFFF}Aqui dnv estб branco, {FF0000} mas agora estб vermelho."); 
Porque eu recomendo fazer do primeiro jeito? Porque eu quero! Mentira, й porque imagine que vocк queira usar em vбrios dialogs, vocк vai querer copiar e colar sempre os hexadecimais? Pode ser que sim, mas aн fica a critйrio do programador.



Lembrando que tudo que eu mencionei atй agora, nгo й usado somente em dialogs e muito menos exclusivo da linguagem pawn.


O que й dialog?

No SAMP, simplesmente falando, й uma caixa de dialog onde vocк pode interagir com o Player, podendo ser com perguntas, listas, etc. Para vocк entender melhor, й aquela caixinha preta no qual vocк coloca a senha, informaзхes, entre outras coisas, ao logar no servidor.

Estilos de DIALOGS

Quote:

0 - DIALOG_STYLE_MSGBOX - Quando vocк quer transmitir uma mensagem
1 - DIALOG_STYLE_INPUT - Quando vocк quer que o Player interaja com algo. Ou seja, um campo de texto.
2 - DIALOG_STYLE_LIST - Quando vocк quer mostrar uma lista de opзхes ao player.
3 - DIALOG_STYLE_PASSWORD - Quando vocк quer que o Player bote uma senha.
4 - DIALOG_STYLE_TABLIST - Um Dialog List com tabelas.( apenas 0.3.7+ )
5 - DIALOG_STYLE_TABLIST_HEADERS - Um Dialog list com tabelas e subtнtulos.( apenas 0.3.7+ )

Estrutura do Dialog

PHP код:
ShowPlayerDialog(PAR1PAR2PAR3"PAR4""PAR5""PAR6""PAR7"); 
Quote:

ShowPlayerDialog: Funзгo de Mostrar a Dialog.
PAR1: Parвmetro onde botamos o ID(pronъncia: Aнdi e nгo idк) do player. Normalmente й playerid pois geralmente й para o player que estб fazendo a aзгo.
PAR2: ID do dialog. Daremos uma identificaзгo pra ele. No seu caso й seu CPF, aqui й nъmero natural. Nгo podem haver dois iguais pois causarб conflito.
PAR3: Estilo do dialog. Nome ou ID.
PAR4: Tнtulo do dialog
PAR5: Texto do dialog
PAR6: Texto do botгo um do dialog
PAR7: Texto do botгo dois do dialog

Vamos a um exemplo do tipo DIALOG_STYLE_MSGBOX simples:

PHP код:
ShowPlayerDialog(playerid123DIALOG_STYLE_MSGBOX"Aviso!""Aqui й apenas uma mensagem para vocк!""Fechar""Ok"); 
Entendendo a public OnPlayerDialogResponse

Esse mйtodo jб vem como nativo. Vocк nгo precisa cria-lу. Basta pesquisar no pawno ou caso nгo exista, adicione no final do GameMode.

PHP код:
public OnDialogResponse(playeriddialogidresponselistiteminputtext[])
{
    
// bloco de cуdigos
    
return false// ou return 0

Ela й chamada toda vez que vocк aperta em um dos dois botхes do dialog. Seus parвmetros sгo: playerid, que no caso й o ID do Player, dialogid que й o "CPF" de seu Dialog, response que vai detectar se tu apertou no botгo da direita ou esquerda, listitem para detectar qual opзгo vocк colocou caso vocк utilize DIALOG_STYLE_LIST, DIALOG_STYLE_TABLIST ou DIALOG_STYLE_TABLIST_HEADERS, e inputtext para pegar o que vocк colocou no campo de texto, no caso o DIALOG_STYLE_INPUT ou DIALOG_STYLE_PASSWORD.



Estrutura do DIALOG_STYLE_MSGBOX



PHP код:
ShowPlayerDialog(playerid1281DIALOG_STYLE_MSGBOX"{F60000}Meu Tнtulo em Cor Diferente""Bem Vindo ao Servidor\nEsse й meu Primeiro DIALOG MSG""Abrir""Okay"); 
Como jб estudamos os parвmetros, sabemos o que estб ocorrendo ai. Vale ressaltar que o Dialog 1281 й apenas um exemplo, vocк pode por qual quiser, contanto que seja diferente dos outros.

Vamos agora para um segundo exemplo mais complexo:
PHP код:
new Exemplo[50];
new 
Nome[] = "Jonathan Feitosa";
format(Exemplosizeof(Exemplo), "Olб %s!\nBem Vindo ao servidor!"Nome);
ShowPlayerDialog(playerid1DIALOG_STYLE_MSGBOX"Welcome!"Exemplo"Fechar""Okay"); 
Nesse caso, utilizando o format, podemos adicionar variбveis em nossos dialogs. E isso servirб para todos os dialogs! Nгo vai mudar nada.


Agora, vamos por a resposta em nossos dialogs! Servirб para detectar quando o Player apertar no Botгo1 ou Botгo2.

PHP код:
// Adicione em algum comando, ou qualquer lugar para abrir nosso Dialog:
ShowPlayerDialog(playerid1DIALOG_STYLE_MSGBOX"Meu Primeiro Dialog""Aperte em Ganhar Grana para ganhar 1000 reais\nAperte em Perder Grana para perder 1000 reais""Ganhar Grana""Perder Grana");
// Na public do seu GameMode:
public OnDialogResponse(playeriddialogidresponselistiteminputtext[])
{
    if(
dialogid == 1// o "CPF do dialog", Se eu botei 1 lб, devo botar 1 aqui !
    
{
        if(
response// Se apertou no Botгo 1 (Ganhar Grana)
        
{
            
GivePlayerMoney(playerid1000);
            
SendClientMessage(playerid, -1"Vocк ganhou 1000 reais!"); 
        }
        if(!
response// ou else = Se apertou no Botгo 2 (Perder Grana)
        
{
            
SendClientMessage(playerid, -1"Vocк perdeu 1000 reais!");
            
GivePlayerMoney(playerid1000);
        }
        return 
true
    }
    return 
false;

Estrutura do DIALOG_STYLE_INPUT e DIALOG_STYLE_PASSWORD

Input:


Password:


Exemplo:
PHP код:
ShowPlayerDialog(playerid4444DIALOG_STYLE_INPUT"Tнtulo do Servidor",
"Digite sua senha no campo Texto""Selecionar""Cancelar"); 
Nada muda aqui, sempre fica como padrгo. Apenas pulei uma linha ali para ficar mais fбcil de vocк enxergar.

O DIALOG_STYLEE_PASSWORD й igual ao DIALOG_STYLE_INPUT, sу que as caracteres ficam ocultas no PASSWORD.

PHP код:
ShowPlayerDialog(playerid4444DIALOG_STYLE_PASSWORD"Tнtulo do Servidor",
"Digite sua senha no campo Texto""Selecionar""Cancelar"); 
Na estrutura dos dois, utilizaremos meio diferente no DialogResponse:

PHP код:
// Adicione em algum comando, ou qualquer lugar para abrir nosso Dialog:
ShowPlayerDialog(playerid1DIALOG_STYLE_INPUT"Escreva seu primeiro texto!""Escreva seu nome!\n\nExemplo: Arlindo""Confirmar""Sair");
// Na public do seu GameMode:
public OnDialogResponse(playeriddialogidresponselistiteminputtext[])
{
    if(
dialogid == 1// o "CPF do dialog", Se eu botei 1 lб, devo botar 1 aqui !
    
{
        if(
response// Se apertou no Botгo Confirmar
        
{
            new 
Strjf[50];
            
format(Strjfsizeof(Strjf), "Muito Bem, Seu nome de acordo com o texto que vocк botou й: %s"inputtext
            SendClientMessage
(playerid, -1Strjf); 
        }
        
// Se ele apertar no botгo sair, o dialog sumirб pois nгo botei nenhuma aзгo para ele :)
        
return true
    }
    return 
false;


Estrutura do DIALOG_STYLE_LIST, DIALOG_STYLE_TABLIST e DIALOG_STYLE_TABLIST_HEADERS


DIALOG_STYLE_LIST


PHP код:
ShowPlayerDialog(playerid123DIALOG_STYLE_LIST"{33CCFF}Teleportes do Meu Servidor""{FFFF00}Ir DM\n{33AA33}IR Derby""Selecionar""Sair"); 
Como aprendemos, o \n serve para pular linhas. No dialog list, ela serve para adicionarmos as opзхes de nossas Listas.
PHP код:
"{FFFF00}IR DM\n{33AA33}IR Derby"
/*
Saнda:
Opзгo 1: IR DM
Opзгo 2: IR Derby 
Quanto mais /n, mais opзхes teremos no nosso dialog.
*/ 
DIALOG_STYLE_TABLIST (0.3.7)


Й quase igual aqo Dialog List. Como vocк sabe, o \t era como se fosse um TAB. Nessa versгo do SAMP, ela passou a ter mais utilidade nos dialogs. Ela dar um 'tab' correto, tendo seu limite atй o fim da tela. Vou pegar o exemplo da imagem para ficar mais fбcil:

PHP код:
ShowPlayerDialog(playerid4112DIALOG_STYLE_TABLIST"Buy Weapon",
"Deagle\t$5000\t100\n\
Sawnoff\t$5000\t100\n\
Pistol\t$1000\t50"
// Etc.
"Select""Cancel"); 
Explicando melhor como й:
PHP код:
"Deagle\t$5000\t100\n\Sawnoff\t$5000\t100\n\Pistol\t$1000\t50"
// para melhor ver:
"Deagle\t$5000\t100\n
\Sawnoff\t$5000\t100\n
\Pistol\t$1000\t50"
/*
"Aqui й a Coluna 1\tAqui й a Coluna 2\tAqui й a Coluna 3 e agora vou pular de linha(opзгo)\n
Aqui й a Coluna 1\tAqui й a Coluna 2\tAqui й a Coluna 3 e agora vou pular de linha(opзгo)\n
Aqui й a Coluna 1\tAqui й a Coluna 2\tAqui й a Coluna 3 e agora vou parar"
[...] */ 
Se nгo entendeu, sugiro que releia o tutorial.

DIALOG_STYLE_TABLIST_HEADERS (0.3.7)


Й igual o DIALOG_STYLE_TABLIST, sу que vem com tнtulo nas colunas. Vou pegar o exemplo da imagem para ficar mais fбcil.

PHP код:
ShowPlayerDialog(playerid4444DIALOG_STYLE_TABLIST_HEADERS"Buy Weapon",
"Weapon\tPrice\tAmmo\n\
Deagle\t$5000\t100\n\
Sawnoff\t$5000\t100\n\
Pistol\t$1000\t50"
// Etc.
"Select""Cancel"); 
Explicando melhor como й:
PHP код:
"Weapon\tPrice\tAmmo\n\Deagle\t$5000\t100\n\Sawnoff\t$5000\t100\n\Pistol\t$1000\t50"
// para melhor ver:
"Weapon\tPrice\tAmmo\n
\Deagle\t$5000\t100\n
\Sawnoff\t$5000\t100\n
\Pistol\t$1000\t50"
/*
"Titulo da Coluna 1\tTitulo da Coluna \tTitulo da Coluna 3 e agora vou para as opзхes\n
Aqui й a Coluna 1\tAqui й a Coluna 2\tAqui й a Coluna 3 e agora vou pular de linha(opзгo)\n
Aqui й a Coluna 1\tAqui й a Coluna 2\tAqui й a Coluna 3 e agora vou pular de linha(opзгo)\n
Aqui й a Coluna 1\tAqui й a Coluna 2\tAqui й a Coluna 3 e agora vou parar"
[...] 
Veja um outro exemplo:



Exemplo da Imagem:

PHP код:
ShowPlayerDialog(playerid9999DIALOG_STYLE_TABLIST_HEADERS"Buy Weapon""Coluna 1\tColune 2\tColuna3\tColuna 4\n\Deagle\t$5000\t100\tteste\n\Sawnoff\t$5000\t100\tteste\n\Pistol\t$1000\t50\tteste""Selecionar""Cancel");
// Ou para melhor visualizar:
ShowPlayerDialog(playerid9999DIALOG_STYLE_TABLIST_HEADERS"Buy Weapon",
"Coluna 1\tColune 2\tColuna 3\tColuna 4\n\
Deagle\t$5000\t100\tteste\n\
Sawnoff\t$5000\t100\tteste\n\
Pistol\t$1000\t50\tteste"
// Etc.
"Selecionar""Cancel"); 
Se nгo entendeu, sugiro que releia o tutorial.


Entгo, A RESPOSTA DO DIALOG_STYLE_LIST, DIALOG_STYLE_TABLIST e DIALOG_STYLE_TABLIST_HEADERS й IGUAL na public OnDialogResponse, pois todos sгo uma lista de opзхes, a unica diferenзa entre eles й que trazem mais informaзхes em colunas e subtнtulos. Veja como eles funcionam:

PHP код:
ShowPlayerDialog(playerid234DIALOG_STYLE_LIST"Menu de Compras de armas""Eagle\nAK-47\nCombat Shotgun""Selecionar""Sair");
 
public 
OnDialogResponse(playeriddialogidresponselistiteminputtext[])
{
    if(
dialogid == 234// 'CPF' do Meu Dialog criado
    
{
        if(
response// Se clicou no botгo 'Selecionar'
        
{
            if(
listitem == 0// Caso selecione o primeiro item - Eagle ( Comeзamos sempre do 0 )
            
{
                
GivePlayerWeapon(playeridWEAPON_DEAGLE1000);
                
SendClientMessage(playerid, -1"Vocк ganhou uma eagle com 1000 balas");
            }
            if(
listitem == 1// Caso selecione o segundo item - AK-47
            
{
                
GivePlayerWeapon(playeridWEAPON_AK47120);
                
SendClientMessage(playerid, -1"Vocк ganhou uma ak-47com 120balas");
            }
            if(
listitem == 2// Caso selecione o terceiro item - Combat Shotgun
            
{
                
GivePlayerWeapon(playeridWEAPON_SHOTGSPA28);
                
SendClientMessage(playerid, -1"Vocк ganhou uma shotgun com 28 balas");
            }
        }
        return 
true
    }
 
    return 
false;

Como adicionar apenas um botгo nos dialogs

PHP код:
ShowPlayerDialog(playerid123DIALOG_STYLE_LIST"Meu Botгo""Tutorial Meu Botгo !!""Selecionar""Cancelar"); 
Vamos destacar apenas nossos botхes no dialog acima:

PHP код:
"Selecionar""Cancelar"
Quote:
Botгo 1= Selecionar
Botгo 2 = Cancelar

Para ficar com um botгo apenas, vocк deve deixar apenas:

PHP код:
"Selecionar"""
Ou seja, o segundo botгo ficarб vazio

strcat,strlen ou format para concatenar dialogs?


Sem dъvidas format. Bem mais otimizado e rбpido.
Tire dъvidas de velocidades de loop's, o que mais influencia em LAG no servidor junto com timers.


Em Breve aqui:
Como Organizar meus IDS para nгo dar conflito.
Dialogs sobre Dialogs
Sistema Simples de GPS

Crйditos: Eu e editores da Wiki-SAMP.

Dъvidas, sugestхes, erros, avisar-me pois tambйm sou humano.
Reply


Messages In This Thread

Forum Jump:


Users browsing this thread: 2 Guest(s)