Tutorial de gravidade e movimento em rampas

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Tutorial de gravidade e movimento em rampas

Mensagem por Isaque Onix em Qua 10 Set 2014, 20:48

Título: Tutorial de gravidade  e movimento em rampas
--------------------- Versão do GM: Todas! ---------------------
--------------------- Dificuldade: Fácil ---------------------
--------------------- Requer Extensões: Não ---------------------
--------------------- Requer DLLs: Não ---------------------
----------------- Tags: Gravidade, scripts, platform, plataforma-----------------

--------------------- Tutorial Gravidade---------------------
Bom, nesse tutorial irei lhes ensinar a fazer seu próprio sistema de gravidade por scripts.
ATENÇÃO: Vou ensinar no modo physics do Game Maker Studio, mais para usar o ensinado deste tutorial sem o mesmo, basta alterar as variáveis phy_position_x e phy_position_y do script para x e y.

bom, primeiramente, crie uma room e ligue o physics com as seguintes informações:

Gravity X=0.0 Y=0.0
pixels to meters=0.100

em seguida crie um script, vamos chama-lo de gravity_init
nesse script, adicione a variavel gspeed com o valor 0 e a variavel no_chao com o valor false.
Intenda:

A variável gspeed serve para a velocidade da gravidade ou a velocidade que o objeto ira cair.
A variavel no_chao serve para ver se o objeto esta no chao, ou, em cima de algo solido.

em seguida, vamos ao movimento da gravidade.
crie um novo script, e chamaremos esse de gravity_set. Este script e um pouco mais complexo, mais vou tentar deixar bem explicado.

Ai vai o script: (vou explicar as variaveis e funçoes logo abaixo do script!)

Código:
gravity_speed=argument0
gravity_direction_=argument1
if(gravity_speed=0){gspeed=0}//se a aumento de velocidade de queda for 0, a velocidade de queda sera 0 também.
if(place_free(phy_position_x,phy_position_y+gspeed+1)){//se o espaço estiver aberto para o carácter cair
gspeed+=gravity_speed //a velocidade de queda aumenta
phy_position_x+=lengthdir_x(gspeed,gravity_direction_)//o objeto se move
phy_position_y+=lengthdir_y(gspeed,gravity_direction_)//o objeto se move
 no_chao=false//ele não esta no chão
}else{//se não.
gspeed=0 vspeed=0 //ambas as velocidades de queda sao zeradas. (para evitar erro coloquei o vspeed)
if(!place_free(phy_position_x,phy_position_y+1)){no_chao=true}}//se o espaço NÃO estiver aberto para o caracter cair, ele esta no chão
Intenda:

Para usar o script, coloque no step:
Código:
gravity_set(peso do objeto, direção da gravidade)
A variável gravity_speed, NÃO e uma variável padrão do GM:S, e armazena a aumento de velocidade da queda. (se 1, o aumento sera 1,2,3... se 2, o almento sera 2,4,6...)
A variável gravity_direction_, NÃO e uma variável padrão do GM:S, e armazena a direção em que o objeto cai. (peso)
A variável phy_position_x, e uma variável padrão do GM:S, e armazena a posição horizontal do objeto na room. (se não estiver a usar o GM:S ou no seu game maker não tiver as funções physics, troque por x.)
A variável phy_position_y, e uma variável padrão do GM:S, e armazena a posição vertical do objeto na room. (se não estiver a usar o GM:S ou nao tiver/puder usar as funções physics, troque por y.)
A função place_free(x,y), checa se a posiçao x/y esta aberta. (se nao a um objeto solido la)
ex:
Código:
if(place_free(x+2,y)){x+=2}//Checa se o espaço 2 pixels a direita esta aberto, e anda ate la.

e Pronto, para usar o sistema basta:

No Evento Create:
Código:
gravity_init()

No Evento Step:
Código:
gravity_set(1,270)

------------------ Movimento com Rampas------------------
Script:(Parte das variáveis desse script já foi explicada acima, vou explicar só oque não foi ainda.)
Código:
if(argument1>90){set=-1}//se a direçao do movimento for maior que 90, a variavel set sera igual a -1
if(argument1<90){set=+1}//se a direçao do movimento for menor que 90, a variavel set sera igual a +1

