Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: yottaomi en Marzo 13, 2018, 02:13:52 PM

Título: [SOLUCIONADO] Objetos solapados
Publicado por: yottaomi en Marzo 13, 2018, 02:13:52 PM
Hola.

La pregunta es breve. Y es que al moverse el objeto principal hacia un objeto muro (obj_wall), ambos quedan solapados y no puedo mover el objeto principal a ninguno de los lados. ¿Cuál es el problema?

El código de movimiento es este:

key_right   =   keyboard_check(vk_numpad6);
key_left    =   keyboard_check(vk_numpad4);

//Movimiento horizontal
//Derecha
if key_right
{   
    if  hspeed < 8
    {
        hspeed += 0.5;
    }
}
if key_right = 0
{
    if hspeed > 0
    {
        hspeed -= 0.5;
    }
}

//Izquierda   
if key_left
{
    if hspeed > -8
    {
        hspeed -= 0.5;
    }
}
if key_left = 0
{
    if hspeed < 0
    {
        hspeed += 0.5
    }
}


Y aquí el de colisión horizontal:

wall        =   place_meeting(x+hspeed,y,obj_wall);

if wall
{
    while(!place_meeting(x,y+sign(vspeed),obj_wall))
    {
        y += sign(vspeed);
    }
    vspeed = 0;
}
Con este código el juego se cuelga.

E incluso traté de poner uno mucho más simple para el movimiento:

if key_right {hspeed = 8;}
if key_left   {hspeed = 8;}
if key_right and key_left = 0 {hspeed = 0;}

Y para la colisión:

if wall
{
hspeed=0;
}

Pero con este ocurre que aunque no se cuelga, el objeto se queda unido también a la pared.


Las mascaras del sprite principal y el del objeto pared están en automático y preciso.

El cambio de imagen o de sprite no tienen que ver con el problema ya que de momento deje en exclusiva el sprite en parado, el cual solo tiene una imagen.


Como ya pregunté, ¿donde está el problema?

Título: Re:Objetos solapados
Publicado por: 3dgeminis en Marzo 13, 2018, 06:52:21 PM
En este codigo estas mezclando lo horizontal con lo vertical
[gml]
wall        =   place_meeting(x+hspeed,y,obj_wall);

if wall
{
    while(!place_meeting(x,y+sign(vspeed),obj_wall))
    {
        y += sign(vspeed);
    }
    vspeed = 0;
}
[/gml]
cuando deberia ser asi
[gml]
wall        =   place_meeting(x+hspeed,y,obj_wall);

if wall
{
    while(!place_meeting(x+sign(hspeed),y,obj_wall))
    {
        x += sign(hspeed);
    }
    hspeed = 0;
}
[/gml]
Título: Re:Objetos solapados
Publicado por: yottaomi en Marzo 14, 2018, 11:16:08 AM
Gracias. Ya solucioné ese error.
Pero de todos modos sigue pasando lo mismo, con el código corregido, por supuesto.

No quiero ser molesto, pero por si acaso influye en el error otra parte del código, mostraré todo el código que he escrito para el objeto principal (obj_mov) incluyendo movimiento y colisión vertical:

///Movimiento

key_right   =   keyboard_check(vk_numpad6);
key_left    =   keyboard_check(vk_numpad4);
key_jump    =   keyboard_check(vk_space);

ground      =   place_meeting(x,y+vspeed,obj_ground);
wall        =   place_meeting(x+hspeed,y,obj_wall);


//Movimiento horizontal
if key_right
{   
    if  hspeed < 8
    {
        hspeed += 0.5;
    }
}
if key_right = 0
{
    if hspeed > 0
    {
        hspeed -= 0.5;
    }
}
   
if key_left
{
    if hspeed > -8
    {
        hspeed -= 0.5;
    }
}
if key_left = 0
{
    if hspeed < 0
    {
        hspeed += 0.5
    }
}


//Colisión horizontal

if wall
{
    while(!place_meeting(x+sign(hspeed),y,obj_wall))
    {
        x += sign(hspeed);
    }
    hspeed = 0;
}


//Movimiento y colisión vertical

if (keyboard_check_released(vk_space) and vspeed<0)
{
vspeed = 0;
}


if ground
{
    gravity = 0;
    while(!place_meeting(x,y+sign(vspeed),obj_ground))
    {
        y += sign(vspeed);
    }
    vspeed = 0;
}
else
{
    gravity = 1;
}

if (ground and key_jump)
{
    vspeed = -16;
}

Esto es todo lo que está escrito en el juego.
Título: Re:Objetos solapados
Publicado por: 3dgeminis en Marzo 15, 2018, 06:50:46 PM
Usar las funciones que trae game maker como speed y gravity puede traer algunos problemas pero se pueden resolver de alguna manera. Te paso el codigo de como lo hice, utilizando solo un objeto para las colisiones:
[gml]
///STEP
///Movimiento ///////////////////////////////////////////////////////////////
key_right   =   keyboard_check(vk_numpad6);
key_left    =   keyboard_check(vk_numpad4);
key_jump    =   keyboard_check(vk_space);

/////////////////////////////////////////////////////////////////
if key_right {if  hspeed < 8 {hspeed += 0.5;}}
if key_right = 0 {if hspeed > 0 {hspeed -= 0.5;}}
   
if key_left {if hspeed > -8 {hspeed -= 0.5;}}
if key_left = 0 {if hspeed < 0 {hspeed += 0.5}}

if (key_jump and place_meeting(x,y+1,obj_wall)) {vspeed = -16;}
if (keyboard_check_released(vk_space) and vspeed<0) {vspeed = 0;}

/////////////////////////////////////////////////////////////////////

if place_meeting(x,y+1,obj_wall) {gravity=0} else {gravity=1} ///Gravedad

///Colision horizontal
if place_meeting(x+hspeed,y,obj_wall)
   {
    while !place_meeting(x+sign(hspeed),y,obj_wall) {x+=sign(hspeed)}
    hspeed=0
   }

///COLLISION EVENT (obj_wall)
y=yprevious
while !place_meeting(x,y+sign(vspeed),other) {y+=sign(vspeed)}
vspeed=0
[/gml]
Título: Re:Objetos solapados
Publicado por: yottaomi en Marzo 17, 2018, 11:45:12 AM
De acuerdo. Todo funciona bien.

Muchas gracias.