Jump to content

PRECISO DE AJUDA COM UM SCRIPT!!!


Recommended Posts

Bom  pessoal Preciso De Ajuda Com Um Script

Bom Eu Ainda Sou Iniciante e pretendo tirar Minhas

Duvidas!!!

Bom Eu Queria Saber Como Faço isso:

--Fazer Com Que Um Botao Ao Ser apertado Abrir Uma nova janela em "Gui" ou em "DX"

quem poder me ajudar ficarei grato

tmjj

Link to comment
  • Other Languages Moderators

Favor não usar formatação de fonte em tamanhos muito grandes, ninguém aqui é cego e isso pode ser considerado como Spam.

Voltando a sua dúvida, sugiro que leia a Wiki na parte de GuiCreateWindow, já que vc precisa primeiramente criar uma janela GUI, com os botões e textos nela, depois vc configura uma tecla para fazer essa janela aparecer na tela.

Fiz este exemplo para mostrar algumas funções principais, como o guiCreateWindowguiCreateLabelguiCreateButtonguiSetVisible, showCursoronClientGUIClick

function criarPainel ()
	
	----------------- CRIA A JANELA ------------------------------------------------------------------
	janelaPrincipal = guiCreateWindow (0.4, 0.4, 0.2, 0.2, "Janela Qualquer", true) -- Cria a janela.
	mensagem = guiCreateLabel (0.05, 0.2, 1, 0.2, "Texto de informação qualquer aqui.\nOutra linha de informação aqui.", true, janelaPrincipal) -- Cria o texto na janela.
	botaoFechar = guiCreateButton (0.4, 0.7, 0.2, 0.2, "FECHAR", true, janelaPrincipal) -- Cria o botão na janela.
	guiSetVisible (janelaPrincipal, false) -- Oculta a janela depois dela ser criada, para que ela não apareça ao iniciar o resource.
	
	------------- MOSTRA A JANELA (pela tecla K) -----------------------------------------------------
	function mostraPainel (key, keystate)
		guiSetVisible (janelaPrincipal, true) -- Torna o painel visivel.
		showCursor (true) -- Mostra o ponteiro do mouse na tela.
	end
	bindKey ("k", "down", mostraPainel) -- Executa a função mostraPainel ao apertar a tecla K.
	
	----------- OCULTA A JANELA (clicando no botão da janela) ----------------------------------------
	function ocultaPainel (button, state)
		if button == "left" then -- Se o botão do mouse que clicou for o botão esquerdo, então:
			guiSetVisible (janelaPrincipal, false) -- Torna o painel invisivel.
			showCursor (false) -- Oculta o ponteiro do mouse.
		end
	end
	addEventHandler ("onClientGUIClick", botaoFechar, ocultaPainel, false) -- Executa a função ocultaPainel ao clicar no botaoFechar.
	
end
addEventHandler ("onClientResourceStart", getRootElement(), criarPainel) -- Faz isso tudo ao iniciar o resource no jogador.

Sugiro que leia cada link mencionado acima para saber como funciona cada um. Deixei comentários pelo código para ficar mais fácil de entender.

  • Like 1
Link to comment
  • Other Languages Moderators

Ah bom.
Só criar o botão que vai ficar aparecendo sempre na tela e não ocultar ele ao iniciar o resource.

Faça assim:

function criarPainel ()
	local screenX, screenY = guiGetScreenSize () -- Recebe a resolução atual do jogador. (no meu caso: screenX = 1366 e screenY = 768)
	
	----------------- CRIA A JANELA ------------------------------------------------------------------
	janelaPrincipal = guiCreateWindow (0.4, 0.4, 0.2, 0.2, "Janela Qualquer", true) -- Cria a janela.
	mensagem = guiCreateLabel (0.05, 0.2, 1, 0.2, "Texto de informação qualquer aqui.\nOutra linha de informação aqui.", true, janelaPrincipal) -- Cria o texto na janela.
	guiSetVisible (janelaPrincipal, false) -- Oculta a janela depois dela ser criada, para que ela não apareça ao iniciar o resource.
	
	botaoGeral = guiCreateButton (0, screenY/2, 30, 30, ">>", false) -- Cria o botão na tela.
	
	----------- MOSTRA/OCULTA A JANELA (clicando no botão da tela) ----------------------------------------
	function mostraPainel (button, state)
		if button == "left" then
			if not isVisible then
				guiSetVisible (janelaPrincipal, true) -- Torna o painel visivel.
				showCursor (true) -- Mostra o cursor na tela.
			else
				guiSetVisible (janelaPrincipal, false) -- Torna o painel invisivel.
				showCursor (false) -- Oculta o cursor da tela.
			end
			isVisible = not isVisible -- Alterna entre visivel/invisivel a cada vez que clicar no botão.
		end
	end
	addEventHandler ("onClientGUIClick", botaoGeral, mostraPainel, false) -- Executa a função mostraPainel ao clicar no botao >>
	
end
addEventHandler ("onClientResourceStart", getRootElement(), criarPainel) -- Faz isso tudo ao iniciar o resource no jogador.

Obs: Para conseguir clicar no botão da tela, vc pode usar a tecla T ou o F8 (pra mostrar o cursor).

Edited by Lord Henry
  • Like 1
Link to comment
  • Other Languages Moderators
4 minutes ago, C4mpN~ said:

Amigo Aproveitando Esse Topico, saberia como transformar um dx draw rectangle em um botao? muito obrigado

Cara, a inteface DX não é recomendável para criar botões, a principal função dela é mostrar informações em tempo real (que devem ser atualizadas o tempo todo), para interfaces onde o usuário vai interagir (clicar, digitar, etc) é utilizada a interface nativa GUI.

Mas respondendo a sua pergunta, quando vc clica na tela, é possível obter a coordenada X, Y da tela onde foi clicado. Sabendo disso, é possível determinar qual "botão" deve ser ativado. Para isso, usa-se OnClientGUIClick (que apesar de ser usado mais em GUI, funciona para DX também)

Edited by Lord Henry
Link to comment
  • Moderators

Sobre o botão em DX que você comentou, te recomendo ler estes 2 tópicos e tentar entender as explicações e o código:

https://forum.multitheftauto.com/topic/79017-resolvidoajuda-com-dx/ - Tem uma explicação bem simples de entender sobre botão-DX

https://forum.multitheftauto.com/topic/92734-abrir-outro-painel-com-o-botão-dx/ - Um código mais aprofundado que você usa a tecla F2 pra abrir um DX e se um certo local desse DX for clicado, vai abrir outro DX

  • Like 1
Link to comment
  • Other Languages Moderators

Dai depende do seu objetivo.
Você quer fazer um painel mais bonito ou mais leve? (leve me refiro a código mais simples e fácil)

Se vc quer fazer um painel bonito, sem se importar com performance nem manutenção, dai não há problema em fazer painel DX para interação. A vantagem do painel DX, é que ele é criado a cada Frame (diferente do GUI, que vc cria 1 vez e ele fica na tela), isso significa que é muito mais fácil colocar efeitos de movimento e animações em painéis DX e realmente, existem painéis DX com efeitos muito bonitos e não tão pesados, que passam realmente a impressão de um sistema mais profissional. Por se tratar tudo de funções client-side, não há qualquer problema de performance para outros jogadores do servidor que não estão com o painel aberto. Mas como eu falei anteriormente, os painéis DX são muito mais complexos de se fazer manutenção, uma vez que todos os seus elementos são totalmente configuráveis, nada é automático. (a GUI, já vem com o layout pronto) Se vc quer mudar a posição de um "botão" DX, você deve reconfigurar sua "área clicável", pois o elemento DX não é um botão (o botão GUI é um elemento clicável por padrão, então basta mover o botão e sua área clicável vai se mover junto).

Vou refazer todo o exemplo anterior de GUI para DX. Note que os elementos DX não são relativos, isso significa que eles só aceitam tamanhos e posições em pixels. (os elementos GUI aceitam tanto posições relativas quanto posições por pixel, dá pra fazer gambiarra pra usar posição relativa em DX, mas isso é complexo demais e não quero lhe confundir ainda mais)

