Noticias

¡Ayuda a la Comunidad GM, haz una donación!

* Sponsor

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: Problemas con el movimiento con un juego sencillo  (Leído 426 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado norahc

  • Visitante
  • *
  • Puntos: 4
  • Mensajes: 1
    • Ver Perfil
en: Septiembre 19, 2021, 04:57:22 am
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;
}






 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado dixon

Respuesta #1 en: Septiembre 19, 2021, 08:27:24 am
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:

Código: [Seleccionar]
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:

Código: [Seleccionar]
if keyboard_check(vk_right) && place_free(x+v,y)
{
direction = 0;
if (keyboard_check(vk_up)) {diection=direction+45}
speed = v;
}
« Última modificación: Septiembre 19, 2021, 08:43:55 am por dixon »

Si Dios quiere; Limpiaré la oficina, puliré el piso y les serviré café a todos, luego, me enseñarán a programar e iré a comprarles más café.
 


Desconectado Jeffrey Faper

Respuesta #2 en: Octubre 08, 2021, 09:29:55 pm
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
//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;}
   
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
« Última modificación: Octubre 08, 2021, 09:50:14 pm por Jeffrey Faper »

 


 


Warning: Parameter 1 to spoiler_buffer() expected to be a reference, value given in Unknown on line 0

Warning: Parameter 1 to custom_report_ob() expected to be a reference, value given in Unknown on line 0