Enero 26, 2015, 09:30:02 AM Ultima modificación: Enero 27, 2015, 10:16:36 AM por arcangelcaos
Hola, conforme trabajo me salen dudas, y no termino de encontrar las repuestas, y mas que mi ingles es un poco  "bajo".
Bueno aquí van:
1ª. Yo tengo sprites de 4x4, osease, 16 frames, 4 anda iz, 4 abajo, 4 derecha y 4 arriba. Tengo que crear un sprite para cada movimiento o puede decir que se reproduzca desde una imagen concreta a una, osease  de la 3 a la 7, sería la animación de abajo, de la 13 a 16, seria hacia arriba. Y asi se ahorraría tener que crear 4 sprites con cada movimiento.

2ª. Se puede colocar el proyecto en una unidad virutal, osease, dropbox, google drive, etcc. Para que asi sea accesible desde otros ordenadores, eso si, nunca se trabajaría al mismo tiempo. Es que tengo 2 lugares de trabajo, y es un engorro tener que estar exportando y todo eso. Se guadar algún dato en el propio pc, o no?

3ª. Elimino lo de las conversaciones, dado que no hay respuestas.


Gracias :love: :love: :love:

#1 Enero 26, 2015, 12:26:02 PM Ultima modificación: Enero 26, 2015, 12:39:09 PM por penumbra
Creo que debes postear cada duda por separado, para evitar enredos en los hilos/temas.

1) Esa manera de manejar sprites a mi se me hace mas enredada. Sin duda que se puede, pero yo preferiría usar un sprite distinto por cada acción/animación, porque es más intuitivo manejar variables que representen estados con su respectivo sprite. Hay acciones en las que sólo es necesario definir el sprite_index y la velocidad image_speed y ya, pero al tener distintas animaciones  en un solo sprite, controlarlas se  vuelve más tedioso. Por ejemplo, para comenzar la animación saltándo hasta la tercer subimagen:
[gml]
if (correr == true)
{
     sprite_index = spr_general
     image_index = 2
     image_speed = 0.4
}[/gml]

pero si manejas el código en step, entonces no va a funcionar, porque en cada paso, image_index se pone en 2, y la animación no correrá, entonces hay que recurrir a ifs adicionales y/o variables adicionales y/o eventos adicionales y/o alarmas adicionales para controlar la animación. Y entre más animaciones/acciones distintas tenga el sprite, más difícil mantener el código... la verdad prefiero manejar sprites por separado ya que el único "beneficio" que le veo a juntar animaciones es que el árbol de recursos es más fácil de navegar, pero al menos en mi caso, es mucho mayor el tiempo que me paso viendo código que navegando la carpeta de sprites.

En el caso de que controlar de la imagen 3 a la 7, sería algo así, pero la verdad hay el código cambia ligeramente según cómo se maneje la condición (o múltiples condiciones)[gml]
if (correr == true)
{
     sprite_index = spr_general
     image_index = 2
     image_speed = 0.4
     correr = 0                    //evitar que la animación se estanque
}
if (sprite_index == spr_general) and (image_index > 6)
{
    //cambiar estado del jugador a otra accion, probablemente haya que leer el teclado/mouse/joystick y ajustar variables para saber a qué acción cambiar
}
[/gml]

Es un ejemplo sólo para mostrar que es más enredado, sin mencionar que tal como lo puse no es recomendable, porque para evitar que la animación se estanque, correr se pone en 0, pero (sobre todo si se usan estados basados en variables) esto es poco congruente ya que la animación (de la 3 a la 7) está activa, por lo que correr debería seguir siendo 1/true y ponerse en 0 sólo cuando se salga de ese rango.

Otra opción sería  (para correr, por ejemplo)

LEFT KEY PRESS
[gml]
if (spsrite_index == spr_general)
{
     if (image_index < 2) or (image_index > 6)
     {
            image_index == 2                            //Si la animación actual no es correr, cambiar a correr (inicio)
            correr = true
            image_speed = 0.4
     }     
}
[/gml]

