Bueno, como está escrito en el título, tengo un pequeño problema el cual me gustaría que me ayudasen. Cada vez que ejecuto el juego el personaje solo se va a un lado con la tecla que presiono y al llegar a una pared simplemente ya no puede moverse, presiono todas las teclas y no pasa nada. Me gustaría que me ayudaran, quizás alguno de ustedes ya haya tenido el mismo problema, les paso el código para que vean si hay un error o algo:
if keyboard_check(vk_right) && place_free(x+1,y)
{
direction = 0;
speed = v;
}
if keyboard_check(vk_up) && place_free(x,y-1)
{
direction = 90;
speed = v;
}
if keyboard_check(vk_left) && place_free(x-1,y)
{
direction = 180;
speed = v;
}
if keyboard_check(vk_down) && place_free(x,y+1)
{
direction = 270;
speed = v;
}
//Rapidez de los frames
if speed > 0
{
image_speed = 1;
}
else {
image_speed = 0;
image_index = 0;
}
switch(direction)
{
case 0:
sprite_index = player_right;
break;
case 90:
sprite_index = player_up;
break;
case 270:
sprite_index = player_down;
break;
case 180:
sprite_index = player_left;
break;
}
Hola, gusto en salidarlo...
Cambia el numero uno "1" por la letra v. En tu script estas usando la letra v para definir velocidad y posiblemente la velocidad de movimiento sea mayor que uno, por lo tanto la distancia de colision no debería se uno sinó que debería ser mayor que la velocidad o igual.
Te quedaría algo como esto:
if keyboard_check(vk_right) && place_free(x+v,y)
{
direction = 0;
speed = v;
}
if keyboard_check(vk_up) && place_free(x,y-v)
{
direction = 90;
speed = v;
}
if keyboard_check(vk_left) && place_free(x-v,y)
{
direction = 180;
speed = v;
}
if keyboard_check(vk_down) && place_free(x,y+v)
{
direction = 270;
speed = v;
}
Para moverte diagonalmente puedes sumarle o restarle 45 grados a las direcciones, dependiendo de la tecla que se presione, ejemplo:
if keyboard_check(vk_right) && place_free(x+v,y)
{
direction = 0;
if (keyboard_check(vk_up)) {diection=direction+45}
speed = v;
}
yo le recomendaría que usara place_meeting en lugar de place_free
si quiere usar place_meeting el movimiento de su personaje y colisión contra objetos se vería algo parecido a esto:
EJEMPLO
[gml]
//objeto jugador EVENTO CREATE:
movspd = 180/room_speed;
vsp = 0;
hsp = 0;
//objeto jugador EVENTO STEP:
var movUp,movLeft,movDown,movRight,Hor,Ver,halveMov;
movUp = keyboard_check(vk_up);
movLeft = keyboard_check(vk_left);
movDown = keyboard_check(vk_down);
movRight = keyboard_check(vk_right);
//INICIAR MOVIMIENTO VERTICAL
if(movUp && !movDown){Ver =-1;}
else if(movDown && !movUp){Ver = 1;}
else{Ver = 0;}
//INICIAR MOVIMIENTO HORIZONTAL
if(movLeft && !movRight){Hor =-1;}
else if(movRight && !movLeft){Hor = 1;}
else{Hor = 0;}
//LIMITAR VELOCIDAD DIAGONAL A LA MITAD SI QUIERE
if(Hor!=0 && Ver!=0){halveMov = 1.3;}
else{halveMov = 1;}
hsp = Hor*movspd/halveMov;
vsp = Ver*movspd/halveMov;
//COLISION HORIZONTAL
if(!place_meeting(x+sign(hsp),y,objWall)){x += hsp;}
else{hsp = 0;}
//COLISION VERTICAL
if(!place_meeting(x,y+sign(vsp),objWall)){y += vsp;}
else{vsp = 0;}
[/gml]
si le interesa un tutorial sobre movimiento de 8 direcciones puede descargar mi ejemplo aunque es para la version 1.4 de Game Maker Studio
https://drive.google.com/file/d/1o7yEXlqmwn5-wLUs-LIMTgELfMtuSeoI/view
es una boludez lo que voy a decir pero le pusiste mascara al personaje?