Buenas a todos!

Necesito una mano con mi código en un juego que estoy programando, ya que me esta dando demasiados problemas.

Estoy trabajando en un juego 2d de plataformas.
Intento programar un ataque cuerpo a cuerpo con una cuchilla al usar la tecla K, pero no tan simple.

Lo que quiero lograr es, que al mantener presionada la tecla K, el personaje muestre que tiene una cuchilla en su mano
(y puedas moverte libremente con ella en la mano) pero, al momento de soltar la tecla K, este realice un corte hacia
adelante y al terminar la animación, la esconda.

Para ser mas específicos, la mano con la cuchilla es un objeto distinto del personaje. Se que si quiero que este objeto
(la mano con el cuchillo) permanezca oculto, tengo que esconderlo por default... Y mostrarlo al presionar la tecla K
(obviamente, debo hacer que la mano con el cuchillo siga al personaje estando encima de este, para que parezca
que forma parte del mismo sprite del personaje aunque no sea así) y luego, al soltarla hacer la animacion del corte
para volver a ocultarse (el objeto de la mano con cuchillo) al terminar la animacion.

Obviamente, ya tengo todos los sprites dibujados.
Lo que estoy usando al principio del codigo de este objeto es...

keyAttack          = keyboard_check_pressed(ord("K"));        //Comprueba si la tecla K esta siendo presionada
keyAttackRelease   = keyboard_check_released(ord("K"));       //Comprueba si se dejo de presionar la tecla K

Pero, tengo muchos problemas como por ejemplo, no logro que la mano siga al personaje al mantener la tecla K,
este objeto simplemente se queda fijo en la ultima posicion donde estuvo el personaje cuando fue llamada.
Y tampoco logro que la animacion funcione correctamente al soltar la tecla K, son 3 sprites los del objeto de
la mano con el cuchillo.
He intentado de todo y me tiene super cansado. Agradecería que puedan ayudarme con esto.

Muchas gracias!

Cita de: Dager en Marzo 21, 2020, 09:58:14 AM
Buenas a todos!

Necesito una mano con mi código en un juego que estoy programando, ya que me esta dando demasiados problemas.

Estoy trabajando en un juego 2d de plataformas.
Intento programar un ataque cuerpo a cuerpo con una cuchilla al usar la tecla K, pero no tan simple.

Lo que quiero lograr es, que al mantener presionada la tecla K, el personaje muestre que tiene una cuchilla en su mano
(y puedas moverte libremente con ella en la mano) pero, al momento de soltar la tecla K, este realice un corte hacia
adelante y al terminar la animación, la esconda.

Para ser mas específicos, la mano con la cuchilla es un objeto distinto del personaje. Se que si quiero que este objeto
(la mano con el cuchillo) permanezca oculto, tengo que esconderlo por default... Y mostrarlo al presionar la tecla K
(obviamente, debo hacer que la mano con el cuchillo siga al personaje estando encima de este, para que parezca
que forma parte del mismo sprite del personaje aunque no sea así) y luego, al soltarla hacer la animacion del corte
para volver a ocultarse (el objeto de la mano con cuchillo) al terminar la animacion.

Obviamente, ya tengo todos los sprites dibujados.
Lo que estoy usando al principio del codigo de este objeto es...

keyAttack          = keyboard_check_pressed(ord("K"));        //Comprueba si la tecla K esta siendo presionada
keyAttackRelease   = keyboard_check_released(ord("K"));       //Comprueba si se dejo de presionar la tecla K

Pero, tengo muchos problemas como por ejemplo, no logro que la mano siga al personaje al mantener la tecla K,
este objeto simplemente se queda fijo en la ultima posicion donde estuvo el personaje cuando fue llamada.
Y tampoco logro que la animacion funcione correctamente al soltar la tecla K, son 3 sprites los del objeto de
la mano con el cuchillo.
He intentado de todo y me tiene super cansado. Agradecería que puedan ayudarme con esto.

Muchas gracias!

Ya que ando por aquí, mientras que alguien que sepa te responde, mírate este vídeo que quizá te interese:

https://www.youtube.com/watch?v=U-7Jqy-mIfE

#2 Marzo 22, 2020, 03:47:30 AM Ultima modificación: Marzo 24, 2020, 12:09:38 AM por BssString
Hola Dager

En el "Step End Event" del Objeto cuchillo.
[gml]x = obj_player.x
y = obj_player.y + 20[/gml]
Ese código hará que el objeto "cuchillo" se mueva a la posición de mi objeto "obj_player", pero 20 pixeles hacia abajo (tú ponle como hayas llamado a tu objeto y en la coordenada respectiva según el tamaño de tus sprites y los puntos de origenes)