STEP
[gml]
if (spsrite_index == spr_general) and (correr == true) and (image_index > 6)
{
     correr = false
    //leer el teclado/mouse/joystick y ajustar variables para saber a qué acción cambiar, cambiar además al frame adecuado en el sprite general
}
[/gml]
??? Definitivamente yo prefiero lidiar con 4 sprites por separado.

GRACIAAASSS

Madria mia, la que as liado para decirme que es mejor 4 sprites, jajaj, gracias de verdad. Pensaba que era mas fácil. Yo había visto algo, pero era con sprites de imágenes fijas, tipo cartas de una baraja, que no tiene animación.

Y lo de las conversaciones,  eso como lo harias?????

hola...  yo he utilizado varias veces animaciones con un solo sprite y no es tan dificil y en cietos casos es muy util solo con dos variables extras que controlen las subimagenes:
img_min // para la primer imagen de anim
img_max // para la ultima imagen

..bueno yo uso otra variable para la accion...
accion=""   

supongamos en step:

if accion="caminar"{
img_min=0;
img_max=4;
image_speed=.3
}
if accion="correr"{
img_min=5;
img_max=10;
image_speed=.6
}

//para controlar la animacion
if image_index>img_max{image_index=img_min}

y pues la accion se controla donde gustes ejemplo. en step:


der=keyboard_check(vk_right)
spa=keyboard_check(vk_space)

if der and accion!="correr"{accion="caminar"}
if accion="caminar" and spa {accion="correr"}



Gracias, que simple parece, esta noche probare, haber que tal, si me vale para lo que quiero, dado que yo no actuo directamente con el objeto, desde un botón, se ordena andar, atacar, etcc. Ahh, y se puede usar con la dirección?'
Por ejemplo si es dirección derecha de la 4 a la 7 y si es dirección izquierda de la 8 a la 11, y abajo y arriba?? y luego otra, si no hay dirección?? que esta parado? tengo una animación para parado, que es esperando.

Gracias, gracias

Hola, ya lo prove, y me valio a medias. Lo de las dos variables y con esto if image_index>img_max{image_index=img_min} me vale a medias.
Lo malo, es que mis criaturas se mueven con path, y lo que quiero es que se controle solo. Pero no lo consigo, me falta saber como sacar hacia donde se mueve o si esta parado. He probado con hspeed < 0  o hspeed > 0, en e evento step, pero nada, siempre me devuelve 0, comprobado. He probado con direction, pero no me detecta cuando esta parado.
No, se, kizas abandone este intento y sigua como siempre.
Gracias.

#6 Enero 26, 2015, 10:10:38 PM Ultima modificación: Enero 26, 2015, 10:20:34 PM por penumbra
Es porque debes usar las funciones path, por ejemplo, path_position, path speed, el evento END OF PATH, etc.

http://docs.yoyogames.com/source/dadiospice/002_reference/paths/index.html

No se si me he explicado bien o yo no lo entiendo.
Yo tengo esto, en el evento créate
mipath = path_add()
           path_add_point(mipath, x, y, 100)
           path_add_point(mipath, 600, 320, 100)
           path_add_point(mipath, 545, 390, 10)
           path_add_point(mipath, 426, 256, 50)
           path_set_closed (mipath, false)
           path_start (mipath, 10,0,true)

El enemigo hace ese recorrido, pero como calculo yo para que cambie de sprite, es lo que no se, no me aclaro.

Gracias, de verdad

Cita de: arcangelcaos en Enero 26, 2015, 10:25:10 PM
No se si me he explicado bien o yo no lo entiendo.
Yo tengo esto, en el evento créate
mipath = path_add()
           path_add_point(mipath, x, y, 100)
           path_add_point(mipath, 600, 320, 100)
           path_add_point(mipath, 545, 390, 10)
           path_add_point(mipath, 426, 256, 50)
           path_set_closed (mipath, false)
           path_start (mipath, 10,0,true)

El enemigo hace ese recorrido, pero como calculo yo para que cambie de sprite, es lo que no se, no me aclaro.

