Hola Equipo! ante nada feliz año nuevo...
Ahora si, makeros necesito una pequeña mano...
hice un pequeño codigo para mi juego de plataformas para poder trepar de las esquinas (como lo hacia earth worm jim, the flistones ect..) es el siguiente..
en step de mi personaje
if collision_circle(x, y, 80, esquina, false, true) && place_free(x,y+5) //esquina es un objeto cuadro de 32 x32
{trepo=1}
else
{trepo=0};
if place_free(x,y+5) && trepo=1 //si estoy en el aire e hice el contacto con la esquina
{
move_contact_solid(direccion,20);
//me pego a la pared ("direccion es una variable mìa que identifica izquierda, 0 grados o derecha, 180 grados)
y=esquina.y+80;
//y me pego a la altura de la esquina
gravity = 0;
vspeed=0;
//y ya no me caigo
sprite_index = trepando;
// la imagen es ahora coeherente a la accion
};
el resultado es lo que esperaba salto y me pego a la esquina a la altura que debe ser...
pero e aquí mi problema..
cuando generé otras "esquinas" de las cuales treparme el valor "y" que devuelve es el de la primer instancia esquina que cree.. :(
¿como puedo hacer para que mi personaje tome la altura de la esquina a la cual me estoy trepando actualmente y no a la de la primera instancia que coloque en el room?,
probé con...
y=other.y+80;
peron nada ???
gracias de antemano makeros!!
crea un object objParentEsquina y coloca todas las Esquinas de parent con ese objet
y aqui collision_circle(x, y, 80, esquina, false, true) cambialo mejor por collision_rectangule y el object al que verificar es el parent osea este objParentEsquina
Malas noticias.. no pude lograrlo. Ahora si entiendo como se usa Parent.. pero el objeto hijo contiene su propia coordenada "y" y por mas que lo emparente con la esquina padre siempre va a tener diferente "y"..
expongo un gráfico para explicar mejor lo que pasa...
fíjense como en la segunda imagen el personaje trepa pero a la altura del primer bloque esquina (amarillo), checkeen el código mas arriba y ayúdenme por favoooor ! :'(
No sé si funcione, pero creo que debes hacer algo así
sujetar = collision_circle(x, y, 80, objParentEsquina, false, true)
cuando haya una colisión, la variable 'sujetar' va a contener la id de LA ESQUINA HIJA CORRECTA (con la que hiciste contacto). si no hay colisión con ninguna esquina, sujetar = número negativo..
Cuando compruebes que hay colisión con una esquina y que está en el aire, usarías algo como
with(sujetar) {
}
y dentro de los corchetes, pones el código para posicionar correctamente al personaje. Más o menos algo parecido a
obj_mi_personaje.gravity = 0
obj_mi_personaje.y = y +/- valor
donde:
obj_mi_personaje.y = la posición vertical del jugador
y = la posición vertical de la esquina HIJA con la que hay contacto
EDITO: La vspeed y el sprite del personaje también lo debes cambiar dentro de los corchetes, refiriéndote a ellos externamente, como la gravedad y la posición vertical del ejemplo
Mmm bueno, esa es mi sugeerencia, a ver si me expliqué bien. ;D
Hola Penumbra muy atento al responderme... pero no pude hacer lo que me sugeriste...tal vez no entendi del todo...
me quedo así...
sujetar = collision_circle(x, y, 80, esquina, false, true);
with (sujetar)
{
move_contact_solid(direccion,20);
y = esquina.y+80;
gravity = 0;
vspeed=0;
sprite_index = trepando;
};
cuando mi personaje salta y colisiona con la esquina pasan cosas raras...
creo que voy a encarar la pocision "y" de otra forma...
Citarcuando mi personaje salta y colisiona con la esquina pasan cosas raras...
En tu ejemplo, el código
y = esquina.y+80;
}no va a afectar a la "ye" del personaje, sino a la "ye" del objeto esquina. Además, el código que puse fue como sugerencia, no está totalmente adaptado a tu juego, pero creo que sería así.
trepo = collision_circle(x, y, 80, objParentEsquina, false, true) //el objeto que pongas aquí debe ser PARENT
if (place_free(x,y+5)) && (trepo > 0) // Si estás en el aire y hay contacto con alguna esquina HIJA
{
move_contact_solid(direccion,20); //Mover al jugador
with (trepo) //Elegir la instancia esquina correcta, 'descartar' las otras que existen en el room
{
obj_Player1.y = y + 80;
obj_Player1.gravity = 0;
obj_Player1.vspeed=0;
obj_Player1.sprite_index = trepando;
}
}
Como mencioné antes, el objeto que usas en collision_circle o collision_rectangle debe ser PARENT, no HIJO. Dentro de los corchetes, te faltó poner el nombre de tu objeto jugador. Mientras estés dentro del with, y quieres modificar propiedades del objeto jugador, tienes que usar el formato
nombre_de_objeto_jugador.variableEs decir, substituye
obj_Player1. con el nombre del objeto de tu personaje.
Citar¿como puedo hacer para que mi personaje tome la altura de la esquina a la cual me estoy trepando actualmente y no a la de la primera instancia que coloque en el room?
Al usar
with, estás "saliendo" del objeto jugador y estás "entrando al dominio" del objeto
esquina. Esa entrada a la instancia especificada por
trepo es lo que te permite elegir la esquina correcta, en lugar de que sea siempre la primera esquina que colocaste en el room.
Pero al entrar a la esquina correcta, ya no puedes llamar a las variables del jugador como lo hacías fuera del with. Es decir, la variable
gravity AHORA es la gravedad de la
esquina referenciada por
trepo. Mientras estés dentro de WITH, la gravedad del jugador se llama así obj_jugador.gravity.
Graciaaaaaaaasss.penumbra! Lo logre funcionó jaja.,te agradezco mucho eres un genio! Trepa de maravilla