Pesquisa resultou em 3 ocorrências

por Junior_Djjr
07 Mai 2019, 12:55
Fórum: GTA3script (CLEO)
Tópico: 15. Mais sobre condições
Respostas: 8
Exibições: 1325
Gênero:

Re: 15. Mais sobre condições

ElTacoBanido escreveu:
06 Mai 2019, 19:40
Então essa "tática" é basicamente o mesmo de
Return TRUE ou Return FALSE em outras linguagens como c++?
f16-utilidades/t179-gta3script-while-tr ... turn_false
Já foi mostrado antes (na parte sobre condições).
Também coloquei agora neste pois combina mais.
ElTacoBanido escreveu:
06 Mai 2019, 19:40
Alias o link ta redirecionando errado f141-secao-tutorial-gta3script/t545-16-arrays
Link onde?
por Junior_Djjr
16 Nov 2018, 19:51
Fórum: GTA3script (CLEO)
Tópico: 15. Mais sobre condições
Respostas: 8
Exibições: 1325
Gênero:

Re: 15. Mais sobre condições

Clear escreveu:
16 Nov 2018, 11:33
Junior_Djjr escreveu:
01 Jun 2018, 17:27
SWITCH var CASE 10 PRINT_STRING_NOW "O valor eh 1" 1 BREAK
Não seria 10 Junior? 
É...
por Junior_Djjr
01 Jun 2018, 17:27
Fórum: GTA3script (CLEO)
Tópico: 15. Mais sobre condições
Respostas: 8
Exibições: 1325
Gênero:

15. Mais sobre condições

Concluindo esta parte você irá:
Aprender REPEAT e SWITCH, incluindo uma parte pouco mais teórica sobre condições e uma tática de retorno de verdadeiro/falso.
Eu li uma apostila de Java onde tinha um foco legal: Ensinar cada coisa quando a pessoa estiver pronta para aquilo, eu achei isso interessante e logo iniciei este tutorial tentando passar isso para vocês também.

Na parte 6 eu deixei de te ensinar outros tipos de loops.
Na parte 7 eu deixei de te ensinar outros tipos de condições.
Pois você não sabia o que era variáveis, GOSUB/CLEO_CALL e mal tinha noções sobre códigos ainda! Mas agora acredito que você já está pegando o jeito da coisa!


REPEAT

REPEAT é um loop que será repetido um tanto definido de vezes:

Código: Selecionar tudo

SCRIPT_START
{
WAIT 3000

LVAR_INT var1

REPEAT 5 var1
   PRINT_FORMATTED_NOW "%i" 1000 var1
   WAIT 1000
ENDREPEAT
}
SCRIPT_END
Neste script, após 3 segundos, irá mostrar os números: 0, 1, 2, 3, 4 na tela com intervalo de 1 segundo cada.
"Por que 0 a 4? Por que não 1 a 5?"
Meu filho, se acostume, você está num universo diferente onde as contagens começam do 0 e não do 1!

Note que você pode usar a variável var1 dentro desse loop, assim pode te ser útil (eu particularmente geralmente prefiro o bom e velho WHILE).

Perceba que o REPEAT é o mesmo disto:

Código: Selecionar tudo

var1 = 0
WHILE var1 < 5
    PRINT_FORMATTED_NOW "%i" 1000 var1
    WAIT 1000
    var1 += 1
ENDWHILE
Mas neste caso, o REPEAT é mais bem vindo, né? O código do WHILE ficou poluído.

No entanto, com WHILE você tem o controle do valor inicial (neste caso, 0), o operador de condição (neste caso, <) e o operador matemático (neste caso, += 1). Ou seja, com WHILE você pode fazer contagens regressivas, ou de 10 em 10 etc, enquanto com REPEAT é simplesmente de 0 a X.

Se você acha que REPEAT é meio inútil, você está certo. Mas na próxima parte você aprenderá sobre "arrays", e lá ele se tornará mais útil!


SWITCH

Ohh, SWITCH é ótimo!
É como se fosse vários IFs, mas de uma maneira mais "correta"; elegante.

Código: Selecionar tudo

SCRIPT_START
{
LVAR_INT var
var = 2

main_loop:
WAIT 0

SWITCH var
    CASE 1
        PRINT_STRING_NOW "O valor eh 1" 1
        BREAK
    CASE 2
        PRINT_STRING_NOW "O valor eh 2" 1
        BREAK
    CASE 3
        PRINT_STRING_NOW "O valor eh 3" 1
        BREAK
    DEFAULT
        PRINT_STRING_NOW "O valor eh outro" 1
        BREAK
ENDSWITCH

GOTO main_loop
}
SCRIPT_END
Nele, você envia uma variável, e dependente do valor dela, ele fará diferentes coisas.

No SWITCH eu enviei esta var, e CASE ("caso") 1, aparecerá a mensagem de que o valor é 1.
A variável atualmente tem o valor 2, portanto, neste exemplo, aparecerá a mensagem do valor 2.
No DEFAULT é para caso não seja nenhum dos valores. Este é opcional, você não precisa colocar.

