Obrigado por visitar a The Game Makers Brasil |
Duvida Mecânica Top and Down
Duvida Mecânica Top and Down
Estou estudando a Mecânica de uma engine top-and-down no Game maker, e queria saber como faço para que o personagem mesmo encostado na parede (Objeto Solido), se mova conforme a direção pressionada .
EX: Se eu estiver apertando para cima e encostar na parede, e sem tirar o dedo do botão que vai para cima e apertar para direita, que o boneco vá para direita encostado na parede !
No meu código, o boneco para se estiver encostado na parede quando aperto os dois botões juntos, só quando salto os botões e pressiono para direita sem apertar para cima ele move.
Meio confuso mais e isso ae =D
Código Movimentação e colisão :
esq = keyboard_check(ord("A"));
dir = keyboard_check(ord("D"));
cima = keyboard_check(ord("W"));
baixo = keyboard_check(ord("S"));
hsp = -esq + dir;
vsp = -cima + baixo;
//Horizontal collison
if(place_meeting(x+sign(hsp),y,obj_wall)){
while(!place_meeting(x+sign(hsp),y,obj_wall)){
hsp += sign(hsp);
}
hsp = 0;
}
//Tentativa de fazer ele se mover mesmo encostando na parede!
if(cima && dir && place_meeting(x,y-vsp,obj_wall)){
hsp += dir;
}
x += hsp * movespeed;
//Vertical Collison
if(place_meeting(x,y+sign(vsp),obj_wall)){
while(!place_meeting(x,y+sign(vsp),obj_wall)){
vsp += +sign(vsp);
}
vsp = 0;
}
y += vsp * movespeed;
EX: Se eu estiver apertando para cima e encostar na parede, e sem tirar o dedo do botão que vai para cima e apertar para direita, que o boneco vá para direita encostado na parede !
No meu código, o boneco para se estiver encostado na parede quando aperto os dois botões juntos, só quando salto os botões e pressiono para direita sem apertar para cima ele move.
Meio confuso mais e isso ae =D
Código Movimentação e colisão :
esq = keyboard_check(ord("A"));
dir = keyboard_check(ord("D"));
cima = keyboard_check(ord("W"));
baixo = keyboard_check(ord("S"));
hsp = -esq + dir;
vsp = -cima + baixo;
//Horizontal collison
if(place_meeting(x+sign(hsp),y,obj_wall)){
while(!place_meeting(x+sign(hsp),y,obj_wall)){
hsp += sign(hsp);
}
hsp = 0;
}
//Tentativa de fazer ele se mover mesmo encostando na parede!
if(cima && dir && place_meeting(x,y-vsp,obj_wall)){
hsp += dir;
}
x += hsp * movespeed;
//Vertical Collison
if(place_meeting(x,y+sign(vsp),obj_wall)){
while(!place_meeting(x,y+sign(vsp),obj_wall)){
vsp += +sign(vsp);
}
vsp = 0;
}
y += vsp * movespeed;
- Rodrigo Santiago
- Colaborador
- Reações: 0
- Mensagens: 273
-
Re: Duvida Mecânica Top and Down
Acho que você errou um pouco na logica( na verdade eu nao entendi o hsp e vsp = 0 depois do loop
veja só como deve ficar :
Só o fato de separar x e y já faz deslizar!

Código: Selecionar todos
esq = keyboard_check(ord("A"));
dir = keyboard_check(ord("D"));
cima = keyboard_check(ord("W"));
baixo = keyboard_check(ord("S"));
hsp = dir - esq;
vsp = baixo - cima;
//Horizontal collison
if(place_meeting(x+sign(hsp),y,obj_wall)){
hsp = 0;
while(!place_meeting(x+sign(hsp),y,obj_wall)){
hsp += sign(hsp);
}
}
x += hsp * movespeed;
//Vertical Collison
if(place_meeting(x,y+sign(vsp),obj_wall)){
vsp = 0;
while(!place_meeting(x,y+sign(vsp),obj_wall)){
vsp += +sign(vsp);
}
}
y += vsp * movespeed;
Re: Duvida Mecânica Top and Down
Obrigado Rodrigo, vou testar =D
Então Rodrigo o hsp = 0 e vsp = 0 e quando o boneco colidir com a parede ele não vai se mover ,"não atravessar" vamos dizer assim
Então Rodrigo o hsp = 0 e vsp = 0 e quando o boneco colidir com a parede ele não vai se mover ,"não atravessar" vamos dizer assim
- Rodrigo Santiago
- Colaborador
- Reações: 0
- Mensagens: 273
-
Re: Duvida Mecânica Top and Down
Ar k veja só :
while(!place_meeting(x,y+sign(vsp),obj_wall)){
vsp += +sign(vsp);
}
vsp = 0;
Essa parte ai do codigo não faz sentido, vsp SEMPRE será 0 o while ai é totalmente inutil .
Alias, acabei de achar um erro lógico o código deve ser o seguinte :
while(!place_meeting(x,y+sign(vsp),obj_wall)){
vsp += +sign(vsp);
}
vsp = 0;
Essa parte ai do codigo não faz sentido, vsp SEMPRE será 0 o while ai é totalmente inutil .

Alias, acabei de achar um erro lógico o código deve ser o seguinte :
Código: Selecionar todos
esq = keyboard_check(ord("A"));
dir = keyboard_check(ord("D"));
cima = keyboard_check(ord("W"));
baixo = keyboard_check(ord("S"));
hsp = (dir - esq)*movespeed;
vsp = (baixo - cima)*movespeed;
//Horizontal collison
if(place_meeting(x+sign(hsp),y,obj_wall)){
hsp = 0;
while(!place_meeting(x+sign(hsp),y,obj_wall)){
hsp += sign(hsp);
}
}
x += hsp;
//Vertical Collison
if(place_meeting(x,y+sign(vsp),obj_wall)){
vsp = 0;
while(!place_meeting(x,y+sign(vsp),obj_wall)){
vsp += +sign(vsp);
}
}
y += vsp;
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 12 visitantes