Compartilhe
avatar
Scripter CLEO - Avançado
Scripter CLEO - Avançado
Título : Não quero acreditar, quero saber.
Mensagens : 21905
Reputação : 678
Desde : 03/05/2012
Idade : 22
Localização : Ibitinga - SP
Link : www.MixMods.com.br
Ver perfil do usuáriohttp://MixMods.com.br
  • Reputação da mensagem: 100% (1 votos)

6. Princípios de funcionamento e loops

em Qui 26 Jan 2017, 03:18


Concluindo esta parte você vai:
Saber responder como um script anda / se comporta;
Saber responder o que é "WAIT" e como ele funciona realmente;
Saber responder o que são e como criar loops.

Como um script anda?

Ao criar um script, você está dando comandos, e estes comandos sempre são lidos de cima pra baixo.



Código copiável:

Código:
SCRIPT_START
{
NOP

WAIT 2000

PRINT_STRING_NOW "1" 1000

WAIT 1000

PRINT_STRING_NOW "2" 1000

WAIT 1000

PRINT_STRING_NOW "3" 1000

WAIT 1000

PRINT_STRING_NOW "4" 1000

WAIT 1000

PRINT_STRING_NOW "5" 1000

TERMINATE_THIS_CUSTOM_SCRIPT
}
SCRIPT_END

Nota importante: Quando comecei a digitar este tutorial, ainda não era necessário adicionar "SCRIPT_START" e "SCRIPT_END" no código, mas agora é! E as imagens abaixo estão desatualizadas.
Não acho necessário eu refazer todas as imagens do tutorial por causa disso, simplesmente lembre-se: Ao copiar os códigos das imagens do tutorial, adicione um SCRIPT_START no começo e SCRIPT_END no fim! Como mostrado acima.

Este script mostrará os números "1", "2" ... "5" na tela, com intervalo de 1 segundo cada.
Todos os "1000" do código acima são "1000 milissegundos", ou seja, 1 segundo.

Nota: É sempre recomendado você testar estes scripts no Load Game (em algum jogo salvo), pois os scripts são ativados ainda na cutscene de início, portanto é ruim você ficar vendo mensagens na tela durante a cutscene de início do jogo, né? Ainda que ela fica com alguns segundos em tela preta sem poder ver as mensagens.

Este é um comando da CLEO que faz mostrar um texto na tela (neste caso em específico, o texto "1") — como já foi mostrado anteriormente no "Sup world.":
Código:
PRINT_STRING_NOW "1" 1000
O "1000" no fim do comando é o tempo para mostrar (ou seja, ficará 1 segundo mostrando). E como saber que aquilo é o tempo?

Como já foi falado anteriormente: Enquanto você está digitando!

"Tempo em ms (milissegundos)"
E embaixo o que este comando faz:
"Mostra uma mensagem imediatamente".

Digite os códigos!
Por este motivo, eu recomendo que de início você digite os códigos mostrados neste tutorial para você se acostumar com digitação e ver na "íntegra" estas informações pipocando na tela enquanto você digita.

É muito interessante você já ir começando a digitar manualmente o que está sendo mostrado aqui, vai te ajudar a se familiarizar com a digitação de códigos — e com os erros que você pode acabar fazendo ao tentar digitar.

Arraste o VS Code para o lado da sua tela, deixando ele de um lado e este tutorial de outro para facilitar ao copiar os códigos.
Mas também tente não copiar letra por letra olhando toda hora, tente raciocinar o que você digitará, tente digitar sozinho. É uma ótima prática para o início do aprendizado.


Comando WAIT

O comando WAIT é um comando muito. Muito. Muito importante!!!
Ele é o mais usado nos scripts, portanto é importante você entendê-lo bem.

Como o nome diz, ele manda o script esperar, ou seja, temos um WAIT 2000 no início do código, que quer dizer "ESPERE 2 segundos" (2000 milissegundos).
Portanto, 2 segundos depois do jogo iniciar, o texto "1" será mostrado na tela. E depois de 1 segundo, o texto "2" será mostrado. E assim até o texto "5" onde terminará com um TERMINATE_THIS_CUSTOM_SCRIPT que faz o nosso script "fechar", ou seja, parar pra sempre, terminar. Nota: Neste caso em específico, é opcional usar pois o "SCRIPT_END" também fará isso da mesma maneira, mas é interessante termos isso em "vista". A Rockstar por exemplo usa sem necessitar também. Se não quiser, não coloque.

Mas é tão simples assim?

Não!

WAIT não é só esperar, é processar!!!
O WAIT diz ao jogo "Ok, já fiz meu trabalho, pode processar aí". E depois de processar, ele irá esperar.
Se você usar "WAIT 0" (o que é extremamente comum de se usar nos códigos) você está dizendo ao jogo "processe o jogo, e espere nada, volte imediatamente!"