function criarPainel ()
	local screenX, screenY = guiGetScreenSize () -- Recebe a resolução atual do jogador. (no meu caso: screenX = 1366 e screenY = 768)
	
	----------------- EXECUTA A JANELA NA TELA ------------------------------------------------------------------
	local fonteInterativa = "default"
	local alphaInterativo = 150
	
	function renderDx ()
		dxDrawRectangle (screenX/2-140, screenY/2-80, 280, 160, tocolor (0, 0, 0, 150)) -- Cria o retângulo maior, que será a janela principal. To color (Red, Green, Blue, Alpha) determina sua cor e transparência.
		dxDrawRectangle (screenX/2-135, screenY/2-75, 270, 20, tocolor (0, 0, 0, 150)) -- Cria o retângulo do título da janela principal.
		dxDrawText ("Janela Qualquer", screenX/2-135, screenY/2-75, screenX/2+135, screenY/2-55, tocolor (255, 255, 255, 255), 1, "default-bold", "center", "center") -- Cria o título da janela principal
		dxDrawText ("Texto de informação qualquer aqui.\nOutra linha de informação aqui.", screenX/2-130, screenY/2-40, screenX/2+130, screenY/2, tocolor (255, 255, 255, 255), 1)
	end
	
	function renderButton ()
		dxDrawRectangle (0, screenY/2, 30, 30, tocolor (0, 0, 0, alphaInterativo))
		dxDrawText (">>", 0, screenY/2, 30, screenY/2+30, tocolor (255, 255, 255, 255), 1, fonteInterativa, "center", "center")
	end
	addEventHandler ("onClientRender", getRootElement(), renderButton) -- Começa a renderizar esse botão assim q inicia o resource. Chamando essa função a cada frame.
	
	----------- MOSTRA/OCULTA A JANELA (clicando no botão da tela) ----------------------------------------
	function mostraPainel (button, state, posX, posY, worldX, worldY, worldZ)
		if button == "left" and state == "up" then
			if (posX >= 0) and (posX <= 30) and (posY >= screenY/2) and (posY <= screenY/2+30) then -- Se a posição clicada na tela estiver dentro do retângulo >> então:
				if not isVisible then
					addEventHandler ("onClientRender", getRootElement(), renderDx) -- Começa a renderizar o painel DX na tela. Chamando a função renderDx a cada frame.
				else
					removeEventHandler ("onClientRender", getRootElement(), renderDx) -- Para de renderizar o painel DX na tela.
					theCursor () -- Executa a função de mostrar/ocultar o cursor.
				end
				isVisible = not isVisible -- Alterna entre visivel/invisivel a cada vez que clicar no botão.
			end
		end
	end
	addEventHandler ("onClientClick", getRootElement(), mostraPainel) -- Executa a função mostraPainel ao clicar em qualquer lugar da tela.
	
	--------------- ALTERNA A FONTE DO BOTÃO (passando o cursor em cima do botão)-------------------------------
	function mouseOnButton (x, y, pixelX, pixelY, worldX, worldY, worldZ)
		if (pixelX >= 0) and (pixelX <= 30) and (pixelY >= screenY/2) and (pixelY <= screenY/2+30) then -- Se o cursor estiver em cima do botão >> então:
			fonteInterativa = "default-bold"
			alphaInterativo = 255
		else -- Faz o texto do botão >> ficar em negrito e seu retângulo opaco, enquanto o cursor estiver em cima dele e volta ao normal se não estiver.
			fonteInterativa = "default"
			alphaInterativo = 150
		end
	end
	addEventHandler ("onClientCursorMove", getRootElement(), mouseOnButton) -- Executa a função mouseOnButton toda vez que o cursor se movimenta.
	
	-------------- EVITAR BUG -----------------------------------------------------------------------------
	function theCursor () -- Por algum motivo, o cursor mostrado pelo T, ou Y ou F8 não funciona na função onClientClick. Então mostra/oculta o cursor pressionando Z.
		if not cursorVisible then
			showCursor (true)
		else
			showCursor (false)
		end
		cursorVisible = not cursorVisible
	end
	bindKey ("z", "down", theCursor)
end
addEventHandler ("onClientResourceStart", getRootElement(), criarPainel) -- Faz isso tudo ao iniciar o resource no jogador.

 

Edited by Lord Henry
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...