E você pode personalizar como bem entender:

Código: Selecionar tudo

SCRIPT_START
{
LVAR_INT var
var = 128

main_loop:
WAIT 0

SWITCH var
    CASE 10
        PRINT_STRING_NOW "O valor eh 10" 1
        BREAK
    CASE 50
        PRINT_STRING_NOW "O valor eh 50" 1
        BREAK
    CASE 100
        PRINT_STRING_NOW "O valor eh 100" 1
        BREAK
    CASE 128
        PRINT_STRING_NOW "O valor eh 128" 1
        BREAK
    CASE 0
        PRINT_STRING_NOW "O valor eh 0" 1
        BREAK
    DEFAULT
        PRINT_STRING_NOW "O valor eh outro" 1
        BREAK
ENDSWITCH

GOTO main_loop
}
SCRIPT_END
  
Vamos ver um exemplo mais útil que você poderá usar no futuro:

Você tem um menu, o jogador pode mexer neste menu, e quando selecionar (pressionar uma tecla), você enviará a variável item para o SWITCH, na qual a item diz qual dos itens foi selecionado, e assim fará diferentes coisas dependente de qual item do menu ele selecionou. Como por exemplo, dar spawn em diferentes carros:

Código: Selecionar tudo

SWITCH item
    CASE 0
        SPAWN_VEHICLE_BY_CHEATING ELEGY
        BREAK
    CASE 1
        SPAWN_VEHICLE_BY_CHEATING INFERNUS
        BREAK
    CASE 2
        SPAWN_VEHICLE_BY_CHEATING TURISMO
        BREAK
    CASE 3
        SPAWN_VEHICLE_BY_CHEATING URANUS
        BREAK
    CASE 4
        SPAWN_VEHICLE_BY_CHEATING JESTER
        BREAK
ENDSWITCH
Muito legal, né?
Você ainda não sabe fazer menus, mas está aí uma introdução sobre eles. Logo terá um tutorial de menus por aqui.

Perceba que CASE e DEFAULT não existe END, o fim é na verdade o BREAK, que fica dentro dele.

E o que é BREAK? É para "quebrar" o SWITCH e continuar abaixo de ENDSWITCH. No GTA3script usar BREAK é obrigatório (caso esquecer, o compilador te avisará).
  

  
Táticas de condições

Vamos nos aprofundar um pouco no que exatamente são as condições, e preciso que você dê muita atenção aqui.

Vamos voltar a lembrar: 1 = true, 0 = false.

Vamos esquecer o IF.

O seu script está rodando, e ali num cantinho há um bit.

Quando ele passar por isto:

Código: Selecionar tudo

IS_PC_VERSION
Aquele bit ficará TRUE.

Num futuro próximo, o "sistema" do jogo fará alguma resposta de verdadeiro/falso. E como ele vai saber a resposta? Indo naquele bit!

Esse é um resumão de como funciona, há inclusive 8 bits (lembra que você pode usar até 8 condições?) e o AND e OR do IF é na verdade um argumento para o IF (literalmente!), na qual dará verdadeiro só caso todas (AND), ou alguma (OR) das condições for verdadeira, e ele saberá isso indo lá nos bits ver se eles estão true (1).

Blá blá blá, e o que isso importa?

Dê uma olhada neste script:

Código: Selecionar tudo

SCRIPT_START
{
LVAR_INT scplayer

GET_PLAYER_CHAR 0 scplayer


main_loop:
WAIT 0
IF GOSUB activated
    PRINT_STRING_NOW "Whoaaaaaa" 100
ENDIF
GOTO main_loop


activated:
IF IS_CHAR_SITTING_IN_ANY_CAR scplayer
AND IS_KEY_PRESSED VK_KEY_Y
    IS_PC_VERSION
ELSE
    IS_AUSTRALIAN_GAME
ENDIF
RETURN

}
SCRIPT_END
É sério! Isso funciona!

Nós fizemos uma gambiarra de usar IS_PC_VERSION para marcar o tal bit como "true" (afinal, o jogo é de PC, então sempre retornará verdadeiro), e IS_AUSTRALIAN_GAME para marcar o tal bit como "false" (afinal, o jogo não é australiano, então sempre retornará falso).
Após setar true ou false, terá um RETURN que retornará, e só agora aquele IF irá agir pegando os true/false que ele armazenou durante a sua jornada dentro de um GOSUB.
 
Aqui um exemplo menos útil mas mais fácil de entender:

Código: Selecionar tudo

SCRIPT_START
{
LVAR_INT var
var = 2


main_loop:
WAIT 0
IF GOSUB in_car
    PRINT_STRING_NOW "Whoaaaaaa" 100
ENDIF
GOTO main_loop


in_car:
IS_CHAR_SITTING_IN_ANY_CAR scplayer
RETURN

}
SCRIPT_END
Seria o mesmo de eu ter digitado isto:

Código: Selecionar tudo

SCRIPT_START
{
LVAR_INT var
var = 2


main_loop:
WAIT 0
IF IS_CHAR_SITTING_IN_ANY_CAR scplayer
    PRINT_STRING_NOW "Whoaaaaaa" 100
ENDIF
GOTO main_loop

}
SCRIPT_END

A utilidade vem quando:
Você quer fazer alguma coisa naquele GOSUB, e após ter feito a tal coisa, você quer retornar um verdadeiro ou falso. Alguma coisa como "tudo deu certo ou não?".

Veja este outro exemplo útil:

Código: Selecionar tudo

SCRIPT_START
{
LVAR_INT key1 key2

IF GOSUB carregar_arquivos
    // ok
    PRINT_STRING_NOW "Tudo certo" 2000
    WAIT 2000
ELSE
    // fail
    PRINT_STRING_NOW "Nao foi possivel continuar." 5000
    TERMINATE_THIS_CUSTOM_SCRIPT
ENDIF


main_loop:
WAIT 0
PRINT_STRING_NOW "Mod rodando..." 1
GOTO main_loop


carregar_arquivos:
IF NOT READ_INT_FROM_INI_FILE "cleo\mod.ini" "config" "key1" key1
    PRINT_STRING_NOW "Falha ao carregar 'key1' do .ini" 5000
    WAIT 5000
    IS_AUSTRALIAN_GAME // falso (erro)
    RETURN
ENDIF
IF NOT READ_INT_FROM_INI_FILE "cleo\mod.ini" "config" "key2" key2
    PRINT_STRING_NOW "Falha ao carregar 'key2' do .ini" 5000
    WAIT 5000
    IS_AUSTRALIAN_GAME // falso (erro)
    RETURN
ENDIF
PRINT_STRING_NOW ".ini carregado com sucesso! do .ini" 5000
WAIT 5000
IS_PC_VERSION // verdadeiro (ok)
RETURN

}
SCRIPT_END
É muito comum você fazer algo assim num mod.

Perceba o que eu fiz:
Um GOSUB onde carrega o meu .ini (Veja como carregar arquivos .ini aqui se ainda não viu!!!) e caso dar algum problema ao tentar carregar, eu mostro uma mensagem e retorno falso (IS_AUSTRALIAN_GAME), mas se nada dar errado, irá retornar verdadeiro (IS_PC_VERSION), e no retorno, o IF dará o resultado conforme ("foi verdadeiro ou falso?").

E CLEO_CALL?
Exatamente a mesma coisa!!! Muda nada!


Limitações:
É super perigoso você usar tal tática com um IF AND/OR, pois normalmente dentro do GOSUB/CLEO_CALL também terá um outro IF, ou seja, você sobrescreveu o IF antigo. Se você não usar, funcionará.

Lembra que é possível fazer coisa desse tipo?

Código: Selecionar tudo

IS_CHAR_SITTING_IN_ANY_CAR scplayer
RETURN
Mas perceba que não é possível fazer coisa assim:

Código: Selecionar tudo

IF var1 = 10
RETURN
Pois não é aceito IF desta maneira.
E como seria sem IF?

Código: Selecionar tudo

var1 = 10
RETURN
Wat?? Isso deixou de ser condição!
Para retornar um verdadeiro ou falso, você teria que ter feito assim:

Código: Selecionar tudo

IF var1 = 10
    IS_PC_VERSION
ELSE
    IS_AUSTRALIAN_GAME
ENDIF
RETURN
Mas ainda há como! Veja:

Código: Selecionar tudo

IS_INT_LVAR_EQUAL_TO_INT_LVAR var1 10
RETURN
Digitar isso foi exatamente a mesma coisa de ter digitado IF var1 = 10, mas agora em vez de usarmos um operador, nós usamos um comando :peepo2:
Ou melhor ainda:

Código: Selecionar tudo

IS_THING_EQUAL_TO_THING var1 10
Assim não precisando especificar que seja uma LVAR com INT e tal.
Incluindo variações, como IS_THING_LESS_THAN_THING, IS_THING_GREATER_THAN_THING etc. É só saber inglês básico, vai!
 

Eu só queria deixar claro que isso não é uma coisa obrigatória de usar (ué, por que seria?). Só use caso você achar útil, não se sinta obrigado a usar isso, ok? Isso não é uma das coisas "ohh, todo mundo usa! Você usará!", isso é só uma coisinha legal para se fazer na qual pode deixar seu código mais interessante e dinâmico :) (eu particularmente uso muito, não sei do que será de você)


WHILE TRUE, RETURN_TRUE, RETURN_FALSE

Eu gostaria de repetir algo que já foi ensinado na parte sobre condições, só que esta nova parte tem mais semelhanças sobre...
Já sabendo a teoria por trás disto, você pode experimentar uma espécie de extensão para o GTA3script que possibilita o uso do WHILE TRUE, RETURN_TRUE, RETURN_FALSE, semelhante à outras programações:
f16-utilidades/t179-gta3script-while-tr ... turn_false


Próxima parte:
Arrays

Voltar para “15. Mais sobre condições”