Gracias, de verdad

hola de nuevo...
si te refieres a que cambie de sprite o en este caso img_min y img_max con respecto a direccion  tal vez funcione asi.
recuerda que la dirreccion se mide en grados y para lograr 4 direcciones del sprite seria
en step:

if (direction>315 and direction<360) or (direction>-1 and direction<46) {// mira a la derecha
//img_min=0      primer imagen vista derecha
//img_max=  ultima imagen vista derecha
}
//y asi sucecivamente...
if (direction>45 and direction<136){// mirada hacia arriba

img_min=
img_max=
}
if (direction>135 and direction<226){ //mirada izq
img_min=
img_max=
}
if (direction>225 and direction<316{// mirada abajo

img_min=
img_max=
}

Cita de: arcangelcaos en Enero 26, 2015, 10:03:49 PM
He probado con hspeed < 0  o hspeed > 0, en e evento step, pero nada, siempre me devuelve 0, comprobado. He probado con direction, pero no me detecta cuando esta parado.

Cuando mencioné lo de las funciones propias de los path, no me refería a cómo construíste el path, que se supone que funciona, sino a que cuando el objeto se mueve siguiendo path, no tiene hspeed, me imagino que por eso siempre te devuelve 0. Para saber hacia dónde se mueve o si se está quieto, se puede preguntar el signo o valor de path_speed


hola de nuevo...
si te refieres a que cambie de sprite o en este caso img_min y img_max con respecto a direccion  tal vez funcione asi.
recuerda que la dirreccion se mide en grados y para lograr 4 direcciones del sprite seria
en step:

if (direction>315 and direction<360) or (direction>-1 and direction<46) {// mira a la derecha
//img_min=0      primer imagen vista derecha
//img_max=  ultima imagen vista derecha
}
//y asi sucecivamente...
if (direction>45 and direction<136){// mirada hacia arriba

img_min=
img_max=
}
if (direction>135 and direction<226){ //mirada izq
img_min=
img_max=
}
if (direction>225 and direction<316{// mirada abajo

img_min=
img_max=
}

[/quote]

Esto lo probé en el event step, pero no funciona, dado que cada vez que hace un step, vuelve a asignar los valores y no me lo hace bien, dado que si el img_min es la 19, pasa por todos hasta llegar a la 19, la primera vez, y se ve muy raro. Dado que para iniciar la animación no se le asigna la img desde cual conmenzar, y si se la pongo, no avanza, porque siempre la asigna

hace falta la condicion  del img_min:
if image_index<img_min{image_index=img_min

#12 Enero 27, 2015, 10:11:58 AM Ultima modificación: Enero 27, 2015, 10:15:04 AM por arcangelcaos
MIL GRACIAS, NO LAS SIGUENTE. Se ha quedado guapo, guapo, todos mis objetos(enemigos o amigos) se mueven con path, asi que este es el resultado final
EVENT STEP
if path_speed > 0{
if (direction>315 and direction<360) or (direction>-1 and direction<46)
{// mira a la derecha
img_min=12
img_max=15
}
//y asi sucecivamente...
if (direction>45 and direction<136){// mirada hacia arriba

img_min=20
img_max=23
}
if (direction>135 and direction<226){ //mirada izq
img_min=8
img_max=11
}
if (direction>225 and direction<316)
{// mirada abajo

img_min=16
img_max=19
}
}

else

{
if (direction>315 and direction<360) or (direction>-1 and direction<46)
{// mira a la derecha
img_min=0
img_max=3

}

if (direction>135 and direction<226){ //mirada izq
img_min=0
img_max=3
image_index= -1
}
}

if image_index<img_min{image_index=img_min}
if image_index>img_max{image_index=img_min}


EVENT END OF PATH
path_speed= 0
Este lo pongo, porque si no, no me detecta que se parado, el path acaba, pero sigue como con velocidad puesta.

Funciona muy bien, mils gracias, de verdad

:) cuando gustes amigo....  estamos para ayudar.