Hola, gusto en saludarles.
Código a analizar:
De existir un obejto llamado "owall" a una distancia de vsp entonces:
mientras no exista el objeto "owall" a una distancia de un pixel
Sumarle a su posición Y un pixel
La velocidad debe volverse cero
En otras palabras:
Si el player se encuentra verticalmente cerca de un objeto "owall" acércalo a él y vuelve su velocidad cero.
Otras palabras
Si el player tiene un objeto cerca de sus pies, acércalo a él hasta encontrar el objeto.
En otras palabras:
Si el player está a punto de tocar el suelo, que se pegue al suelo y se vuelva la velocidad cero.
Este código al parecer funciona también con las colisiones con el techo, porque está tomando el signo de la vspeed. Por lo tanto está diciendo
Si el objeto player está saltando y sobre su cabeza se encuentra un techo entonces pégalo al techo pero detén la velocidad.
Este código se esta usando para corregir las colisiones verticales y evitar dos cosas:
1. Evitar que el player traspase los objetos "owall"
2. Evitar que la colisión vertical con los objetos "owall" se vea mal.
El código está correcto y funciona como un imán magnético. Donde el objeto owall atrae con su magnetismo al player, pero esto no quiere decir que se va a quedar pegado sino que antes que el player colisione con el objeto owall se va a pegar a el y su velocidad será cero.
1. El código no hace nada si la distancia es superior a la vsp: Si dos objetos de distinta polaridad están muy separados no se percibirá a simple vista su atracción magnética.
2. El código funciona solo cuando el player está cerca del objeto owall: Si dos objetos magnéticos con carga distinta están cerca entonces existirá atracción magnética.
¿Por qué el código es así?
Cuando colisionamos con un objeto solo necesitamos decirle al player que su velocidad sea cero pero esto no se ve bien porque queda una distancia entre el suelo y el player, entonces surge este código para corregir la distancia.
Código sin corrección de distancia: El player queda en el aire o traspasa la owall
Código corregido: el player no traspasa la owall
¿Porqué vsp y sign(vsp)?
Porque vsp normalmente es mayor que sign(vsp). La vsp es la velocidad de movimiento y también es la distancia que se recorrerá en el próximo paso. Si el objeto player está saltando la vsp será negativa y el sign(vsp) será -1. Si el player está cayendo entonces la vsp será positiva y el sign(vsp) será 1.
¿Podría presentar fallas este código?
Sí, pero solo cuando la vsp es muy alta. En ese caso el objeto player puede que no detecte el objeto owall y lo traspase. Para evitar eso se usa otro código.
Todavía hay mucho que explicar de este código pero por ahora solo dejo las imágenes:



Código a analizar:
if (place_meeting(x,y+vsp,oWall)) { while (!place_meeting(x,y+sign(vsp),oWall)) { y = y + sign(vsp); } vsp = 0; } |
if(place_meeting(x,y+vsp,owall)) { |
while (!place_meeting(x,y+sign(vsp),owall)) |
{ y=y+sign(vsp) } |
vsp=0 |
} |
En otras palabras:
Si el player se encuentra verticalmente cerca de un objeto "owall" acércalo a él y vuelve su velocidad cero.
Otras palabras
Si el player tiene un objeto cerca de sus pies, acércalo a él hasta encontrar el objeto.
En otras palabras:
Si el player está a punto de tocar el suelo, que se pegue al suelo y se vuelva la velocidad cero.
Este código al parecer funciona también con las colisiones con el techo, porque está tomando el signo de la vspeed. Por lo tanto está diciendo
Si el objeto player está saltando y sobre su cabeza se encuentra un techo entonces pégalo al techo pero detén la velocidad.
Este código se esta usando para corregir las colisiones verticales y evitar dos cosas:
1. Evitar que el player traspase los objetos "owall"
2. Evitar que la colisión vertical con los objetos "owall" se vea mal.
El código está correcto y funciona como un imán magnético. Donde el objeto owall atrae con su magnetismo al player, pero esto no quiere decir que se va a quedar pegado sino que antes que el player colisione con el objeto owall se va a pegar a el y su velocidad será cero.
1. El código no hace nada si la distancia es superior a la vsp: Si dos objetos de distinta polaridad están muy separados no se percibirá a simple vista su atracción magnética.
2. El código funciona solo cuando el player está cerca del objeto owall: Si dos objetos magnéticos con carga distinta están cerca entonces existirá atracción magnética.
¿Por qué el código es así?
Cuando colisionamos con un objeto solo necesitamos decirle al player que su velocidad sea cero pero esto no se ve bien porque queda una distancia entre el suelo y el player, entonces surge este código para corregir la distancia.
Código sin corrección de distancia: El player queda en el aire o traspasa la owall
|
Código corregido: el player no traspasa la owall
if (place_meeting(x,y+vsp,oWall)) { while (!place_meeting(x,y+sign(vsp),oWall)) { y = y + sign(vsp); } vsp = 0; } |
¿Porqué vsp y sign(vsp)?
Porque vsp normalmente es mayor que sign(vsp). La vsp es la velocidad de movimiento y también es la distancia que se recorrerá en el próximo paso. Si el objeto player está saltando la vsp será negativa y el sign(vsp) será -1. Si el player está cayendo entonces la vsp será positiva y el sign(vsp) será 1.
¿Podría presentar fallas este código?
Sí, pero solo cuando la vsp es muy alta. En ese caso el objeto player puede que no detecte el objeto owall y lo traspase. Para evitar eso se usa otro código.
Todavía hay mucho que explicar de este código pero por ahora solo dejo las imágenes:


