Mayo 25, 2014, 10:48:14 PM Ultima modificación: Mayo 26, 2014, 02:56:20 PM por Retsal
Tengo un proyecto 2D de un juego competitivo entre 2 jugadores.
Un objeto es el personaje 'oficinista' y quiero que cuando le de a la tecla 'o' (es el ataque) lance una maleta. Para lanzar la maleta he creado un sprite de 3 imágenes, el problema es que no sé que hacer para que reproduzca únicamente esas 3 imágenes y luego vuelva al sprite donde está parado.
Tampoco comprendo como funciona la variable image_index, sé usarla para cambiar sprites, pero no comprendo de donde vienen los valores (me da 0 y 0.5 de forma aleatoria).

Gracias de antemano. :)

yo usaria algo como

Al presionar 'o'
ataque = true; quieto = false;

en [STEP]
if (atacar == true)
     sprite_index = spr_ataque

if (quieto ==  true)
     sprite_index = spr_quieto         

en [ANIMATION END]
if sprite_index == spr_ataque
{
    quieto = 1                 //Regresar al estado "quieto" después de llegar a la última subimagen del sprite
    atacar = 0                // Finalizar ataque
}

Obviamente, las variables quieto y atacar las tienes que definir antes en CREATE. También debes definir la velocidad de animación adecuada para que el ataque no se vea ni muy rápido ni muy lento

Aunque se puede entender que image_index se usa para cambiar sprites, en realidad se usa para cambiar subimágenes de un mismo sprite. Para cambiar entre distintos sprites se usa sprite_index

Los valores de image_index pueden mostrar decimales dependiendo de la velocidad de animación (image_speed), pero GM siempre redondea, ya que entre la subimagen 0 y la 1 no hay ni puede haber realmente una subimagen 0.5, o muestra la 0 o la 1.



Perdón, me falta por añadir el código que he usado:

if cooldown = 1 && keyboard_check_pressed(ord('O'))
{
    if sprite_index = spr_oficinista_der || sprite_index = spr_oficinista_stop_der
    {
        sprite_index = spr_ofi_atk2_der;
        image_speed = 0.1;
        if image_speed > 0
            {
            if image_index > image_number - 1 {sprite_index = spr_oficinista_stop_der};
            }
        alarm[0] = 180
        cooldown = 0
    }

Eso es lo que tengo para la derecha, para la izquierda tengo lo mismo con los respectivos cambios en los sprites.

#3 Mayo 25, 2014, 11:37:31 PM Ultima modificación: Mayo 25, 2014, 11:39:34 PM por penumbra
Mmm... estás usando muchos sprites, el doble de los necesarios.

Suponiendo que nada mas hay un sprite que originalmente mira hacia la derecha, el mismo se puede usar cuando se avanza a la izquierda, sólo inviertes su orientación usando image_xscale = -1. Esto mismo ayuda a que un sólo sprite de "quieto" sea suficiente, en lugar de un quieto_der y un quieto_izq

if image_speed > 0
{
     if image_index > image_number - 1 {sprite_index = spr_oficinista_stop_der};
}

Esto se supone que al final sirve para lo mismo que lo que puse para el evento [ANIMATION END]. Tu estás revisando qué sprite hay para condicionar qué sprite se muestra en seguida, yo voy más por el método de usar variables que me indiquen el estado del personaje, y en base a eso asignar sprites, pero de nuevo, es cuestión de gustos. ¿Para qué usas la alarma?


[spoiler]
Cita de: penumbra en Mayo 25, 2014, 11:37:31 PM
Mmm... estás usando muchos sprites, el doble de los necesarios.

Suponiendo que nada mas hay un sprite que originalmente mira hacia la derecha, el mismo se puede usar cuando se avanza a la izquierda, sólo inviertes su orientación usando image_xscale = -1. Esto mismo ayuda a que un sólo sprite de "quieto" sea suficiente, en lugar de un quieto_der y un quieto_izq

if image_speed > 0
{
     if image_index > image_number - 1 {sprite_index = spr_oficinista_stop_der};
}

Esto se supone que al final sirve para lo mismo que lo que puse para el evento [ANIMATION END]. Tu estás revisando qué sprite hay para condicionar qué sprite se muestra en seguida, yo voy más por el método de usar variables que me indiquen el estado del personaje, y en base a eso asignar sprites, pero de nuevo, es cuestión de gustos. ¿Para qué usas la alarma?
[/spoiler]
Lo de los sprites era la forma más intuitiva para mí, llevo menos de una semana usando gml jaja ^^'
La alarma es para el cooldown, dura 3 seg y no me da problemas... el problema es que la animación de lanzar la maleta no para a no ser que mueva al personaje (cambia el sprite a correr).
El código:
if image_speed > 0
{
     if image_index > image_number - 1 {sprite_index = spr_oficinista_stop_der};
}

no me funciona, sabéis qué tengo mal?  ???

Cita de: Retsal en Mayo 26, 2014, 12:00:34 AM
La alarma es para el cooldown, dura 3 seg y no me da problemas... el problema es que la animación de lanzar la maleta no para a no ser que mueva al personaje (cambia el sprite a correr).
El código:
if image_speed > 0
{
     if image_index > image_number - 1 {sprite_index = spr_oficinista_stop_der};
}

no me funciona, sabéis qué tengo mal?  ???

Esa condición no funciona: Tienes un sprite con tres subimágenes para el ataque: 0, 1 y 2.
image_number - 1 = 3-1 = 2.
"Si 2 es mayor que 2, cambia el sprite"
pero dos nunca es mayor que dos, la condición nunca se hace verdadera.

Yo prefiero usar el evento ANIMATION END, pero si corriges la condición de ese IF, debería también funcionar.





No se me ocurre que usar para corregir el if...
¿Qué podría poner para corregirlo sin hacer el animation end? no sé realmente lo que es, me siento más cómodo con el if

Cita de: penumbraMmm... estás usando muchos sprites, el doble de los necesarios.

Mmm... Retsal, no nos dijiste en el icono del primer mensaje que versión de GM usas.
Mira esto:
Preguntas y respuestas: qué es y cómo funciona - Leer antes de postear
Por favor arréglalo y listo.
Cita de: Fenris78Si un tema os resulta de interes y veis que hay poca información, la mejor solucion no es quejarse o pedir sin pensar, sino sugerir algo bien planteado o aportarlo vosotros mismos.
Cita de: CalioSomos desarrolladores independientes y, por lo tanto, no tenemos por qué guiarnos por las tendencias del mercado.

Perdón, ya está solucionado[spoiler]
Cita de: Johann en Mayo 26, 2014, 04:22:19 AM
Cita de: penumbraMmm... estás usando muchos sprites, el doble de los necesarios.

Mmm... Retsal, no nos dijiste en el icono del primer mensaje que versión de GM usas.
Mira esto:
Preguntas y respuestas: qué es y cómo funciona - Leer antes de postear
Por favor arréglalo y listo.
[/spoiler]

Realmente el problema que tengo es de base porque no sé como adquiere valores 'image_index' y no consigo que el 'if' me funcione.
Me podríais explicar detalladamente como funciona el 'image_index' y cómo lo modifica el 'image_speed'? También influye la velocidad de las habitaciones?

Gracias de antemano

//Press "O"
image_index = 0
image_speed = 0.6

//Step
if image_index >= 2
   {image_index = 0}

*Cuando presionas "O", se ubica en la primera sub imagen del sprite con la velocidad 0.6.
*Si la sub imagen del sprite es mayor o igual a 2 (la ultima) es por que ha echo el ataque, entonces vuelve a ponerse en su posición norma, que es 0.

Espero haberte ayudado, saludos!
.:RoskGames:.

YA LO HE SOLUCIONADO
Muchas gracias a todos los que habéis comentado en el post, dejo la solución por si a alguien le ocurre lo mismo.
En un evento Step:

        if sprite_index = spr_ofi_atk2_der && image_index = 2
        {
        image_speed = 0
        sprite_index = spr_oficinista_stop_der
        }
       
if cooldown = 1 && keyboard_check_pressed(ord('O'))
{
    if sprite_index = spr_oficinista_der || sprite_index = spr_oficinista_stop_der
    {
        sprite_index = spr_ofi_atk2_der;
        image_speed = 0.2
        alarm[0] = 180
        cooldown = 0
    }
}

Sólo había que sacar fuera del 'If' del Keyboard la parte de comprobar el 'image_index' para cambiar el 'sprite_index'.
Y con esto me he tirado más de dos días estancado señores  :-[ jajaja