PT-BR/Introducão ao GUI scripting: Difference between revisions

From Multi Theft Auto: Wiki
Jump to navigation Jump to search
No edit summary
mNo edit summary
Line 1: Line 1:
<!-- place holder -->
{{Aviso|Este artigo necessita de revisão, pois está '''incompleto'''.|1}}
Um importante recurso no MTA:SA é a capacidade de script GUI (Graphic User Interface/Interface Gráfica do Usuário) personalizado. A GUI consiste de janelas, botões, caixas de edição, caixas de verificação... Quase todos os componentes padrão do formulário em ambientes gráficos. Eles podem ser exibidos enquanto o usuário está em jogo (in game), e usado para entradas (inputs) e saídas (outputs) no lugar dos comandos tradicionais.
 
Um importante recurso do MTA:SA é capacidade de criar uma GUI (Graphical User Interface) personalizada. Uma GUI consiste em janelas, botões, caixas de edição, caixas de verificação e etc. Em outras palavras, todos os componentes presentes em janelas do Windows, por exemplo. Eles podem ser exibidos enquanto o usuário está no jogo, em vez de eles precisarem usar comandos tradicionais.
 
''Obs: É de extrema importância dar uma olhada na [[PT-BR/Introducao_ao_Scripting|Introdução ao Scripting]] porque muitas perguntas que poderão surgir neste tutorial provavelmente estão relacionados a falta de conceitos básicos de scripting.''


[[Image:AdminGUI.png|thumb|Admin Console GUI]]
[[Image:AdminGUI.png|thumb|Admin Console GUI]]


==Um tutorial para fazer uma janela de login==
==Tutorial: Janela de Login==
Neste tutorial, vamos fazer uma janela de login simples, com duas caixas de entrada (input boxes) e um botão. A janela aparece quando o jogador entra no jogo, e quando o botão é clicado, o jogador é gerado no jogo. O tutorial vai continuar o modo de jogo que fizemos no [[PT-BR/Introducao_ao_Scripting|Introdução ao Scripting]] ''(Se você já usou o [[PT-BR/Introducao_ao_Scripting|Introdução ao Scripting]], você precisará remover ou comentar a linha [[spawnPlayer]] da função "joinHandler" em seu código, como iremos substituí-lo por uma GUI alternativa neste tutorial)''. Nós também vamos dar uma olhada no scripting do lado client (client-side).
Neste tutorial, vamos fazer uma janela de login bem simples, com duas caixas de entrada (input boxes) e um botão (button). A janela aparecerá quando o jogador entrar no jogo, e quando o botão de login for clicado, o jogador nasce no mapa. Usarenos o modo de jogo que foi criado no artigo [[PT-BR/Introducao_ao_Scripting|Introdução ao Scripting]]. Se você procedeu com o mesmo e tem o script em mãos, precisará remover ou comentar a linha [[spawnPlayer]] da função ''joinHandler'', pois iremos criar uma jenela para realizar tal ação.


===Criando a janela===
===Criando a janela===
Toda a GUI deve ser feita do lado client. Também é uma boa prática manter todos os scripts do lado client em uma pasta separada.  
Todo o scripting GUI deverá ser feito no lado do cliente. Também é recomendado colocar esses arquivos em uma pasta separada, em prol de manter uma melhor organização.


Vá até o diretório /SeuServerMTA/mods/deathmatch/resources/, e crie uma pasta chamada "client". Sob o diretório /client/, crie um arquivo de texto com o nome "gui.lua".
Vá até o diretório ../server/mods/deathmatch/resources/, e crie uma pasta chamada "client". Sob o diretório /client/, crie um arquivo de texto com o nome "gui.lua".


Neste arquivo vamos escrever uma função que cria a janela. Para criar uma janela, iremos utilizar [[guiCreateWindow]]:
Neste arquivo vamos escrever uma função que cria a janela. Para fazer isto, iremos utilizar [[guiCreateWindow]]:
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
function criarJanelaDeLogin()
function criarJanelaDeLogin()
-- definir a posição X e Y da janela
-- definir a posição X e Y
local X = 0.375
local x = 0.375
local Y = 0.375
local y = 0.375
-- definir a largura e altura da janela
-- definir a largura e altura
local Largura = 0.25
local largura = 0.25
local Altura = 0.25
local altura = 0.25
-- criar a janela e salvar o valor de seu elemento na variável 'wdwLogin'
-- criar a janela e defini-la na variável 'janelaLogin'
-- clique no nome da função para ler a sua documentação
-- clique no nome da função para ler a sua documentação
wdwLogin = guiCreateWindow(X, Y, Largura, Altura, "Por favor efetue o Login", true)
janelaLogin = guiCreateWindow(x, y, largura, altura, "Efetue o Login", true)
end
end
</syntaxhighlight>
</syntaxhighlight>


===Relativo e Absoluto===
===Relativo e Absoluto===
Nota-se que o último argumento colocado em guiCreateWindow no exemplo acima é ''true''. Isto indica que as coordenadas e dimensões da janela são '''relativa''', o que significa que é uma ''porcentagem'' do tamanho total da tela. Isto significa que se o lado esquerdo da tela é 0, e a extrema-direita é 1, uma posição X de 0.5 representaria o ponto central da tela. Similarmente, se a parte superior da tela é 0 e no fundo é 1, uma posição Y de 0.2 seria 20% do caminho para baixo da tela. Os mesmos princípios se aplicam para largura e altura, bem como (com um valor de largura de 0.5 significa que a janela será a metade da largura da tela).
Nota-se que o último argumento colocado em guiCreateWindow é ''true''. Isto indica que as coordenadas e dimensões da janela são '''relativas''', o que significa que é uma ''porcentagem'' do tamanho total da tela. Em outras palavras, se o lado esquerdo da tela é 0, e a extrema-direita é 1. Desta maneira, a posição X valendo 0.5 representaria o ponto central da tela. De forma análoga, se a parte superior da tela é 0 e a inferior é 1, uma posição Y de 0.2 seria 20% do caminho para baixo da tela. Os mesmos princípios se aplicam para largura e altura, exemplo: Se a largura for 0.5, a janela será a metade da largura da tela.
 
Caso não queira utilizar valores relativos, poderá optar por '''absolutos''' ao colocar ''false'' no argumento. Os valores absolutos são calculados como o número total de pixels do canto superior esquerdo do elemento o qual o componente GUI está subordinado. Se nenhum elemento pai for especificado, este será a própria tela. Neste caso, se tivermos uma resolução de tela de 1920x1200, o lado esquerdo será 0 pixel e o de extrema-direita, será 1920 pixels. Uma posição X de 960 representará o ponto central da tela. Similarmente, se a parte superior da tela é de 0 pixel e o fundo é de 1200, uma posição Y de 20 seria de 20 pixels para baixo a partir da parte superior da tela. Os mesmos princípios se aplicam a largura e altura, exemplo: Caso a largura seja 50, a janela terá os exatos 50 pixels de largura. ''Com um pouco de matemática, e usando a função [[guiGetScreenSize]], você poderá calcular as posições absolutas corretamente.''


A outra alternativa de utilizar valores relativos é utilizar '''absolutos''' (colocando ''false'' ao invés de true em guiCreateWindow). Os valores absolutos são calculados como o número total de pixels do canto superior esquerdo de seu elemento pai (se nenhum elemento pai gui for especificado, o pai será a própria tela). Se tivermos uma resolução de tela de 1920x1200, o lado esquerdo da tela sendo 0 pixel e os extrema-direita, sendo 1920 pixels, uma posição X de 960 representará o ponto central da tela. Similarmente, se a parte superior da tela é de 0 pixel e o fundo é de 1200, uma posição Y de 20 seria de 20 pixels para baixo a partir da parte superior da tela. Os mesmos princípios se aplicam a largura e altura, bem como (com um valor de largura de 50 ou seja, a janela será de 50 pixels de largura). ''Você pode usar [[guiGetScreenSize]] e um pouco de matemática para calcular certas posições absolutas.''
As diferenças entre o uso de valores relativos e absolutos é muito simples. Se uma for GUI criada usando valores absolutos, cada unidade valerá um pixel. Enquanto os valores relativos usarão a porcentagem para definir essas posições.