xl=lengthdir_x(argument0,argument1)//armazena o lenghtdir_x para usar em seguida
yl=lengthdir_y(argument0,argument1)//armazena o lenghtdir_y para usar em seguida

_exit=false i=0//zera as variaveis para nao aver erros
while(_exit=false){//enquento a variavel _exit for falsa
if(place_free(phy_position_x+xl,phy_position_y+yl-abs(i*set))){//se o espaço estiver aberto
phy_position_y+=yl-abs(i*set) _exit=true//diminui a posiçao y (sobe) e sai dessa checagem
}else{
if(i<25){i+=1}else{_exit=true}//se a variavel i for <25 vai almentando, se nao, sai dessa checagem.
}}
if(place_free(phy_position_x+xl,phy_position_y+yl)){phy_position_x+=xl phy_position_y+=yl}//se o espaço estiver aberto, se move

Intenda:

while(condiçao){açao}//enquanto a condiçao for verdadeira, a açao se repetira.
exemplo:
Código:
while(x<room_width){//enquanto a variavel x for menor que o tamanho horizontal da room
x+=1//o objeto se move em direçao ao fim da room
}
lenghtdir_x e lenghtdir_y: Nao vou explicar, veja o segunte tutorial e entenda: CLIQUE AQUI PARA VER!

Bom, e isso.
Peço que em caso de erros e duvidas comentem!!!

Isaque Onix

Número de Mensagens : 1597
Idade : 23
Data de inscrição : 15/08/2010
Reputação : 147
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://spyreserver.16mb.com

Voltar ao Topo Ir em baixo

Re: Tutorial de gravidade e movimento em rampas

Mensagem por Lucas Farias em Sab 08 Nov 2014, 16:17

eu alterei as variáveis phy_position_x e phy_position_y do script para x e y. nervoso
e aparece essa mensagem na tela
era pra criar no "obj do play??" scratch


Lucas Farias

Ranking : Nota C
Número de Mensagens : 35
Data de inscrição : 01/08/2014
Notas recebidas : C
Reputação : 9
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 1
   : 1

Voltar ao Topo Ir em baixo

Re: Tutorial de gravidade e movimento em rampas

Mensagem por Isaque Onix em Ter 11 Nov 2014, 01:23

olá meu caro, você criou os scripts corretamente? de acordo com o tuto?
se acha que não, aqui estão eles:

Código:
//NOME: gravity_init()
gspeed=0
no_chao=false

Código:
//NOME: gravity_set(1,270)
gravity_speed=argument0
gravity_direction_=argument1
if(gravity_speed=0){gspeed=0}//se a aumento de velocidade de queda for 0, a velocidade de queda sera 0 também.
if(place_free(phy_position_x,phy_position_y+gspeed+1)){//se o espaço estiver aberto para o carácter cair
gspeed+=gravity_speed //a velocidade de queda aumenta
phy_position_x+=lengthdir_x(gspeed,gravity_direction_)//o objeto se move
phy_position_y+=lengthdir_y(gspeed,gravity_direction_)//o objeto se move
 no_chao=false//ele não esta no chão
}else{//se não.
gspeed=0 vspeed=0 //ambas as velocidades de queda sao zeradas. (para evitar erro coloquei o vspeed)
if(!place_free(phy_position_x,phy_position_y+1)){no_chao=true}}//se o espaço NÃO estiver aberto para o caracter cair, ele esta no chão
o objeto que usar estes scripts devem estar na room, coloque objetos sólidos para ver a funcionalidade.

Isaque Onix

Número de Mensagens : 1597
Idade : 23
Data de inscrição : 15/08/2010
Reputação : 147
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://spyreserver.16mb.com

Voltar ao Topo Ir em baixo

Re: Tutorial de gravidade e movimento em rampas

Mensagem por AlexBosquin em Qua 19 Nov 2014, 12:27

isaque eu gostei muito do seu codigo de gravidade pois é bem simples de se entender o conceito, mas eu achei um probleminha não sei se é proposital mas quando o objeto cai de uma altura muito grande ele meio que da uma quicadinha, tem como resolver isto?

Por hora já te dou os parabéns por ter tido o trabalho da criação do codigo s2 ;D

AlexBosquin

Ranking : Nota C
Número de Mensagens : 621
Idade : 20
Data de inscrição : 10/07/2012
Notas recebidas : C
Reputação : 35
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

http://www.craftstudios.com.br

Voltar ao Topo Ir em baixo

Re: Tutorial de gravidade e movimento em rampas

Mensagem por Isaque Onix em Qui 20 Nov 2014, 00:10

então meu caro, eu criei estes outros scripts:

create:
Código:
gspeed=0
xspeed=8
step:
Código:
if(place_free(x+lengthdir_x(gspeed+1,270),y+lengthdir_y(gspeed+1,270))){
gspeed+=1
x+=lengthdir_x(gspeed,270)
y+=lengthdir_y(gspeed,270)}else{
D=point_direction(x,y,x+lengthdir_x(gspeed+1,270),y+lengthdir_y(gspeed+1,270))
move_contact_solid(D,gspeed)
gspeed=0}

if(keyboard_check(ord('W')) && !place_free(x,y+gspeed+1)){gspeed=-16}
if(keyboard_check(ord('A'))){repeat(xspeed){if(place_free(x-1,y)){x-=1}}}
if(keyboard_check(ord('D'))){repeat(xspeed){if(place_free(x+1,y)){x+=1}}}

acho que da certo =)

Isaque Onix

Número de Mensagens : 1597
Idade : 23
Data de inscrição : 15/08/2010
Reputação : 147
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://spyreserver.16mb.com

Voltar ao Topo Ir em baixo

Re: Tutorial de gravidade e movimento em rampas

Mensagem por theguitarmester em Qui 20 Nov 2014, 08:36

Duas coisas:


::errado::   ::certo::
  intenda   - entenda




Percebo que para fazer seu código funcionar, é preciso definir o objeto como solid:
Código:
D=point_direction(x,y,x+lengthdir_x(gspeed+1,270),y+lengthdir_y(gspeed+1,270))
move_contact_solid(D,gspeed)

E ao meu ver o solid é uma função bem ruim de se usar, porque ele é uma função embutida que limita muito o seu controle pelo os objetos.
Exemplo: tente fazer uma plataforma fantasma usando o solid.



Do mais, acredito que este tutorial/scripts pode ter no fim do tópico, uma engine com o que foi feito/mostrado.

theguitarmester

Ranking : Sem avaliações
Número de Mensagens : 1908
Idade : 21
Data de inscrição : 28/02/2012
Notas recebidas : B
Reputação : 80
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 1
Prêmios
   : 2
   : 2
   : 1

http://guitarmester.no.comunidades.net/index.php?pagina=19362978

Voltar ao Topo Ir em baixo

Re: Tutorial de gravidade e movimento em rampas

Mensagem por Isaque Onix em Qui 20 Nov 2014, 13:44

theguitarmester escreveu:Duas coisas:


::errado::   ::certo::
  intenda   - entenda


Mania... mais acho que não atrapalha tanto quanto parece...



theguitarmester escreveu:

Percebo que para fazer seu código funcionar, é preciso definir o objeto como solid:
Código:
D=point_direction(x,y,x+lengthdir_x(gspeed+1,270),y+lengthdir_y(gspeed+1,270))
move_contact_solid(D,gspeed)

E ao meu ver o solid é uma função bem ruim de se usar, porque ele é uma função embutida que limita muito o seu controle pelo os objetos.
Exemplo: tente fazer uma plataforma fantasma usando o solid.

meu caro, não me leve a mal, mais o solid é uma função muito util, e ajuda mais ainda a obter controle sobre os objetos... a final, a função não seria criada e testada atoa né tongue  mais... desafio aceito!

ENGINE

a engine contem:

2 sprites: um branco e um preto...
6 objetos:
object0: seria o player, as funções que coloquei aqui estão nele.
Solid_fixed: o objeto solido sem ação.
Solid_Fantasma: plataforma fantasma.
Solid_moving_h: plataforma móvel horizontal.
Solid_moving_v: plataforma móvel vertical.
Solid_fall: plataforma que "cai" quando o player passa.

theguitarmester escreveu:
Do mais, acredito que este tutorial/scripts pode ter no fim do tópico, uma engine com o que foi feito/mostrado.
FEITO. té mais... feliz2

INTENDA hehehe

[edit]
e da pra mudar o move_contact_solid para move_contact_all ou até mesmo tirar este codigo, ele é para evitar que o personagem de aquele pulinho ao cair...

Isaque Onix

Número de Mensagens : 1597
Idade : 23
Data de inscrição : 15/08/2010
Reputação : 147
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://spyreserver.16mb.com

Voltar ao Topo Ir em baixo

Re: Tutorial de gravidade e movimento em rampas

Mensagem por Riccardoric em Qua 10 Dez 2014, 18:17

Isaque se a gravity_speed e gravity_direction não existe no gms, ou melhor, não são padrão, como que eu vou fazer? Se eu to trabalhando no gms? Vou ter que criar a variavel e dar a função? To confuso scratch

Riccardoric

Número de Mensagens : 206
Idade : 17
Data de inscrição : 17/06/2014
Reputação : 34
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Tutorial de gravidade e movimento em rampas

Mensagem por Isaque Onix em Qua 10 Dez 2014, 19:19

Riccardoric escreveu:Isaque se a gravity_speed e gravity_direction não existe no gms, ou melhor, não são padrão, como que eu vou fazer? Se eu to trabalhando no gms? Vou ter que criar a variavel e dar a função? To confuso scratch

meu amigo, estou sem tempo pra testar, mais tente o outro codigo.

Isaque Onix

Número de Mensagens : 1597
Idade : 23
Data de inscrição : 15/08/2010
Reputação : 147
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://spyreserver.16mb.com

Voltar ao Topo Ir em baixo

Re: Tutorial de gravidade e movimento em rampas

Mensagem por Riccardoric em Qua 10 Dez 2014, 20:35

"------------------ Movimento com Rampas------------------
Script:(Parte das variáveis desse script já foi explicada acima, vou explicar só oque não foi ainda.)
CÓDIGO:
if(argument1>90){set=-1}//se a direçao do movimento for maior que 90, a variavel set sera igual a -1
if(argument1<90){set=+1}//se a direçao do movimento for menor que 90, a variavel set sera igual a +1

xl=lengthdir_x(argument0,argument1)//armazena o lenghtdir_x para usar em seguida
yl=lengthdir_y(argument0,argument1)//armazena o lenghtdir_y para usar em seguida

_exit=false i=0//zera as variaveis para nao aver erros
while(_exit=false){//enquento a variavel _exit for falsa
if(place_free(phy_position_x+xl,phy_position_y+yl-abs(i*set))){//se o espaço estiver aberto
phy_position_y+=yl-abs(i*set) _exit=true//diminui a posiçao y (sobe) e sai dessa checagem
}else{
if(i<25){i+=1}else{_exit=true}//se a variavel i for <25 vai almentando, se nao, sai dessa checagem.
}}
if(place_free(phy_position_x+xl,phy_position_y+yl)){phy_position_x+=xl phy_position_y+=yl}//se o espaço estiver aberto, se move "
Esse ? se for esse n precisa do primeiro?

Riccardoric

Número de Mensagens : 206
Idade : 17
Data de inscrição : 17/06/2014
Reputação : 34
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Tutorial de gravidade e movimento em rampas

Mensagem por Isaque Onix em Qua 10 Dez 2014, 20:41

este codigo ae não precisa daquelas variaveis, aquelas são para o sistema de gravidade.
pra usar este codigo ae é só criar o script e colocar os argumentos.

Isaque Onix

Número de Mensagens : 1597
Idade : 23
Data de inscrição : 15/08/2010
Reputação : 147
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://spyreserver.16mb.com

Voltar ao Topo Ir em baixo

Re: Tutorial de gravidade e movimento em rampas

Mensagem por Riccardoric em Qua 10 Dez 2014, 20:44

Ah ta entendi, vlw

Riccardoric

Número de Mensagens : 206
Idade : 17
Data de inscrição : 17/06/2014
Reputação : 34
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Tutorial de gravidade e movimento em rampas

Mensagem por Isaque Onix em Qua 10 Dez 2014, 20:50

falow.

Isaque Onix

Número de Mensagens : 1597
Idade : 23
Data de inscrição : 15/08/2010
Reputação : 147
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://spyreserver.16mb.com

Voltar ao Topo Ir em baixo

Re: Tutorial de gravidade e movimento em rampas

Mensagem por theguitarmester em Qui 11 Dez 2014, 09:37

Vi sua engine, e confirmei o que disse!


Não da para fazer uma plataforma fantasma usando o Solid. veja bem, você teve que desativar a função solid para poder passar por ela. Então, quando você a desativa, será desativado para todos objetos que estão na room, ou seja, qualquer outro inimigo ou jogador que se encontrar naquele mesmo momento, irá passar por dentro da plataforma.