O que é o jogo ser processado?
É assim:

  • Seu script está rodando, fazendo todo o necessário;
  • Chegamos num WAIT;
  • O seu script para;
  • O próximo script do seu jogo será chamado (possivelmente algum outro mod cleo que você tenha);
  • Chegou em algum WAIT neste outro script;
  • Aquele script também irá parar agora;
  • Outro será chamado...;
  • Depois disso acontecer com todos os scripts do seu jogo (todas as suas threads — eu já expliquei o que são threads!), o jogo finalmente será processado;
  • O jogo agora processará. Fará tudo que um jogo precisa fazer para ele funcionar — comandos do jogador, funcionamento da inteligência artificial, físicas etc etc etc —, e assim será mostrado no seu monitor mais um quadro (mais um frame);
  • Depois do jogo ser processado, novamente os scripts são chamados, e voltamos a fazer isso tudo de novo.

Tudo isso que escrevi acima acontece a cada "frame" ("quadro"). Sim, sabe quando você está com 30 FPS? Você está com 30 frames por segundo (Frames Per Second, em inglês), ou seja, tudo isso que falei acima acontecerá 30 vezes por segundo!

Tente parar para pensar um pouco. É um pouco difícil entender, mas sim, tudo acontece muito rápido!

E é inclusive por isso que o FPS abaixa caso tiver muita coisa no seu jogo, pois o processador do seu PC (ou da sua placa de vídeo) tem muitas tarefas para fazer, e pode demorar mais para processar tudo aquilo, assim diminuindo a quantidade de vezes que o jogo processa por segundo!

É, você está aprendendo como um jogo funciona.

O ponto é: E se nós não usarmos WAIT? O jogo não será processado! Ou seja, o jogo ficará parado, literalmente, sem mensagem de erro, o "congelamento" (freeze), e se em algum momento ele encontrar um WAIT depois de tanto tempo parado sem WAIT algum, ele irá voltar a processar mais um quadro. (nota: isso não é literalmente, mas o que importa é o entendimento)

É bem interessante, não? É um assunto um pouco difícil de compreender para algumas pessoas e você não precisa se preocupar tanto em entender isso.
Mas você tem que entender que: WAIT processa o jogo! E se não usar em loops, o jogo não será processado, assim causando o "freeze". Você verá exemplos abaixo.


LOOP

Vamos editar o nosso código acima:

Sem código copiável. Digite isso você mesmo editando o anterior :)
Lembre-se: Como eu disse antes, adicione o SCRIPT_START e SCRIPT_END no início e fim.

Compile e abra o jogo com este código. Aparecerá uma contagem de 1 a 5, mas depois do 5, voltará ao 1! E fará a contagem de novo... e voltará de novo! Sem parar.

Isso se chama "loop infinito". É uma repetição infinita, e você trabalhará quase sempre desta maneira. Acostume-se. Lembre-se do nome: Loop!

Como funciona?

GOTO é um comando que diz para "ir para" ("go to" em inglês).
main_loop: é uma label — ai meu deus, quantas palavras!

Uma label é uma marcação do seu script. Um local, e você pode enviar o script para ler aquele local. Entendeu já? É só um "vai pra lá!"

O loop acontece por causa disso abaixo (isso abaixo é um pseudo code (pseudocódigo)):
Código:
início_da_contagem:
PROCESSE O JOGO E ESPERE
MOSTRE NA TELA A CONTAGEM
VAI PARA O início_da_contagem
Note que, depois de mostrar na tela a contagem, ele volta ao início da contagem, assim irá mostrar de novo, e de novo...! Nunca irá parar de voltar pro início e mostrar de novo. É infinito.

Daí você me pergunta: Por que "main_loop"? Isso é um nome inventado por você!!! É você quem dá o nome para as labels! Escolha o nome que você bem entender, mas sempre evite carácteres especiais, acentos etc.

Vamos refazer o nosso script de uma maneira diferente:

Digite este código você mesmo.

O texto nunca sumirá. Mesmo que eu tenha colocado para ele ficar na tela durante 1 segundo (1000 milissegundos) ele ficará na tela para sempre, pois ele está em loop! Ou seja, o "1000" não importa aqui e pode ser qualquer número.
Ele será mostrado num frame, e noutro, e outro... Pois depois de mostrar, eu dei um GOTO para cima, onde irá processar o jogo novamente (WAIT) e mostrar mais uma vez. Nunca deixará de ser mostrado — e o jogo nunca deixará de ser processado, sacou?

Tente remover o WAIT 0 do código, compilar e entrar no jogo. O seu jogo ficará em freeze, congelado, pois você está num loop sem nunca processar o jogo.

O que acontece se você colocar um WAIT 5000 embaixo do NOP e remover o WAIT 0 dentro do loop? Teste.

Um exemplo super simples do uso de GOTO para controlar o seu código:


Veja que, foi mostrado uma mensagem, esperei 1 segundo, e fiz o script ir para outra label onde mostrará outra mensagem, esperará outro segundo, e voltará para o início, voltando o loop.

Mas, espere. E se eu te falar que há um "erro" nesse código? Você consegue identificar qual erro?
Sim, o código funciona perfeitamente, mas há uma coisinha que não faz sentido estar aí.

Se você não tem Alzheimer, vai lembrar que no início dessa parte do tutorial eu falei que os scripts funcionam sempre indo pra baixo.


Bem, então qual o sentido disso?
Não há sentido!

O mesmo código pode ser escrito desta maneira:


Ou até mesmo desta!


É porque eu fiz um GOTO para uma label que está logo abaixo, o que é totalmente desnecessário (e muito comum pessoas iniciantes fazerem tal erro). Se o script funciona indo de linha em linha pra baixo, então por que dar um GOTO pra linha debaixo?...
Não pode ser considerado um erro grave pois afeta absolutamente em nada no jogo, mas é desnecessário e sem sentido adicionar labels inúteis. Olhe o último código que mostrei, ele está limpo, bonito!

E agora?

Agora sim! Aquela mensagem no meio nunca aparecerá, pois você pulou ela.

E para terminar, este belo exemplo:


Será mostrado "1", depois "2", e depois "3", e voltará a mostrar "1" de novo, e depois "2" de novo etc...




Wow, isso foi muito produtivo. Você deve ter aprendido muita coisa aqui.

Isso que mostrei foi uma forma low level (de baixo nível) de programar, que é ficar redirecionando o código para lá e para cá. Funciona, é útil e você fará isso para criar os loops e alguns redirecionamentos. Mas ainda tem muito pela frente! Ainda iremos mais para o lado high level.

O lado lowlevel é o nível da máquina, como uma máquina trabalha, e é fácil para iniciantes (e foi fácil, né?).
O lado highlevel é o nível humano de leitura de um código, na qual usa a lógica humana, menos manual, mais automática. Você "conversa" com a máquina naturalmente e te dará muito mais produtividade.

A próxima parte do tutorial também será muito produtiva e importante, e você aprenderá a realmente a controlar um script.


Próxima parte:
7. Condições


Última edição por Junior_Djjr em Qui 03 Ago 2017, 06:48, editado 1 vez(es)

______________________________

avatar
Scripter CLEO - Básico
Scripter CLEO - Básico
Mensagens : 1027
Reputação : 82
Desde : 04/03/2013
Idade : 17
Ver perfil do usuário

Re: 6. Princípios de funcionamento e loops

em Qui 26 Jan 2017, 07:08
@Junior_Djjr escreveu:Depois disso acontecer com todos os scripts do seu jogo (todas as suas threads — eu já expliquei o que são threads!), o jogo finalmente será processado;
Explicou não :v

Estou lendo o tutorial todo porque acordei muito cedo e não tenho nada pra fazer.
avatar
Veterano
Veterano
Mensagens : 2915
Reputação : 81
Desde : 31/07/2013
Ver perfil do usuário

Re: 6. Princípios de funcionamento e loops

em Qui 26 Jan 2017, 10:50
É, eu me confundi achando que tinha algo no índice que eu havia pulado, mas não. philosoraptor

______________________________
I̜mpe͢r͚at̲ivoͯ, ͘no̅ mụnd̶o͋ ̺sl͟o͗w
́Co͔m͢ó ̼a ̒p̎eçͦa̲ ̖MC͝s ̚só͊ ͡faz̀em̈́ ̛s̸p͆ee͌df̡l̡owͭ
̟Pͭra ̌que̲ ä́ p̐r͜es̋s͉aͤ?
avatar
Scripter CLEO - Avançado
Scripter CLEO - Avançado
Título : Não quero acreditar, quero saber.
Mensagens : 21905
Reputação : 678
Desde : 03/05/2012
Idade : 22
Localização : Ibitinga - SP
Link : www.MixMods.com.br
Ver perfil do usuáriohttp://MixMods.com.br

Re: 6. Princípios de funcionamento e loops

em Qui 26 Jan 2017, 15:01
@Nex' escreveu:
@Junior_Djjr escreveu:Depois disso acontecer com todos os scripts do seu jogo (todas as suas threads — eu já expliquei o que são threads!), o jogo finalmente será processado;
Explicou não :v

Estou lendo o tutorial todo porque acordei muito cedo e não tenho nada pra fazer.
É mesmo, tem uma parte do tutorial que fica separada para explicar as palavras, onde eu dei uma introdução sobre o que é Thread (pra no futuro explicar mais a fundo).

Vou adicionar ela no Preparações mesmo.

______________________________

avatar
Designer - Intermediário
Designer - Intermediário
Título : Lâminas Mortais
Mensagens : 3227
Reputação : 140
Desde : 13/10/2012
Idade : 17
Localização : Terra Mágica dos Poneys
Link : MixMods.com.br
Ver perfil do usuáriohttp://www.mixmods.blogspot.com

Re: 6. Princípios de funcionamento e loops

em Sab 28 Jan 2017, 11:21
Muito bom mano.
Até agora to entendendo tudo sem problemas e eu mesmo ja tinha questionado aquela parte do GOTO logo acima da label antes de vc perguntar onde estava o erro, acho que to no caminho certo :v:.

______________________________
Configs:

Processador : Intel Core 2 Quad Q8200 2.34 Ghz
Memória RAM : 8GB DDR2
Placa de Vídeo : GTX 750 1GB
Sistema Operacional :  Windows 10 64 Bits Pro
Conteúdo patrocinado

Re: 6. Princípios de funcionamento e loops

Permissão deste fórum:
Você não pode responder aos tópicos neste fórum