Jump to content

PRECISO DE AJUDA COM UM SCRIPT!!!


Recommended Posts

Posted

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

  • Other Languages Moderators
Posted

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
  • Other Languages Moderators
Posted (edited)

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
  • Other Languages Moderators
Posted (edited)
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
Posted

BOM VAI SER UMA GRANDE LUTA CONSEGUIR FAZER ISSO PQ EU AINDA SOU BEM INICIANTE NO LUA MAIS MUITO OBRIGADO MANNO, PQ VI VARIOS PAINEIS EM DX NA INTERNET

E TENHO VONTADE DE APRENDER, MSM ASSIM MUITO OBRIGADO!!!

Posted

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
  • Other Languages Moderators
Posted (edited)

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

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...