Entrar
Últimos assuntos
» player não consegue andarpor lovn7 Qui 21 Nov 2024, 13:33
» É possível fazer istó no game maker
por William Lima Qui 21 Nov 2024, 10:56
» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por Lua Sáb 16 Nov 2024, 20:22
» (Resolvido) Cenario longo x Texture Pages
por josuedemoraes Sáb 16 Nov 2024, 15:31
» Kids' band
por Adilson Lucindo Santos Sex 15 Nov 2024, 12:23
» (RESOLVIDO) Engasgos-Troca de Sprites/animações
por josuedemoraes Ter 12 Nov 2024, 01:49
» Block Room - DEMO
por Joton Qua 06 Nov 2024, 22:58
» Game Infinito vertical (subindo)
por macmilam Sáb 26 Out 2024, 12:36
» Retorno da GMBR!!!
por Dancity Ter 22 Out 2024, 16:36
» Máquina de estados
por aminaro Qui 10 Out 2024, 13:33
» como faço pra um objeto colidir com o outro e diminuir a vida do player ?
por josuedemoraes Qui 03 Out 2024, 16:51
» RESOLVIDO: Colisão com objetos moveis
por josuedemoraes Qua 02 Out 2024, 20:28
» Crypt of the Blood Moon
por divin sphere Qua 11 Set 2024, 18:18
» como fazer um objeto seguir?
por divin sphere Dom 18 Ago 2024, 18:08
» Procuro de alguém para Modelar/Texturizar/Animar objetos 3D
por un00brn Dom 11 Ago 2024, 11:10
» Destruição de cenário (estilo DD Tank)
por CoronelZeg Sex 09 Ago 2024, 17:16
» RESOLVIDO-Como destruir uma instancia especifica de um objeto
por josuedemoraes Ter 23 Jul 2024, 00:40
» Automatizar a coleta de id
por GabrielXavier Seg 22 Jul 2024, 18:01
» Preciso de ajuda para concluir um pequeno projeto
por lmoura Qui 27 Jun 2024, 15:45
» ANGULO ACOMPANHAR O OBJETO
por Klinton Rodrigues Qui 27 Jun 2024, 08:34
» Musica reinicia quando sala reinicia
por GabrielXavier Ter 18 Jun 2024, 07:28
» como fazer uma copia de gd
por generico_cube Sex 14 Jun 2024, 15:48
» Square Adventure
por guilherme551 Ter 11 Jun 2024, 09:54
» como posso definir limite de uma variavel
por GabrielXavier Sex 07 Jun 2024, 14:14
» [Resolvido] Dúvida, colisão única de objeto
por vdm842 Sex 24 maio 2024, 09:50
[Script] Movimento Perfeito
3 participantes
Página 1 de 1
[Script] Movimento Perfeito
[Script] Movimento Perfeito
A magia do repeat
A magia do repeat
- Introdução:
- A colisão entre dois objetos é crucial para o bom funcionamento de um jogo seja lá o tipo do mesmo. Alguns devem conhecer a engine Movimento Limpo que eu criei para tentar burlar este problema, mas poucos são os que conseguem usar e pouquíssimos os que entendem seu funcionamento. Neste pequeno artigo, mostrarei e explicarei com detalhes o funcionamento do script principal, possibilitando que você entenda seu funcionamento e que faça as alterações que desejar. Caso não saiba usar scripts, leia este artigo.
Script:
Para usar o script, basta chamá-lo e passar a velocidade desejada (números positivos movimentam para a direita e negativos para a esquerda), por exemplo, scr_hspeed(4)Obs: O script acima é para movimento horizontal (x). Para movimentos verticais altere os valores de x para y.
- Código:
D = sign(argument0); //Saber se arg0 é negativo ou positivo.
repeat(abs(argument0)){ //Repete o código do escopo abs(arg0) vezes.
if (place_free(x+1*D,y)){ //Verifica espaço livre de sólidos
x+=1*D; //Movimenta
}
}
Desmembrando o script
Daqui em diante, você entenderá como o script funciona. Desmembrarei o script linha por linha. O script usa apenas um argumento (argument0) que é a velocidade estipulada.- D = sign(argument0):
- "D" é uma variável como todas as outras, porém, esta armazenara apenas um destes três valores: -1, 0 ou 1. Isso é possível graças a função sign, que dado um valor, retorna se o mesmo é positivo (1), negativo (-1) ou se ele é zero (0). Usaremos o valor de "D" para saber qual direção o objeto pretende se mover e fazer os cálculos e movimentos corretos.
- repeat(abs(argument0)):
- O repeat é a chave para o funcionamento do script. Sem ele, não seria possível fazer uma movimentação perfeita. Este funciona da seguinte forma: Passamos como argumento para o repeat um valor (real e inteiro). Com este valor, todo o código dentro do escopo ({ }) será repetido de acordo com o valor em um único step! É importante notar que o repeat aceita apenas valores positivos, por isso, usamos abs que serve para transformar números negativos em positivos.
- if (place_free(x+1*D,y)):
- Note que esta linha de código está dentro do repeat! A função place_free serve para verificar se existe algum objeto sólido em determinada posição. Como nosso sistema é pixel por pixel, precisamos checar apenas um pixel a direita ou para a esquerda do nosso objeto. Para isso, usaríamos x+1 para objetos à direita e x-1 para objetos à esquerda. Graças ao poder da matemática, podemos fazer isso com um checamento inteligente multiplicando x+1 por "D". Para entender melhor, aqui vai uma pequena explicação:O Poder da Matemática escreveu:
Multiplicando um valor qualquer por 1, ele permanece inalterado (-10 * 1 = -10).
Multiplicando um valor qualquer por -1, ele inverte seu sinal (-10 * -1 = 10).
Multiplicando um valor qualquer por 0, ele vira zero (-10 * 0 = 0).Lembrando que:
place_free checa a existência de objetos sólidos.
place_meeting checa a existência de um objeto especifico.
place_empty checa a existência de qualquer objeto.
- x+=1*D:
- Depois de verificarmos se existe espaço livre para o objeto se mover, usamos novamente o poder da matemática e por fim alteramos a posição do objeto. Note que esta linha de código também está dentro do repeat, portanto, por mais que ele indique andar apenas um pixel, ele andará de acordo com a velocidade passada para o script (argument0) em um único step, dando a impressão de velocidade e garantindo que não aconteça nenhuma colisão.
Implementações
O coração desse sistema de movimento é o repeat. Se você deseja fazer um sistema de empurrar caixas ou uma plataforma que carrega o jogador, você deverá colocar seus códigos dentro do repeat.Encerramento
Caso encontre algum erro ou não entenda algo, fique a vontade para comentar aqui.Espero que o script seja útil.
Flws...
Re: [Script] Movimento Perfeito
Faz tempo que não vejo alguém utilizar sign() aqui no fórum, uma função absurdamente útil.
O script é bem interessante por ser pequeno e fácil de entender, unica coisa que eu notei é que como é utilizado um repeat caso eu tenha que andar 48 pixels para a direita e nenhum deles estiver livre o script vai executar 48 vezes a mesma coisa mesmo sabendo que não tem como seguir em frente e isso leva a um processamento inútil. Mas é claro que os movimentos geralmente vão ter números bem menores.
Enfim, ótimo script! Vai ajudar a galera que tem problema com colisões e afins.
O script é bem interessante por ser pequeno e fácil de entender, unica coisa que eu notei é que como é utilizado um repeat caso eu tenha que andar 48 pixels para a direita e nenhum deles estiver livre o script vai executar 48 vezes a mesma coisa mesmo sabendo que não tem como seguir em frente e isso leva a um processamento inútil. Mas é claro que os movimentos geralmente vão ter números bem menores.
Enfim, ótimo script! Vai ajudar a galera que tem problema com colisões e afins.
gabrielsch- Games Ranking :
Notas recebidas : D + A + A
Data de inscrição : 06/12/2009
Reputação : 28
Número de Mensagens : 1230
Prêmios :
x 0 x 0 x 0
x 1 x 2 x 0
x 1 x 0 x 0
Re: [Script] Movimento Perfeito
fez o que prometeu willy vlw mesmo, assim que eu puder vou testá-lo ;D de primeiro eu imagine mudar o x por argument1 assim a pessoa escolhe se quer velocidade x ou y ;D s2
Tópicos semelhantes
» script de movimento estilo warcraft
» [Script]Script de conversão de formato de texto ANSI <--> UTF-8
» Sistema de movimento perfeito como aumentar speed
» [Script]Multi-movimento
» problemas com script de movimento
» [Script]Script de conversão de formato de texto ANSI <--> UTF-8
» Sistema de movimento perfeito como aumentar speed
» [Script]Multi-movimento
» problemas com script de movimento
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos