Estoy tratando de realizar un efecto Slowmotion sin necesidad de estar toqueteando la velocidad de la Room, debería de tocar la velocidad de todos los objetos? y realizar el efecto ralentizado con el Speed y el image_speed? o hay alguna otra forma de realizar dicho efecto.
Pues, sinceramente, el mejor modo de ralentizar la acción en un juego es precisamente bajarle la variable room_speed, ya que así no tendrás que estar movilizando la velocidad de todas las cosas en tu juego (speed, image_speed, etc). ;)
Cita de: Marth en Septiembre 19, 2014, 01:49:33 PM
Pues, sinceramente, el mejor modo de ralentizar la acción en un juego es precisamente bajarle la variable room_speed, ya que así no tendrás que estar movilizando la velocidad de todas las cosas en tu juego (speed, image_speed, etc). ;)
Utilizar room_speed ocasiona muchos dolores de cabeza y no es ni la mitad de eficaz que utilizar image_speed + speed, es como pensar en usar objetos Solido para las colisiones en game maker. Sólo tenia la duda si hay o existe alguna otra forma.
Bueno, tienes que planear bien el movimiento de todos los objetos, porque en realidad vas a tener que controlar dos velocidades, la velocidad de desplazamiento de cada objeto y en el caso de los objetos con sprites animados, su velocidad de animación.
Es decir, que debe haber una variable maestra que controle la velocidad, por ejemplo master_speed = 1. En todos los objetos con movimiento, las dos velocidades se deben especificar relativas a master_speed, por ejemplo, para cuando el jugador corre o camina:
[gml]if keyboard_check(vk_left)
{
image_speed = master_speed * 0.3
x += master_speed * 4
}[/gml]
Y reducir master_speed a un valor menor a 1 cuando quisieras reducir la velocidad, y (por precaución, para evitar errores) hacer que master_speed no pueda ser menor o igual a cero.
En fin, tu harás lo que tu quieras, pero yo cuando quiero incluir a mi juego un efecto de ralentización o aceleración, me basta con jugar con room_speed y me va de maravilla. :love:
En tu caso, te pondré un ejemplo de que tendrías que hacer para reducir la velocidad a la mitad (aunque según como programes, igual no te funciona):
with(all){speed/=2 image_speed/=2}
cambiar room_speed para ajustar la velocidad de animación y desplazamiento de los objetos es de lo menos recomendado que puedes hacer. A lo mejor no es tan visible, pero en realidad estás disminuyendo la tasa de refresco con la que se dibuja en pantalla, disminuyendo la precisión para detectar clicks, mover el mouse, calcular colisiones, leer eventos del teclado, etc.
Cita de: penumbra en Septiembre 19, 2014, 10:55:08 PM
cambiar room_speed para ajustar la velocidad de animación y desplazamiento de los objetos es de lo menos recomendado que puedes hacer. A lo mejor no es tan visible, pero en realidad estás disminuyendo la tasa de refresco con la que se dibuja en pantalla, disminuyendo la precisión para detectar clicks, mover el mouse, calcular colisiones, leer eventos del teclado, etc.
Sí por eso lo dije. He estado toqueteando el tema de la ralentización y me he fijado que en vistas cenitales es sencillo pero en vistas a modo Plataforma hay muchas más variantes, cuando por ejemplo pego un salto y utilizo la ralentización el salto que pega va a la par que la velocidad del personaje, es decir que si le bajo esa velocidad también estoy acortando su salto.
Hay alguna forma de hacer que el tiempo en si vaya más lento pero que el personaje se siga moviendo a su misma velocidad?(de tal forma que el salto que pega funcione según la velocidad original) Sería como crear una especie de Room_speed "falso", sin que se lleve por delante los FPS.
Pues del mensaje anterior:
Cita de: penumbra en Septiembre 19, 2014, 09:38:05 PM
[gml]if keyboard_check(vk_left)
{
image_speed = master_speed * 0.3
x += master_speed * 4
}[/gml]
El nombre de la variable es velocidad, pero si te fijas, en realidad actúa como si fuera una especie de control de tiempo. a tiempo 1, todo corre normal, a tiempo 0.5, las cosas "fluyen" a la mitad del tiempo 1, y room_speed se mantiene sin cambios. Si quieres que la animación vaya más lenta, pero el personaje camine a la misma velocidad, sólo cambias x+= 4
Cita de: penumbra en Septiembre 20, 2014, 12:54:17 AM
Pues del mensaje anterior:
Cita de: penumbra en Septiembre 19, 2014, 09:38:05 PM
[gml]if keyboard_check(vk_left)
{
image_speed = master_speed * 0.3
x += master_speed * 4
}[/gml]
El nombre de la variable es velocidad, pero si te fijas, en realidad actúa como si fuera una especie de control de tiempo. a tiempo 1, todo corre normal, a tiempo 0.5, las cosas "fluyen" a la mitad del tiempo 1, y room_speed se mantiene sin cambios. Si quieres que la animación vaya más lenta, pero el personaje camine a la misma velocidad, sólo cambias x+= 4
Yap, pero eso no me soluciona el salto, el salto que quiero hacer es en movimiento y es necesario llegar a otra plataforma, si activo la ralentización no se debe de ver afectado ni en el salto ni antes de efectuarse dicho salto.
Sin embargo cuando hago uso de la ralentización el personaje cuando esta en pleno salto le rebajo la velocidad horizontal y también se ve rebajada la longitud que logra y no llega.
Tengo algunas opciones, o hacer que si esta en pleno salto no se pueda usar la ralentizacion(ya que no es molesto que mientras camina se active) o hacer que de alguna forma cuando haga el salto guarde la variable original del Hspe siguiendo esa trayectoria sin que le afecte dicha ralentizacion.
Cita de: king195 en Septiembre 20, 2014, 01:42:21 AM
Yap, pero eso no me soluciona el salto, el salto que quiero hacer es en movimiento y es necesario llegar a otra plataforma, si activo la ralentización no se debe de ver afectado ni en el salto ni antes de efectuarse dicho salto.
Quien controla la ralentización y si se activa o no, o sobre qué objetos se activa y sobre cuales no, o a qué variables afecta (gravedad, velocidad, desplazamiento, altura) y a cuales no o cuando las afecta eres tú. Si el salto no funciona bien es porque no has especificado bien su comportamiento (ayudaría que colocaras el código de salto)
Si no quieres que al saltar la ralentización afecte a hspeed, pues no uses master_speed en el código de salto. Si sólo quieres que la animación vaya lenta, entonces
nada más image_speed debe usar master_speed y hspeed o vspeed los usas como si no existiera master_speed. Lo que sí no debes hacer es usar la velocidad del sprite(image_speed) para controlar hspeed o vspeed.
EDITADO: Algo de lo que me estaba olvidando era la gravedad. Esto es dependiendo del juego, pero es probable que en ciertos casos se quiera que la gravedad disminuya cuando la ralentización está activa (por ejemplo, con una gravedad menor, QUIZÁS tu personaje si alcance a llegar a la otra plataforma)
Cita de: penumbra en Septiembre 20, 2014, 01:51:52 AM
Cita de: king195 en Septiembre 20, 2014, 01:42:21 AM
Yap, pero eso no me soluciona el salto, el salto que quiero hacer es en movimiento y es necesario llegar a otra plataforma, si activo la ralentización no se debe de ver afectado ni en el salto ni antes de efectuarse dicho salto.
Quien controla la ralentización y si se activa o no, o sobre qué objetos se activa y sobre cuales no, o a qué variables afecta (gravedad, velocidad, desplazamiento, altura) y a cuales no o cuando las afecta eres tú. Si el salto no funciona bien es porque no has especificado bien su comportamiento (ayudaría que colocaras el código de salto)
Si no quieres que al saltar la ralentización afecte a hspeed, pues no uses master_speed en el código de salto. Si sólo quieres que la animación vaya lenta, entonces nada más image_speed debe usar master_speed y hspeed o vspeed los usas como si no existiera master_speed. Lo que sí no debes hacer es usar la velocidad del sprite(image_speed) para controlar hspeed o vspeed.
EDITADO: Algo de lo que me estaba olvidando era la gravedad. Esto es dependiendo del juego, pero es probable que en ciertos casos se quiera que la gravedad disminuya cuando la ralentización está activa (por ejemplo, con una gravedad menor, QUIZÁS tu personaje si alcance a llegar a la otra plataforma)
Exacto Penumbra, a eso mismo me refería, las plataformas usan gravedad a parte de los valores básicos que tiene cualquier juego, probare lo de la gravedad e intentaré ajustarlo, ya que si pongo una gravedad muy baja el salto sale disparadisimo hacia arriba. Es un verdadero dolor de muelas :P
Para hacer un efecto slowmotion, vas a tener que toquetear casi todo los objetos del juego :P no es ffacil hacerlo.
Ya casi he resuelto mi gran problema con esto del slow. Explico:
Para saltar tengo una variable que se encarga de averiguar si mi personaje esta tocando suelo o no(ground), en el caso de que no este tocando suelo no va a poder volver a saltar obviamente.
El problema cuando hago el salto y efectuó la ralentización es que en medio del salto cuando se acaba el efecto slow(le habré puesto 4 segundos de duración mediante un alarm al slow y al final de este se destruye la instancia) pues la gravedad vuelve a ser la misma que había antes, es decir que si pongo menos gravedad para conseguir que la longitud del salto sea la misma que antes estoy también impidiendo cuando la gravedad vuelve a ser la misma que el salto sea igual de alto.
A fin de cuentas y para resolver el problema he pensado en realizar 2 variables globales, una que se encarga de guardar cuando esta ground y cuando no lo esta(el personaje ya tiene dos de estas variables locales, pero para no mover todo el código he decidido crear dos globales), de esta forma lo que quiero conseguir es que cuando en el Alarm pasen los 4 segundos no le afecte al slowmotion mientras No esta tocando el suelo.
Alarm[0] - obj_slowmotion
if (global.slow = true and global.noground = true){
global.slow = true;
} else if (global.slow = true and global.yesground = true){
instance_destroy();
}
el personaje principal guarda ambas variables globales, ya que es el encargado de decirle a Slowmotion si esta pisando el suelo o no mi personaje. El problema es que ahora el slowmotion si no toco el suelo y han pasado esos 4 segundos es Infinito.
Lo que querría es que cuando pasen esos 4 segundos el personaje no cambie el slowmotion hasta que toque el suelo en el caso de que estuviese saltando(es decir "!ground"), esa sería una gran idea para quitarme todo este lió entre variables.
Mmm yo no implementaría el slowmotion como lo haces, creo que lo estás enredando mucho. No hay necesidad de crear un objeto slow adicional que luego se destruya en una alarma, esto sólo hace más engorrosa la implementación.
Cita de: king195 en Septiembre 20, 2014, 10:20:53 PM
Lo que querría es que cuando pasen esos 4 segundos el personaje no cambie el slowmotion hasta que toque el suelo en el caso de que estuviese saltando(es decir "!ground"), esa sería una gran idea para quitarme todo este lió entre variables.
Estás usando dos variables (noground y yesground) cuando una sola variable puede servir para saber si se pisa (noground = false) o no (noground = true) el suelo.
En el evento Alarma del slowmotion (para que funcione, el jugador debe hacer que noground sea falsa si está tocando el suelo)
[gml]
if (global.slow == true) and global.noground == false){
//apagar slowmotion
// ¿destruir obj_slowmotion?
}[/gml]
En el evento STEP del jugador
[gml]
if (global.slow == true) and global.noground == false)
{
//apagar slowmotion
// ¿destruir obj_slowmotion?
// if instance_exists(obj_slowmotion)
// with (obj_slowmotion) { instance_destroy() }
}[/gml]
Mientras no toque el suelo (si slowmotion está activa) se mantiene slowmotion.
Cita de: penumbra en Septiembre 20, 2014, 10:57:42 PM
Mmm yo no implementaría el slowmotion como lo haces, creo que lo estás enredando mucho. No hay necesidad de crear un objeto slow adicional que luego se destruya en una alarma, esto sólo hace más engorrosa la implementación.
Cita de: king195 en Septiembre 20, 2014, 10:20:53 PM
Lo que querría es que cuando pasen esos 4 segundos el personaje no cambie el slowmotion hasta que toque el suelo en el caso de que estuviese saltando(es decir "!ground"), esa sería una gran idea para quitarme todo este lió entre variables.
Estás usando dos variables (noground y yesground) cuando una sola variable puede servir para saber si se pisa (noground = false) o no (noground = true) el suelo.
En el evento Alarma del slowmotion (para que funcione, el jugador debe hacer que noground sea falsa si está tocando el suelo)
[gml]
if (global.slow == true) and global.noground == false){
//apagar slowmotion
// ¿destruir obj_slowmotion?
}[/gml]
En el evento STEP del jugador
[gml]
if (global.slow == true) and global.noground == false)
{
//apagar slowmotion
// ¿destruir obj_slowmotion?
// if instance_exists(obj_slowmotion)
// with (obj_slowmotion) { instance_destroy() }
}[/gml]
Mientras no toque el suelo (si slowmotion está activa) se mantiene slowmotion.
Mmmm.. ya... pero ahora no se desactiva el Slow y se queda puesto de forma infinita D: Puse en el Create
alarm[0]= room_speed *4;
Lo que viene siendo que en 4 segundos se active lo que haya en el Alarm, sin embargo aunque ponga lo que tu mismo especificaste no funciona.
leido lo leido, yo recomiendo esa respuesta que te dieron del master_speed, en mi opinión creo que es la mejor, pues así puedes controlar qué cambia de velocidad y qué no y para cambiarlo tansolo debes de cambiar el valor de esa ÚNICA variable, claro, mejor que sea global no? xd
Cita de: kostra en Septiembre 21, 2014, 11:02:21 PM
leido lo leido, yo recomiendo esa respuesta que te dieron del master_speed, en mi opinión creo que es la mejor, pues así puedes controlar qué cambia de velocidad y qué no y para cambiarlo tansolo debes de cambiar el valor de esa ÚNICA variable, claro, mejor que sea global no? xd
No estas contando en que trabajo con gravedad, no sólo con la velocidad, eso es otro parámetro que en salto pues molesta bastante.
en el evento alarm poné esto:
x=xprevious
y=yprevious
if global.slowmotion then alarm[0]=2
solo funciona para bajarle la velocidad a la mitad :P