As diferenças entre o uso de valores relativos e absolutos é muito simples; gui criada usando valores absolutos será sempre exatamente o mesmo tamanho de pixel e posição, enquanto gui criado usando valores relativos será sempre uma porcentagem do tamanho do seu parent.
Absoluto é geralmente mais fácil de usar quando a edição do código for feita a mão. Entretanto, a escolha do tipo de medida dependerá da finalidade do componente GUI.


Absoluto é geralmente mais fácil de usar quando a edição do código é á mão, no entanto a escolha do tipo depende da situação que você está usando para isso.
Uma das principais razões de se utilizar valores relativos é para evitar que as janelas fiquem fora da tela ou em posições nada desejáveis. Um GUI que foi feito, por exemplo, na resolução de 1080p e for posicionada no canto superior direito com valores absolutos, ficará fora da tela caso esse script fosse executado em 720p. Oras, porque posicionarei uma janela nas coordenadas (1080, 0) se a tela do sujeito só vai até 720 pixels no eixo x? Simplesmente não vai funcionar.


Para esta presente introdução iremos utilizar valores relativos.
Neste tutorial, obviamente usaremos valores relativos para a tela de login, e seus componentes, ficarem exatamente onde é preciso.


===Adicionando os componentes===
===Adicionando os componentes===
Em seguida, vamos adicionar os rótulos de texto (labels) (dizendo "username:" e "senha:"), caixas de edição (edit boxes) (para inserir seus dados) e um botão para efetuar login.
Vamos adicionar:
* Textos (labels), para mostrar o que é cada campo - usuário, senha  
* Caixas de edição (edit boxes), para que o usuário possa inserir seus dados
* Um botão para efetuar o login


Para criar botões você deve usar [[guiCreateButton]] e para criar caixas de edição você deve usar [[guiCreateEdit]]:
Para criar botões você deve usar [[guiCreateButton]], e para criar caixas de edição você deve usar [[guiCreateEdit]]:


'''Note que agora iremos escrever mais código para a nossa função atual 'criarJanelaDeLogin'. Esta não é uma nova função e se destina a substituir o que você já tem.'''
'''Note que agora iremos adicionar mais instruções para a função ''criarJanelaDeLogin''. Portanto, esta não é uma nova função, e sim uma substituta da qual você já tem.'''
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
function criarJanelaDeLogin()
function criarJanelaDeLogin()
local X = 0.375
local x = 0.375
local Y = 0.375
local y = 0.375
local Largura = 0.25
local largura = 0.25
local Altura = 0.25
local altura = 0.25
wdwLogin = guiCreateWindow(X, Y, Largura, Altura, "Por favor efetue o Login", true)
wdwLogin = guiCreateWindow(x, y, largura, altura, "Efetue o Login", true)
-- definir as novas posições X e Y para o primeiro label
-- Definir as novas posições x e y para o primeiro label
X = 0.0391
x = 0.0391
Y = 0.1979
y = 0.1979
-- definir o novo valor de largura e altura para o primeiro label
-- Definir o novo valor de largura e altura para o primeiro label
Largura = 0.3672
largura = 0.3672
Altura = 0.25
altura = 0.25
-- criar o primeiro label, note que o último argumento passado é 'wdwLogin', que significa a janela
-- Criar o primeiro label. Note que o último argumento passado é 'wdwLogin', representando a janela
-- o que criámos acima é o parent deste rótulo de texto (label)
-- Ou seja, ele será o elemento pai (parent) deste texto (label)
-- (assim toda a posição e os valores de tamanho são agora relativo para a posição dessa janela)
-- Assim toda os valores de tamanho serão relativos a esta janela
guiCreateLabel(X, Y, Largura, Altura, "Nome de Usuario", true, wdwLogin)
guiCreateLabel(x, y, largura, altura, "Usuário:", true, wdwLogin)
-- altere o valor de Y, assim o segundo label esteja ligeiramente abaixo do primeiro
 
Largura = 0.25
-- Alterar o valor de y, assim o segundo label ficará ligeiramente abaixo do primeiro
largura = 0.25
y = 0.5
guiCreateLabel(x, y, largura, altura, "Senha:", true, wdwLogin)
 
-- Valores para as entradas
x = 0.415
y = 0.2
largura = 0.5
altura = 0.15
editUsuario = guiCreateEdit(x, y, largura, altura, "", true, wdwLogin)
Y = 0.5
Y = 0.5
guiCreateLabel(X, Y, Largura, Altura, "Senha", true, wdwLogin)
edtSenha = guiCreateEdit(x, y, largura, altura, "", true, wdwLogin)


X = 0.415
-- Definir o tamanho máximo de caracteres do nome de usuário e a senha para 50
Y = 0.2
Largura = 0.5
Altura = 0.15
editUsuario = guiCreateEdit(X, Y, Largura, Altura, "", true, wdwLogin)
Y = 0.5
edtSenha = guiCreateEdit(X, Y, Largura, Altura, "", true, wdwLogin)
-- definir o tamanho máximo de caracteres do nome de usuário e Senha para 50
guiEditSetMaxLength(editUsuario, 50)
guiEditSetMaxLength(editUsuario, 50)
guiEditSetMaxLength(edtSenha, 50)
guiEditSetMaxLength(edtSenha, 50)
X = 0.415
x = 0.415
Y = 0.7
y = 0.7
Largura = 0.25
largura = 0.25
Altura = 0.2
altura = 0.2
btnLogin = guiCreateButton(X, Y, Largura, Altura, "Login", true, wdwLogin)
btnLogin = guiCreateButton(x, y, largura, altura, "Login", true, wdwLogin)
-- tornar a janela invisível
-- Tornar a janela invisível
guiSetVisible(wdwLogin, false)
guiSetVisible(wdwLogin, false)
end
end
</syntaxhighlight>
</syntaxhighlight>
Note que cada componente GUI criado é um filho da janela, isto é feito através da especificação do elemento pai (wdwLogin, neste caso) ao criar o componente.
Em nosso script, quando usamos a função para criar cada componente da janela, definimos a variável ''wdwLogin'' no último argumento. Isso significa que esses componentes estão contidos na janela. Em inglês dizemos que ele é um ''child element'' e a janela é um ''parent element''..


Isto é muito útil porque não só significa que todos os componentes estão anexados à janela e irá mover-se com ela, mas também que todas as alterações feitas para a janela pai será aplicada para todos os elementos filho. Por exemplo, agora podemos ocultar toda a GUI que acabamos de criar, basta ocultar a janela:
Isto é muito útil porque não só significa que todos os componentes estão anexados à janela e irão mover-se com ela. Além disso, todas as alterações realizadas na janela serão aplicadas a todos os elementos subordinados, ou elementos filhos. Para ocultamos a janela, simplesmente usaremos a função:
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
guiSetVisible(wdwLogin, false) -- oculta toda a GUI que fizemos para que possamos mostrá-los para o jogador, quando for preciso.
guiSetVisible(wdwLogin, false) -- Isso fará com que todos os elementos subordinado fiquem invisíveis também. O conjunto só será mostrado quando for preciso.
</syntaxhighlight>
</syntaxhighlight>
 
<!--
===Usando a função criada anteriormente===
===Usando a função criada anteriormente===
A função criarJanelaDeLogin agora está completa, mas nada vai acontecer até que nós a chamamos. È Recomendado criar toda a GUI quando o recurso client for iniciado, então será ocultada, e mostrará para o jogador quando necessário. Portanto, vamos escrever um manipulador de eventos para "[[onClientResourceStart]]" para criar a janela:
A função criarJanelaDeLogin agora está completa, mas nada vai acontecer até que nós a chamamos. È Recomendado criar toda a GUI quando o recurso client for iniciado, então será ocultada, e mostrará para o jogador quando necessário. Portanto, vamos escrever um manipulador de eventos para "[[onClientResourceStart]]" para criar a janela:
Line 267: Line 278:


Para mais ajuda com GUI, consulte [[:Category:GUI_Tutorials|Tutoriais GUI]].
Para mais ajuda com GUI, consulte [[:Category:GUI_Tutorials|Tutoriais GUI]].
 
-->
[[Category:GUI_Tutorials]]
[[Category:GUI_Tutorials]]



Revision as of 17:16, 11 August 2014

Dialog-warning.png Aviso: Este artigo necessita de revisão, pois está incompleto.

Um importante recurso do MTA:SA é capacidade de criar uma GUI (Graphical User Interface) personalizada. Uma GUI consiste em janelas, botões, caixas de edição, caixas de verificação e etc. Em outras palavras, todos os componentes presentes em janelas do Windows, por exemplo. Eles podem ser exibidos enquanto o usuário está no jogo, em vez de eles precisarem usar comandos tradicionais.

Obs: É de extrema importância dar uma olhada na Introdução ao Scripting porque muitas perguntas que poderão surgir neste tutorial provavelmente estão relacionados a falta de conceitos básicos de scripting.

Admin Console GUI

Tutorial: Janela de Login

Neste tutorial, vamos fazer uma janela de login bem simples, com duas caixas de entrada (input boxes) e um botão (button). A janela aparecerá quando o jogador entrar no jogo, e quando o botão de login for clicado, o jogador nasce no mapa. Usarenos o modo de jogo que foi criado no artigo Introdução ao Scripting. Se você procedeu com o mesmo e tem o script em mãos, precisará remover ou comentar a linha spawnPlayer da função joinHandler, pois iremos criar uma jenela para realizar tal ação.

Criando a janela

Todo o scripting GUI deverá ser feito no lado do cliente. Também é recomendado colocar esses arquivos em uma pasta separada, em prol de manter uma melhor organização.

Vá até o diretório ../server/mods/deathmatch/resources/, e crie uma pasta chamada "client". Sob o diretório /client/, crie um arquivo de texto com o nome "gui.lua".

Neste arquivo vamos escrever uma função que cria a janela. Para fazer isto, iremos utilizar guiCreateWindow:

function criarJanelaDeLogin()
	-- definir a posição X e Y
	local x = 0.375
	local y = 0.375
	-- definir a largura e altura
	local largura = 0.25
	local altura = 0.25
	-- criar a janela e defini-la na variável 'janelaLogin'
	-- clique no nome da função para ler a sua documentação
	janelaLogin = guiCreateWindow(x, y, largura, altura, "Efetue o Login", true)
end

Relativo e Absoluto

Nota-se que o último argumento colocado em guiCreateWindow é true. Isto indica que as coordenadas e dimensões da janela são relativas, o que significa que é uma porcentagem do tamanho total da tela. Em outras palavras, se o lado esquerdo da tela é 0, e a extrema-direita é 1. Desta maneira, a posição X valendo 0.5 representaria o ponto central da tela. De forma análoga, se a parte superior da tela é 0 e a inferior é 1, uma posição Y de 0.2 seria 20% do caminho para baixo da tela. Os mesmos princípios se aplicam para largura e altura, exemplo: Se a largura for 0.5, a janela será a metade da largura da tela.

Caso não queira utilizar valores relativos, poderá optar por absolutos ao colocar false no argumento. Os valores absolutos são calculados como o número total de pixels do canto superior esquerdo do elemento o qual o componente GUI está subordinado. Se nenhum elemento pai for especificado, este será a própria tela. Neste caso, se tivermos uma resolução de tela de 1920x1200, o lado esquerdo será 0 pixel e o de extrema-direita, será 1920 pixels. Uma posição X de 960 representará o ponto central da tela. Similarmente, se a parte superior da tela é de 0 pixel e o fundo é de 1200, uma posição Y de 20 seria de 20 pixels para baixo a partir da parte superior da tela. Os mesmos princípios se aplicam a largura e altura, exemplo: Caso a largura seja 50, a janela terá os exatos 50 pixels de largura. Com um pouco de matemática, e usando a função guiGetScreenSize, você poderá calcular as posições absolutas corretamente.

