Buenas querida comunidad!
Tengo un problema, pasa que quiero hacer que cuando se presione una tecla, por ejemplo (tecla "S") el personaje de un salto hacia el lado hacia donde está mirando. Como un salto de ataque solo cuando presiono esa tecla. Probé con:
[gml]
keyboard_check(ord("S"))
{
x += 200
y += 200
}
//Para que el personaje de un salto en diagonal hacia ese punto y al llegar a ese punto, caiga normal (en estado normal (reposo))
Pero cuando lo presiono, el personaje desaparece
¿Me podrían ayudar con eso?
Hola Luis En
Lamentablemente no funciona así...
Primero, la función "keyboard_check" se activa por cada step que mantienes pulsada la tecla, cuando uno pulsa y suelta una tecla, se activará el evento por al menos 5 steps, lo que manda a tu personaje a 200*5 = 1000 pixeles de distancia.
El evento correcto es "keyboard_check_pressed", eso hará que aunque mantengas apretado el botón, el código se ejecute sólo una vez.
Te recomiendo hacer los siguientes pasos:
1- Cuando pulsas S, Activa una variable llamada "salto" o "habilidad" o como quieras llamarle y activa 2 variables que indiquen la "x de destino" y la "y de destino".
2- Evita que el player se mueva libremente (incluso cancela la gravedad) si es que la variable "salto" o "habilidad" está activa.
3- El siguiente código moverá al player a la posición que indiques como destino a una velocidad "spd"
ojo: para que funcione debes haber definido antes las variables "spd, x_destino e y_destino" (tu las puedes llamar como quieras)
if salto = true { //o habilidad o como quieras
var dir = point_direction(x,y,x_destino,y_destino)
var dist = point_distance(x,y,x_destino,y_destino)
if dist < spd { x = x_destino; y = y_destino; salto = false } //desactiva la variable "salto" o "habilidad" o como la hayas llamado para que el player vuelva a moverse como lo haría normalmente
else {
x += lengthdir_x(spd,dir)
y += lengthdir_y(spd,dir)
}
}
Eso moverá al player en línea recta hacia las coordenadas de destino a una velocidad "spd".
Una vez que llegue a su destino, se desactiva la variable salto para que tu player se comporte de forma normal.
Saludos
Cita de: BssString en Agosto 24, 2018, 09:21:45 PM
Hola Luis En
Lamentablemente no funciona así...
Primero, la función "keyboard_check" se activa por cada step que mantienes pulsada la tecla, cuando uno pulsa y suelta una tecla, se activará el evento por al menos 5 steps, lo que manda a tu personaje a 200*5 = 1000 pixeles de distancia.
El evento correcto es "keyboard_check_pressed", eso hará que aunque mantengas apretado el botón, el código se ejecute sólo una vez.
Te recomiendo hacer los siguientes pasos:
1- Cuando pulsas S, Activa una variable llamada "salto" o "habilidad" o como quieras llamarle y activa 2 variables que indiquen la "x de destino" y la "y de destino".
2- Evita que el player se mueva libremente (incluso cancela la gravedad) si es que la variable "salto" o "habilidad" está activa.
3- El siguiente código moverá al player a la posición que indiques como destino a una velocidad "spd"
ojo: para que funcione debes haber definido antes las variables "spd, x_destino e y_destino" (tu las puedes llamar como quieras)
if salto = true { //o habilidad o como quieras
var dir = point_direction(x,y,x_destino,y_destino)
var dist = point_distance(x,y,x_destino,y_destino)
if dist < spd { x = x_destino; y = y_destino; salto = false } //desactiva la variable "salto" o "habilidad" o como la hayas llamado para que el player vuelva a moverse como lo haría normalmente
else {
x += lengthdir_x(spd,dir)
y += lengthdir_y(spd,dir)
}
}
Eso moverá al player en línea recta hacia las coordenadas de destino a una velocidad "spd".
Una vez que llegue a su destino, se desactiva la variable salto para que tu player se comporte de forma normal.
Saludos
Ahhhhhh! genial compa! ahora lo pruebo y te digo si me funciono! Pero no entiendo lo de "spd" es el nombre de una variable que debo crear?. Mi personaje está en el suelo y el salto lo tiene que hacer en diagonal, servirá también?
Hola
En realidad spd es para controlar la velocidad a la que llegas al destino, pero puedes simplemente colocar un número cualquiera en reemplazo
Saludos
Cita de: BssString en Agosto 25, 2018, 01:27:34 AM
Hola
En realidad spd es para controlar la velocidad a la que llegas al destino, pero puedes simplemente colocar un número cualquiera en reemplazo
Saludos
Hola bro, ahora lo estoy probando con más calma, y tengo unas dudas:
- Sobre: x_destino, y destino. Es una variable donde puedo poner por ejemplo 200, si lo que quiero es que se desplace 100 pixeles en la dirección a donde salto?
- Y sobre -> lengthdir_x(spd,dir) <- me podrías explicar que significa?
Gracias por responder a mi tema bro! Me ayudas y te pongo en los agradecimientos del juego :D
Hola Luis En
Disculpa mi mediocre explicación.
x_destino e y_destino son variables que debes definir cuando pulsas la tecla de la habilidad especial.
En tu caso, si miras a la derecha sería:
x_destino=x+200
y_destino=y-200
Si miras a la izquierda:
x_destino=x-200
y_destino=y-200
Las funciones "lengthdir_x" y "lengthdir_y" de game maker te permiten obtener la componente horizontal y vertical de un vector, le debes dar una distancia y una dirección, es para evitar utilizar funciones trigonométricas que determinen cuantos pixeles avanzas en el eje X y cuantos en el eje Y.
Saludos
Cita de: BssString en Agosto 26, 2018, 09:18:10 PM
Hola Luis En
Disculpa mi mediocre explicación.
x_destino e y_destino son variables que debes definir cuando pulsas la tecla de la habilidad especial.
En tu caso, si miras a la derecha sería:
x_destino=x+200
y_destino=y-200
Si miras a la izquierda:
x_destino=x-200
y_destino=y-200
Las funciones "lengthdir_x" y "lengthdir_y" de game maker te permiten obtener la componente horizontal y vertical de un vector, le debes dar una distancia y una dirección, es para evitar utilizar funciones trigonométricas que determinen cuantos pixeles avanzas en el eje X y cuantos en el eje Y.
Saludos
No te preocupes bro, se agradece que me brindes ayuda. Ahora estoy probandolo y cualquier cosa te digo. Por cierto, eso de quitarle la gravedad cuando se ejecute el "Jump_attack", sería en Step así:?
if jump_attack = true //Se apagará la GRAVEDAD
{
gravity_direction = 0
gravity = 0
}
Esto iría debajo de todo el código que me explicaste.
Y sobre x_destino, mi personaje al cambiar de dirección (izquierda a derecha) cambia con image_xscale, si es así ya no tendría que escribir un: x_destino para cuando salte a la derecha, y otro para que salte a la izquierda?
Hola Luis En
Exacto, aunque la dirección no es necesario hacerla cero, lo normal es que sea 270.
Tambié tienes que reactivar la gravedad cuando finalices la habilidad
if jump_attack = true { gravity = 0 }
Else { gravity = tu valor de gravedad }
Si usas image_xscale con valores -1 y 1, basta con que multipliques la image_xscale para calcular la x de destino.
x_destino=x+image_xscale*200
Así tomará el valor 200 o -200 respecto a la x del jugador y te evitas crear dos veces el código
Saludos
Cita de: BssString en Agosto 26, 2018, 10:47:17 PM
Hola Luis En
Exacto, aunque la dirección no es necesario hacerla cero, lo normal es que sea 270.
Tambié tienes que reactivar la gravedad cuando finalices la habilidad
if jump_attack = true { gravity = 0 }
Else { gravity = tu valor de gravedad }
Si usas image_xscale con valores -1 y 1, basta con que multipliques la image_xscale para calcular la x de destino.
x_destino=x+image_xscale*200
Así tomará el valor 200 o -200 respecto a la x del jugador y te evitas crear dos veces el código
Saludos
Aya! genial bro, lo acabo de probar, y me pasa esto: 1. Cuando no le cancelaba la gravedad cuando hace el jump attack, cuando presionaba "x" (que es para activarlo), solo me avanzaba unos pequeños pixeles a la derecha, pero solo horizontalmente, cada vez que presionaba "x" solo avanzaba un poquito (sin animación de caminar),2. Luego que le cancelé solo la gravedad (no gravity_direction) cuando se active "Jump attack", al presionar X se quedaba en el aire flotando, con la imagen de salto.
Mira, así lo he puesto todo:
Obj_player
//Event Create
global.jump_attack = false
x_destino = x+image_xscale*200
y_destino = 200
spd = 10
//Event Step
if (keyboard_check_pressed(ord("X")))
{
global.jump_attack = true
}
if (keyboard_check_pressed(ord("X")))
{
if global.jump_attack = true
{
var dir = point_direction(x,y,x_destino,y_destino)
var dist = point_distance(x,y,x_destino,y_destino)
if dist < spd
{
x = x_destino;
y = y_destino;
global.jump_attack = false
}
else
{
x += lengthdir_x(spd,dir)
y += lengthdir_y(spd,dir)
}
}
}
if global.jump_attack = true//Se apagará la GRAVEDAD
{
gravity_direction = 270
gravity = 0
}
else
{
gravity = 0.5
}
Hola Luis En
Veo varios problemas en tu código.
El primero, es que le asignaste valor a x_destino en el evento CREATE, eso significa que las variables de destino no se actualizarán si mueves al personaje.
El otro problema es que el avance del personaje hacia las coordenadas de destino lo haces cuando pulsas "X". Por lo tanto, sólo se desplazará durante 1 step y no hará el recorrido completo (por eso has visto que el personaje se ha movido sólo un poco).
Le cambiaré un poco el orden al código que has colocado, con su respectivo comentario para que sepas qué hace cada línea.
En el CREATE EVENT no es necesario asignar valor a las variables, puedes simplemente crearlas con valor cero ya que el valor lo debe ganar relativo a la posición del player en el momento en que usa su poder.
x_destino = 0
y_destino = 0
En el STEP EVENT, cambiaré algunas cosas.
if (keyboard_check_pressed(ord("X"))) && global.jump_attack = false //Revisa si pulsas el botón X y el poder está desactivado
{
global.jump_attack = true //Activa el poder y establece las coordenadas de destino a 200 pixeles de distancia de las coordenadas actual del player.
x_destino = x + image_xscale*200
y_destino = y - 200
}
if global.jump_attack = true //Esto ocurre en cada step mientras el poder está activo.
{
gravity = 0 //Bloquea la gravedad para evitar que el personaje caiga mientras está usando su poder de salto
var dir = point_direction(x,y,x_destino,y_destino) //Calcula la distancia y dirección que hay hasta las coordenadas de destino
var dist = point_distance(x,y,x_destino,y_destino)
if dist < spd //Revisa si la distancia que debe recorrer es menor a la velocidad
{
x = x_destino; //Si eso pasa, teletransporta el personaje a su destino
y = y_destino;
global.jump_attack = false //Se acaba el poder
}
else //por el contrario, si aún le queda distancia que recorrer
{
x += lengthdir_x(spd,dir) //Hace que el jugador avance un poco hacia su destino.
y += lengthdir_y(spd,dir)
}
}
else //Si el poder está desactivado
{
gravity = 0.5 //Regresa la gravedad a su valor normal
}
Eso debería corregir tu problema. Coméntanos si aún estás teniendo problemas con el código.
Si aún sigues sin entender la lógica del código o alguna de las funciones, puedes mandarme un mensaje privado y te puedo explicar en detalle el efecto de cada una de las líneas
Saludos
Genial! entendido! voy a revisar el código que me has pasado, para comprender todo mejor, y probaré como me resulta. Muchas gracias por la ayuda, si hay algún problema o me funciona, te escribiré bro. Lo probaré ahora mismo!