Sobre funções Topic is solved

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

User avatar
Hologram
Posts: 126
Joined: 06 May 2020, 16:47

Sobre funções

11 Sep 2020, 14:49

Como mencionado no post anterior eu to procurando uma maneira de reduzir drasticamente as linhas em 1 dos meus scripts, nunca precisei de uma função em ahk, poderia corrigir pra mim por favor
a intenção é poder variar o nome 'corpse' dentro da imagesearch, e para nao deixar tantos return, eu poderia colocar 'and' ficando 'return get_Cath(1) and get_Cath(2) and get_Cath(3)... etc??

Code: Select all

get_Cath(corpse)
{
	ImageSearch, PosX10, PosY10, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, %A_ScriptDir%/search/corpse.png
	If (ErrorLevel = 0){
		MouseMove, 855, 629
		MouseClick, Right
		Sleep, 10
		MouseMove, %PosX10%, %PosY10%
		MouseClick, Left
}
return get_Cath(1)
return get_Cath(2)
return get_Cath(3)
return get_Cath(4)
return get_Cath(5)
return get_Cath(6)
return get_Cath(7)
return get_Cath(8)
return get_Cath(9)
return get_Cath(10)
PS: O return eu deixei pra fora do colchetes pq quero retornar a função em forma global, nao sei se esta correto
Discord: Npc Bugado#9074



local config = {
delrey = getPlayerCarValue(cid, DELREY),
cigarro = getPlayerCancer(cid, DERBY),
prostituta = getPlayerAIDS(cid, cracuda),
tresOitao = getPlayerRevorvi(cid, 38)
}
if(delrey == "Ligado" and cigarro == "Aceso" and prostituta == "No Colo" and tresOitao == "Carregado") then
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Começou o fim de semana. #PAS")
end


User avatar
Gio
Posts: 1058
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Sobre funções

11 Sep 2020, 16:22

Bom, primeiramente, o return só vai servir para que a função devolva algum valor se ele estiver dentro das chaves (os símbolos { e } se chamam chaves, os colchetes são os símbolos [ e ]). O corpo da função termina no símbolo de chave de fechamento.


Acho que entendi o que você quer fazer. Para procurar 10 imagens cujos nomes foram indexados numericamente (de 1.png até 10.png) através de uma função, você pode fazer assim:

Code: Select all

Loop 10
{
	Resultado := get_Cath(A_index)
	If (Resultado = 1)
	{
		ToolTip, A imagem %A_Index%.png foi encontrada.
	}
}
Return

get_Cath(corpse)
{
	ImageSearch, PosX10, PosY10, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, %A_ScriptDir%/search/%corpse%.png ; Se corpse é uma variável, você precisa dos %s para dereferenciá-la (do contrário o parâmetro entenderá como texto já que este parâmetro espera valores literais)
	If (ErrorLevel = 0)
	{
		MouseMove, 855, 629
		MouseClick, Right
		Sleep, 10
		MouseMove, %PosX10%, %PosY10%
		MouseClick, Left
		Return 1 ; Este valor retorna ao lugar onde ocorreu a chamada da função (as chamadas podem ser colocadas dentro de expressões matemáticas).
	}
}
User avatar
Hologram
Posts: 126
Joined: 06 May 2020, 16:47

Re: Sobre funções

11 Sep 2020, 20:40

Resultado := get_Cath(A_index)
O quê significa 'A_index' nessa linha?

E desse modo aonde eu posso especificar cada imagem pra ser procurada?
Discord: Npc Bugado#9074



local config = {
delrey = getPlayerCarValue(cid, DELREY),
cigarro = getPlayerCancer(cid, DERBY),
prostituta = getPlayerAIDS(cid, cracuda),
tresOitao = getPlayerRevorvi(cid, 38)
}
if(delrey == "Ligado" and cigarro == "Aceso" and prostituta == "No Colo" and tresOitao == "Carregado") then
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Começou o fim de semana. #PAS")
end


User avatar
Gio
Posts: 1058
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Sobre funções

11 Sep 2020, 21:09

Faltou um símbolo de chave de fechamento no código acima. Acabei de corrigir.

Hologram wrote:
11 Sep 2020, 20:40
Resultado := get_Cath(A_index)
O quê significa 'A_index' nessa linha?

E desse modo aonde eu posso especificar cada imagem pra ser procurada?
A_Index é uma variável embutida que contém o número da iteração atual dentro de um loop.

Então se esta for a primeira vez que o loop está rodando, A_Index vai conter 1. Já se for a trigésima vez que o loop está rodando, ela vai conter 30.

A_Index é portanto uma variável bastante útil para acessar listas de variáveis indexadas numericamente.
User avatar
Hologram
Posts: 126
Joined: 06 May 2020, 16:47

Re: Sobre funções

12 Sep 2020, 20:55

Uma ultima pergunta, pq nesse caso, a função vem depois do resultado? nao deveria ser vice-versa? eu tentei alterar e setou erro
Discord: Npc Bugado#9074



local config = {
delrey = getPlayerCarValue(cid, DELREY),
cigarro = getPlayerCancer(cid, DERBY),
prostituta = getPlayerAIDS(cid, cracuda),
tresOitao = getPlayerRevorvi(cid, 38)
}
if(delrey == "Ligado" and cigarro == "Aceso" and prostituta == "No Colo" and tresOitao == "Carregado") then
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Começou o fim de semana. #PAS")
end


User avatar
Gio
Posts: 1058
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Sobre funções

14 Sep 2020, 08:52

O comando Return tem um significado especial dentro de funções: além de retornar a execução para a linha da chamada da função, ele transforma a chamada em um resultado matemático.

Então execute o código simplificado abaixo e veja o que acontece:

Code: Select all

msgbox % 5 + RESOLVER()
Return


RESOLVER()
{
Return 9
}

:arrow: Como a função RESOLVER() retorna o valor matemático 9, o resultado de 5 + RESOLVER() se torna 14 (e é por isso que a msgbox exibe 14).

:arrow: Então se utilizarmos uma chamada a uma função que retorna um valor em uma expressão com o operador :=, o que teremos é que o valor do resultado será inserido dentro de uma variável. Por isso a linha Resultado := get_Cath(A_index) do código anterior está simplesmente inserindo o resultado retornado pela função get_Cath() dentro da variável Resultado.

Sendo assim, o que ocorre no código é que: nas iterações do loop em que a imagem for encontrada, a variável Resultado se transformará em 1 e com isso a condicional If (Resultado = 1) se tornará verdadeira, exibindo o tooltip.

:arrow: Creio que ficou um pouco difícil entender o código pelo fato de que ele não é testável sem que as condições ideais (imagens encontradas) ocorram, além de que o tooltip não tem um delay que o torne visível. Para entender melhor a lógica código anterior, removi o ImageSearch e coloquei um delay. Veja como agora o return 1 dita quais iterações do loop vão se transformar em tooltips:

Code: Select all

#Persistent

Loop 10
{
	Resultado := get_Cath(A_index)
	If (Resultado = 1)
	{
		ToolTip, A imagem %A_Index%.png foi encontrada.
	}
	Sleep 500
}
Return

get_Cath(corpse)
{
	If ((corpse = 3) OR (corpse = 5) OR (corpse = 7))
	{
		Return 1 ; Este valor retorna ao lugar onde ocorreu a chamada da função (as chamadas podem ser colocadas dentro de expressões matemáticas).
	}
}
User avatar
Hologram
Posts: 126
Joined: 06 May 2020, 16:47

Re: Sobre funções

29 Sep 2020, 10:51

Eu tentei seguir sua lógica, que faz bastante sentido pra falar a verdade, mas nao obtive um resultado nessa funçao, consegue apontar o erro

Code: Select all

loop{
Resultado1 := search_Image_All_Window(PosX1, PosY1, search, chat_yellow)
Resultado2 := search_Image_All_Window(PosX2, PosY2, search, chat_green)
	if (Resultado1 = 1) or (Resultado2 = 1){
		msgbox, imagem encontrada!
	}
}
return





search_Image_All_Window(PosX, PosY, page, name){
	ImageSearch, PosX, PosY, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, %A_ScriptDir%/%page%/%name%.png
	If (ErrorLevel = 0){
		Return 1
	}
}
Testando ela eu vi que o erro ta na variavel 'name' se eu tirar ela da funçao e colocar o nome da imagem manualmente, acaba rodando tranquilo
Discord: Npc Bugado#9074



local config = {
delrey = getPlayerCarValue(cid, DELREY),
cigarro = getPlayerCancer(cid, DERBY),
prostituta = getPlayerAIDS(cid, cracuda),
tresOitao = getPlayerRevorvi(cid, 38)
}
if(delrey == "Ligado" and cigarro == "Aceso" and prostituta == "No Colo" and tresOitao == "Carregado") then
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Começou o fim de semana. #PAS")
end


User avatar
Gio
Posts: 1058
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Sobre funções

29 Sep 2020, 11:33

Bom dia.

O código não parece estar inteiro, preciso ver como você está definindo os valores das variáveis, especialmente as variáveis chat_yellow e search.

Lembre-se que ao inserir literais usando o operador :=, você precisa colocá-los entre aspas duplas, pois do contrário, eles serão avaliados como variáveis onde o conteúdo deverá ser colocado na interpretação (e não o nome).
User avatar
Hologram
Posts: 126
Joined: 06 May 2020, 16:47

Re: Sobre funções

29 Sep 2020, 12:01

O codigo esta completo kk, creio que tu nao viu pq pulei algumas linhas que ficaram ocultas sem abaixar um pouco a caixa de codigos

Code: Select all

loop{
Resultado1 := search_Image_All_Window(PosX1, PosY1, search, chat_yellow)
Resultado2 := search_Image_All_Window(PosX2, PosY2, search, chat_green)
	if (Resultado1 = 1) or (Resultado2 = 1){
		msgbox, imagem encontrada!
	}
}
return
search_Image_All_Window(PosX, PosY, page, name){
	ImageSearch, PosX, PosY, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, %A_ScriptDir%/%page%/%name%.png
	If (ErrorLevel = 0){
		Return 1
	}
}
Discord: Npc Bugado#9074



local config = {
delrey = getPlayerCarValue(cid, DELREY),
cigarro = getPlayerCancer(cid, DERBY),
prostituta = getPlayerAIDS(cid, cracuda),
tresOitao = getPlayerRevorvi(cid, 38)
}
if(delrey == "Ligado" and cigarro == "Aceso" and prostituta == "No Colo" and tresOitao == "Carregado") then
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Começou o fim de semana. #PAS")
end


User avatar
Gio
Posts: 1058
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Sobre funções  Topic is solved

29 Sep 2020, 16:11

Bom, se está completo, então onde as variávies search, chat_yellow e chat_green estão recebendo seus valores?

Pelo que está no corpo da função search_Image_All_Window(), essas variáveis deveriam conter respectivamente o caminho da pasta e o nome do arquivo png que seriam buscados no ImageSearch. Sendo assim, o código deveria ser pelo menos algo como:

Code: Select all

search := "imagens" ; Nome da pasta que está dentro do script
chat_yellow := "imagem1" ; Nome do arquivo imagem1.png

loop{
Resultado1 := search_Image_All_Window(PosX1, PosY1, search, chat_yellow)
Resultado2 := search_Image_All_Window(PosX2, PosY2, search, chat_green)
	if (Resultado1 = 1) or (Resultado2 = 1){
		msgbox, imagem encontrada!
	}
}
return
search_Image_All_Window(PosX, PosY, page, name){
	ImageSearch, PosX, PosY, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, %A_ScriptDir%/%page%/%name%.png
	If (ErrorLevel = 0){
		Return 1
	}
}

:arrow: Afinal de contas, quando você executa a chamada search_Image_All_Window(PosX1, PosY1, search, chat_yellow), o conteúdo da variável Search se torna o conteúdo da variável page dentro do corpo da função, e ao mesmo tempo, conteúdo da variável chat_yellow se torna o conteúdo da variável name dentro do corpo da função.
User avatar
Hologram
Posts: 126
Joined: 06 May 2020, 16:47

Re: Sobre funções

29 Sep 2020, 17:03

Tem razao foi um erro bem feio meu kk, o resultado que eu esperava era assim:

Code: Select all

loop{
Resultado1 := search_Image_All_Window(PosX1, PosY1, "search", "chat_yellow")
Resultado2 := search_Image_All_Window(PosX2, PosY2, "search", "chat_green")
	if (Resultado1 = 1) or (Resultado2 = 1){
		msgbox, imagem encontrada!
	}
}
return





search_Image_All_Window(PosX, PosY, page, name){
	ImageSearch, PosX, PosY, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, %A_ScriptDir%/%page%/%name%.png
	If (ErrorLevel = 0){
		Return 1
	}
}
return
Discord: Npc Bugado#9074



local config = {
delrey = getPlayerCarValue(cid, DELREY),
cigarro = getPlayerCancer(cid, DERBY),
prostituta = getPlayerAIDS(cid, cracuda),
tresOitao = getPlayerRevorvi(cid, 38)
}
if(delrey == "Ligado" and cigarro == "Aceso" and prostituta == "No Colo" and tresOitao == "Carregado") then
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Começou o fim de semana. #PAS")
end



Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: Gio and 3 guests