As diferenças entre o uso de valores relativos e absolutos é muito simples. Se uma for GUI criada usando valores absolutos, cada unidade valerá um pixel. Enquanto os valores relativos usarão a porcentagem para definir essas posições.

Absoluto é geralmente mais fácil de usar quando a edição do código for feita a mão. Entretanto, a escolha do tipo de medida dependerá da finalidade do componente GUI.

Uma das principais razões de se utilizar valores relativos é para evitar que as janelas fiquem fora da tela ou em posições nada desejáveis. Um GUI que foi feito, por exemplo, na resolução de 1080p e for posicionada no canto superior direito com valores absolutos, ficará fora da tela caso esse script fosse executado em 720p. Oras, porque posicionarei uma janela nas coordenadas (1080, 0) se a tela do sujeito só vai até 720 pixels no eixo x? Simplesmente não vai funcionar.

Neste tutorial, obviamente usaremos valores relativos para a tela de login, e seus componentes, ficarem exatamente onde é preciso.

Adicionando os componentes

Vamos adicionar:

  • Textos (labels), para mostrar o que é cada campo - usuário, senha
  • Caixas de edição (edit boxes), para que o usuário possa inserir seus dados
  • Um botão para efetuar o login

Para criar botões você deve usar guiCreateButton, e para criar caixas de edição você deve usar guiCreateEdit:

Note que agora iremos adicionar mais instruções para a função criarJanelaDeLogin. Portanto, esta não é uma nova função, e sim uma substituta da qual você já tem.

function criarJanelaDeLogin()
	local x = 0.375
	local y = 0.375
	local largura = 0.25
	local altura = 0.25
	wdwLogin = guiCreateWindow(x, y, largura, altura, "Efetue o Login", true)
	
	-- Definir as novas posições x e y para o primeiro label
	x = 0.0391
	y = 0.1979
	-- Definir o novo valor de largura e altura para o primeiro label
	largura = 0.3672
	altura = 0.25
	-- Criar o primeiro label. Note que o último argumento passado é 'wdwLogin', representando a janela
	-- Ou seja, ele será o elemento pai (parent) deste texto (label)
	-- Assim toda os valores de tamanho serão relativos a esta janela
	guiCreateLabel(x, y, largura, altura, "Usuário:", true, wdwLogin)

	-- Alterar o valor de y, assim o segundo label ficará ligeiramente abaixo do primeiro
	largura = 0.25
	y = 0.5
	guiCreateLabel(x, y, largura, altura, "Senha:", true, wdwLogin)

	-- Valores para as entradas
	x = 0.415
	y = 0.2
	largura = 0.5
	altura = 0.15
	editUsuario = guiCreateEdit(x, y, largura, altura, "", true, wdwLogin)
	Y = 0.5
	edtSenha = guiCreateEdit(x, y, largura, altura, "", true, wdwLogin)

	-- Definir o tamanho máximo de caracteres do nome de usuário e a senha para 50
	guiEditSetMaxLength(editUsuario, 50)
	guiEditSetMaxLength(edtSenha, 50)
	
	x = 0.415
	y = 0.7
	largura = 0.25
	altura = 0.2
	btnLogin = guiCreateButton(x, y, largura, altura, "Login", true, wdwLogin)
	
	-- Tornar a janela invisível
	guiSetVisible(wdwLogin, false)
end

Em nosso script, quando usamos a função para criar cada componente da janela, definimos a variável wdwLogin no último argumento. Isso significa que esses componentes estão contidos na janela. Em inglês dizemos que ele é um child element e a janela é um parent element..

Isto é muito útil porque não só significa que todos os componentes estão anexados à janela e irão mover-se com ela. Além disso, todas as alterações realizadas na janela serão aplicadas a todos os elementos subordinados, ou elementos filhos. Para ocultamos a janela, simplesmente usaremos a função:

guiSetVisible(wdwLogin, false) -- Isso fará com que todos os elementos subordinado fiquem invisíveis também. O conjunto só será mostrado quando for preciso.