Eu já sabia disse por experiência própria, quando tentei a usar para o CA(2012), em que usava no jogo o solid, e fui fazer a plataforma fantasma, e daí, quando o inimigo estava em cima dela, e o herói ia atravessá-la, o inimigo caía.
Desde então não utilizo mais o Solid, pois também já tive outros problemas com ele.




Uma coisa:
Ao menos no conceito que sei, em plataforma fantasma, você pode passar por dentro dela para subí-la, coisa que não acontece na sua engine.



Então, qual é seu argumento agora para defender o SOLID? Smile

theguitarmester

Ranking : Sem avaliações
Número de Mensagens : 1908
Idade : 21
Data de inscrição : 28/02/2012
Notas recebidas : B
Reputação : 80
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 1
Prêmios
   : 2
   : 2
   : 1

http://guitarmester.no.comunidades.net/index.php?pagina=19362978

Voltar ao Topo Ir em baixo

Re: Tutorial de gravidade e movimento em rampas

Mensagem por Isaque Onix em Qui 11 Dez 2014, 15:42

theguitarmester escreveu:Vi sua engine, e confirmei o que disse!


Não da para fazer uma plataforma fantasma usando o Solid. veja bem, você teve que desativar a função solid para poder passar por ela. Então, quando você a desativa, será desativado para todos objetos que estão na room, ou seja, qualquer outro inimigo ou jogador que se encontrar naquele mesmo momento, irá passar por dentro da plataforma.

Eu já sabia disse por experiência própria, quando tentei a usar para o CA(2012), em que usava no jogo o solid, e fui fazer a plataforma fantasma, e daí, quando o inimigo estava em cima dela, e o herói ia atravessá-la, o inimigo caía.
Desde então não utilizo mais o Solid, pois também já tive outros problemas com ele.




Uma coisa:
Ao menos no conceito que sei, em plataforma fantasma, você pode passar por dentro dela para subí-la, coisa que não acontece na sua engine.



Então, qual é seu argumento agora para defender o SOLID? Smile
cara, inteligencia artificial não pode "seguir" o player se tratando de programação... ja fiz jogos complexos (de zoeira) em que o inimigo pula se não tiver espaço pra andar, atira, joga bomba, sempre usando o solid, mas, o inimigo não desce pela plataforma fantasma, logo, a checagem dele não é "if(place_free(..." ele simplesmente cai até encontrar o objeto desejado ;)

e posso fazer subir tambem, nem é tão dificil.

Engine atualizada, espero que a pirraça acabe aki Very Happy Happy
DOWNLOAD

a inteligencia artificial tem alguns erros, mais só coloquei aí pra verem como funciona.

Isaque Onix

Número de Mensagens : 1597
Idade : 23
Data de inscrição : 15/08/2010
Reputação : 147
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://spyreserver.16mb.com

Voltar ao Topo Ir em baixo

Re: Tutorial de gravidade e movimento em rampas

Mensagem por theguitarmester em Qui 11 Dez 2014, 20:35

Bom, mas tem o problema que se tu colocar qualquer coisa no evento de colisão com algum solido, ele não poderá passar através da mascara dele, ao menos que ele esteja com o solid em zero.


Eu gosto de usar as mesmas colisões do jogador ao inimigo(não os mesmos códigos, mas parecido).

theguitarmester

Ranking : Sem avaliações
Número de Mensagens : 1908
Idade : 21
Data de inscrição : 28/02/2012
Notas recebidas : B
Reputação : 80
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 1
Prêmios
   : 2
   : 2
   : 1

http://guitarmester.no.comunidades.net/index.php?pagina=19362978

Voltar ao Topo Ir em baixo

Re: Tutorial de gravidade e movimento em rampas

Mensagem por Isaque Onix em Qui 11 Dez 2014, 21:29

colisão não funciona só com objetos solidos ¬¬'

Isaque Onix

Número de Mensagens : 1597
Idade : 23
Data de inscrição : 15/08/2010
Reputação : 147
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://spyreserver.16mb.com

Voltar ao Topo Ir em baixo

Re: Tutorial de gravidade e movimento em rampas

Mensagem por Conteúdo patrocinado Hoje à(s) 08:32


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

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