Buenas gente, quisiera saber si me pueden ayudar un poco. Estoy intentando hacer juego de Shoot'em up de naves, bien a lo retro. El problema que tengo es el siguiente..
cuando voy hacia arriba tengo una animacion diferente que cuando voy hacia abajo.. lo que quiero hacer es que al dejar de apretar para arriba la animacion vaya en reversa y lo mismo cuando hago hacia abajo.. Tengo tambien otro problema que cuando llego al limite tanto de arriba o de abajo del room,se traba la animacion de la nave.. se los muestro en el video para ver si entienden mejor lo que les pregunto. Tambien les dejo el ejecutable para que lo prueben.. Saludos.
En el draw:
Si "botón arriba" sprite arriba
Si no Si "botón abajo" sprite abajo
Si no sprite normal
Cita de: Marth en Junio 16, 2015, 02:27:43 AM
En el draw:
Si "botón arriba" sprite arriba
Si no Si "botón abajo" sprite abajo
Si no sprite normal
Mirá, este es el pequeño codigo que hice.
//ir a la izquierda.
if keyboard_check(ord("A")) and x > 13 //Choca hacia el costado izquierdo
{
x -= 1;
sprite_index = spr_j1_normal;
}
//ir a la derecha.
if keyboard_check(ord("D")) and x < 350 //Choca hacia el costado derecho
{
x += 2;
sprite_index = spr_j1_normal;
}
//ir arriba
if keyboard_check(ord("W")) and y > 8 //Choca arriba
{
y -= 1;
sprite_index = spr_j1_arriba;
image_speed = 0.1
if image_index = 1
{
image_index = 1;
image_speed = 0;
}
}
//soltar tecla hacia arriba.
if keyboard_check_released(ord("W"))
{
sprite_index = spr_j1_normal;
}
//ir abajo
if keyboard_check(ord("S")) and y < 200 //choca abajo
{
y += 1;
sprite_index = spr_j1_abajo;
image_speed = 0.1
if image_index = 1
{
image_index = 1;
image_speed = 0;
}
}
//soltar tecla hacia abajo
if keyboard_check_released(ord("S"))
{
sprite_index = spr_j1_normal;
}
Cita de: Betox en Junio 16, 2015, 02:43:48 AM
Cita de: Marth en Junio 16, 2015, 02:27:43 AM
En el draw:
Si "botón arriba" sprite arriba
Si no Si "botón abajo" sprite abajo
Si no sprite normal
Mirá, este es el pequeño codigo que hice.
//ir a la izquierda.
if keyboard_check(ord("A")) and x > 13 //Choca hacia el costado izquierdo
{
x -= 1;
sprite_index = spr_j1_normal;
}
//ir a la derecha.
if keyboard_check(ord("D")) and x < 350 //Choca hacia el costado derecho
{
x += 2;
sprite_index = spr_j1_normal;
}
//ir arriba
if keyboard_check(ord("W")) and y > 8 //Choca arriba
{
y -= 1;
sprite_index = spr_j1_arriba;
image_speed = 0.1
if image_index = 1
{
image_index = 1;
image_speed = 0;
}
}
//soltar tecla hacia arriba.
if keyboard_check_released(ord("W"))
{
sprite_index = spr_j1_normal;
}
//ir abajo
if keyboard_check(ord("S")) and y < 200 //choca abajo
{
y += 1;
sprite_index = spr_j1_abajo;
image_speed = 0.1
if image_index = 1
{
image_index = 1;
image_speed = 0;
}
}
//soltar tecla hacia abajo
if keyboard_check_released(ord("S"))
{
sprite_index = spr_j1_normal;
}
Si pones que al pulsar izquierda o derecha pase a ser un sprite de zona central pues claro que dará error.
Deberías simplificarlo a como te lo he enseñado:
Si "botón arriba"{y-- sprite arriba}
Si no Si "botón abajo"{y++ sprite abajo}
Si no sprite normal
Si "botón izquierda" x--
Si no Si "botón derecha" x++
Hola muchas gracias x la ayuda, pero igual no entiendo bien como se hace lo del evento Draw, la verdad q no se como se usa . Saludos.
Cita de: Betox en Junio 16, 2015, 05:18:11 PM
Hola muchas gracias x la ayuda, pero igual no entiendo bien como se hace lo del evento Draw, la verdad q no se como se usa . Saludos.
El evento draw no es muy diferente al evento step, pero con una sustancial diferencia: si lo usas, el sprite del objeto ya no se muestra, ademas de que es en este evento donde puedes utilizar funciones de dibujo como "draw_sprite" o "draw_text".
Es decir, si usas draw_text(5,40,"Hola") saldra "Hola" en la coordenada 5,40 pero el sprite del objeto ya no se mostrara.
En GM Studio existe una función llamada "draw_self" que permite mostrar en pantalla el objeto, pero no existe en GM8. Eso si, en esta comunidad podrás buscar un código que te permita crear un sucedáneo. Mira en la sección "scripts".
El evento draw no es muy diferente al evento step, pero con una sustancial diferencia: si lo usas, el sprite del objeto ya no se muestra, ademas de que es en este evento donde puedes utilizar funciones de dibujo como "draw_sprite" o "draw_text".
Es decir, si usas draw_text(5,40,"Hola") saldra "Hola" en la coordenada 5,40 pero el sprite del objeto ya no se mostrara.
En GM Studio existe una función llamada "draw_self" que permite mostrar en pantalla el objeto, pero no existe en GM8. Eso si, en esta comunidad podrás buscar un código que te permita crear un sucedáneo. Mira en la sección "scripts".
[/quote]
Ya encontre mas o menos como se usa Draw, y la fumcion" draw_self" si exite en GM8.1. Asi que me daba el mismo resultado poner draw_self o draw_sprite.
Ahora me sirgio un nuevo problema cuando pongo en el evento DRAW lo siguiente, la nave solo muestra el primer subindice de imagen.. y las imagenmes son 2 (0, 1)
if keyboard_check(ord("W"))
{
draw_sprite(spr_j1_arriba,image_index,x,y)
}
Y si le pongo de esta forma, tampoco se ve la velocidad de la animacion.
if keyboard_check(ord("W"))
{
draw_sprite(spr_j1_arriba,image_index,x,y)
image_speed = 0.5
}
No entiendo como hacer para que haga lo que quiero, o sea que se vea la animacion cuando hago para arriba y si sigo apretando hacia arriba se detenga la animacion en la ultima imagen o sea en este caso en la subimagen 1.
1) Creo que te estás complicando la vida. Ejemplo:
f keyboard_check(ord("W"))
{
draw_sprite(spr_j1_arriba,image_index,x,y)
}
Si quieres reproducir una animación, en el 99% de los casos
DE ANIMACIÓN (no sprites estáticos) la función draw_sprite() y similares no son recomendables, porque si se usan es necesario hacer más preparaciones para poder correr una animacion, cosa que es realmente fácil de hacer si simplemente se deja que el objeto dibuje su sprite o se usa draw_self() en lugar de draw_sprite().
Al usar draw_sprite estás desaprovechando las otras funciones útiles de GML para controlar la animación, como image_index, image_speed y el evento animation end.
2) Una animación de sólo dos subimagenes es muy poco (generalmente). En ocasiones esto puede generar que aunque todo tu código y lógica funcione bien, el efecto de animación símplemente se vea mal. No digo que este sea tu caso, pero tampoco descarto que pueda pasarte, además tu planteamiento es algo contradictorio:
Cita de: Betox en Junio 17, 2015, 06:00:58 PM
... cuando pongo en el evento DRAW lo siguiente, la nave solo muestra el primer subindice de imagen.. y las imagenmes son 2 (0, 1)
No entiendo como hacer para que haga lo que quiero, o sea que se vea la animacion cuando hago para arriba y si sigo apretando hacia arriba se detenga la animacion en la ultima imagen o sea en este caso en la subimagen 1.
Quieres que la animación corra cuando presionas hacia arriba, pero a la vez quieres que si mantienes presionada la tecla la animación se detenga, entonces, ¿o quieres que corra o quieres que se detenga? Luego, como son dos subimágenes nada más, el paso de la subimagen 0 a la 1 va a ser casi instantáneo, por lo que prácticamente NO SE VERÁ LA ANIMACIÓN (a esto me refería con los probables problemas del punto 2).
Para detener la animación cuando llegue a la última subimagen símplemente haces 0 la variable image_speed. Esto se puede hacer en el evento ANIMATION END o en STEP, preguntando por el valor de image_index y haciendo 0 image_speed.
Bueno, la verdad que me funciona mejor en el evento step, pero creo entender cual podria ser el problema.. pero no entiendo como arreglarlo, por ejemplo estoy en mitad de la pantalla y subo , la animacion de la nave va perfecta y al chocar contra el techo , la animacion queda con el ultimo frame de la animacion, como quiero que quede. El tema esta que cuando apenas apreto la tecla para bajar y vuelvo a presionar la tecla para arriba y sin soltar la tecla, la animacion de la nave hacia arriba queda en un loop infinito. Yo creo que pasa porque al apenitas bajar y mantener hacia arriba, la nave no tiene tiempo de cumplir la condicion que le puse. o sea que cuando el index de la imagen hacia arriba es igual a 1 la animacion deberia pararse...
En fin te puedo mandar el archivo para ver si me podes ayudar con eso?.