Si dices que la animación de ataque con el cuchillo tiene 3 sprites, al crearlo debes hacer que la animación no se ejecute hasta que sueltas la tecla "K".
En el "Create Event" del Objeto cuchillo:
[gml]image_speed = 0 //Esto evita que la animación se dibuje[/gml]

Hace que el ataque se ejecute al soltar la tecla.
En el "Step Event" normal del Objeto cuchillo, coloca:
[gml]if keyboard_check_release(ord("K")) {
image_speed = 1 //Esto reactiva la animación. Si la animación va muy rápido, en vez de 1, ponle una velocidad más lenta, ej: 0.25, eso hará que la animación avance 1 sub-imagen cada 4 steps.
}[/gml]

En el evento "End Animation" del Objeto cuchillo (que está en other), ponle que haga daño a los enemigos y una alarma que desaparezca la mano con cierto delay.
ejemplo:
[gml]if image_speed != 0 { //Esta condición hace que el ciclo de animación no se repita y el tiempo de la Alarma se ejecute sólo 1 vez.
image_speed = 0 //Cuando termina la animación, esta línea frena nuevamente la animación hasta que la mano desaparece
alarm[0] = 6 //Esto activa una alarma en 6 Steps para poder eliminar la mano.
}[/gml]

en "Alarm[0]" del Objeto cuchillo, después de que pasan esos 6 Steps:
[gml]instance_destroy() //Elimina la mano con el cuchillo cuando se activa la alarma 0[/gml]

Está de más decir que el player NO puede crear otro cuchillo hasta que el primero desaparezca, añade una condición para revisar si el objeto ya existe antes de crearlo
En el Step Event del Personaje
[gml]if keyboard_check_pressed(ord("K")) && !instance_exists(obj_cuchillo) { instance_create(x,y,obj_cuchillo) }[/gml]

Saludos

Cita de: BssString en Marzo 22, 2020, 03:47:30 AM
Hola Dager

En el "Step End Event" del Objeto cuchillo.
[gml]x = obj_player.x
y = obj_player.y + 20[/gml]
Ese código hará que el objeto "cuchillo" se mueva a la posición de mi objeto "obj_player", pero 20 pixeles hacia abajo (tú ponle como hayas llamado a tu objeto y en la coordenada respectiva según el tamaño de tus sprites y los puntos de origenes)

Si dices que la animación de ataque con el cuchillo tiene 3 sprites, al crearlo debes hacer que la animación no se ejecute hasta que sueltas la tecla "K".
En el "Create Event" del Objeto cuchillo:
[gml]image_speed = 0 //Esto evita que la animación se dibuje[/gml]

Hace que el ataque se ejecute al soltar la tecla.
En el "Step Event" normal del Objeto cuchillo, coloca:
[gml]if keyboard_check_release(ord("K")) {
image_speed = 1 //Esto reactiva la animación. Si la animación va muy rápido, en vez de 1, ponle una velocidad más lenta, ej: 0.25, eso hará que la animación avance 1 sub-imagen cada 4 steps.
}[/gml]

En el evento "End Animation" del Objeto cuchillo (que está en other), ponle que haga daño a los enemigos y una alarma que desaparezca la mano con cierto delay.
ejemplo:
if image_speed != 0 { //Esta condición hace que el ciclo de animación no se repita y el tiempo de la Alarma se ejecute sólo 1 vez.
image_speed = 0 //Cuando termina la animación, esta línea frena nuevamente la animación hasta que la mano desaparece
alarm[0] = 6 //Esto activa una alarma en 6 Steps para poder eliminar la mano.
}


en "Alarm[0]" del Objeto cuchillo, después de que pasan esos 6 Steps:
[gml]instance_destroy() //Elimina la mano con el cuchillo cuando se activa la alarma 0[/gml]

Está de más decir que el player NO puede crear otro cuchillo hasta que el primero desaparezca, añade una condición para revisar si el objeto ya existe antes de crearlo
En el Step Event del Personaje
[gml]if keyboard_check_pressed(ord("K")) && !instance_exists(obj_cuchillo) { instance_create(x,y,obj_cuchillo) }[/gml]

Saludos

Muchas gracias! Por responder y por haber solucionado una parte de todos los problemas y bugs que estoy teniendo con la creación de mi
"primer videojuego" intentando no abandonar el proyecto xD.

Los codigos que enviaste han funcionado correctamente! Eres un genio.

Que bien que te haya funcionado. Éxito solucionando el resto de problemas.

Saludos