Buenas tardes
Muchachos, he estado dandole vueltas a mi proyecto intentado encontrar un error.
Empecé mi proyecto programando los golpes de espada, cuando terminé, programe los saltos y los movientos (es un juego de plataformas entonces tiene gravedad)
pero, no me di cuenta, que al cambiar el codigo ahora los ataques con la espada fallan, es decir, el sprite no se muestra completo solo se muestran 1 o 2 imagenes.
-Hay una variable que aumenta cada vez que se presiona j
despues del cambio ya no aumenta la variable
Por lo que he mirado creo que es un conflicto de ordenes entre la orden de poner el sprite de stand y el de atacar, haciendo que mientras tenga oprimido atacar (desde ahora j) se muestre el sprite de ataque pero apenas suelte el boton vuelva a stand:
End Step
//if (place_free(x,y+vspeed)) {gravity = .12;} else {move_contact_solid(270,1);gravity = 0;vspeed = 0;}
if place_meeting(x,y+1,plataforma) {gravity=0 ; vspeed=0} else {gravity=0.12}
//Animaciones (quieto, caminar)
if vspeed=0 {
if keyboard_check(ord('D')) or keyboard_check(ord('A'))
{sprite_index = link_runr
image_speed=.3}
}
//Animación de Salto
if place_free (x,y+1) combo=0
if vspeed<0 sprite_index=link_jump
if vspeed>0.24 sprite_index=link_jumpd
if vspeed=0 and keyboard_check(vk_nokey) and combo=0 sprite_index=link_battle
/*creo que aqui esta el error por el " keyboard_check(vk_nokey)" pues si suelto la tecla inmediatamente se cumple la condicion y pasa a link battle
*/
animation end
switch (sprite_index)
{
case link_atk1 :
if combo>=2 {sprite_index=link_atk2 image_index=0} else {sprite_index=link_battle combo=0}
break;
case link_atk2:
if combo>=3 {sprite_index=link_atk3 image_index=0} else {sprite_index=link_battle combo=0}
break;
case link_atk3:
sprite_index=link_battle
if sprite_index=link_battle
alarm[0]=30
combo=-1
prep=1
break;
//ataques rapidos
case link_atr1 :
if combo>=2 {sprite_index=link_atr2 image_index=0} else {sprite_index=link_battle combo=0}
if sprite_index=link_battle
alarm[0]=30
break;
case link_atr2:
if combo>=3 {sprite_index=link_atr3 image_index=0} else {sprite_index=link_battle combo=0}
if sprite_index=link_battle
alarm[0]=30
break;
case link_atr3:
if combo>=4 {sprite_index=link_atr2 image_index=0} else {sprite_index=link_battle combo=0}
if sprite_index=link_battle
alarm[0]=30
break;
case link_runr:
sprite_index=link_battle combo=0
break;
}
colision con obj_solid
plataforma=other.id
if vspeed>0
{
salto=2
vspeed=0
y=plataforma.bbox_top
}
if vspeed<0
{
y=yprevious
move_contact_all(90,-1)
vspeed=0
}
Se me hace dificil seguir el codigo, aunque casi seguro que el error esta donde decis, al poner el sprite a link_battle
Lo ideal seria que revises todo el sistema y lo hagas prolijo pensando en todos los movimientos (correr, atacar o nada).
Como eso es aburrido la otra es no cambiar el sprite a link_battle mientras se ataca, chequeando primero si el sprite no es ninguno de los ataques, algo asi:
if vspeed=0 and keyboard_check(vk_nokey) and combo=0 and sprite_index != link_atk1 and sprite_index != link_atk2 sprite_index=link_battle
Ahi tendrias que agregar todos los sprites
Tambien creo que no hay ninguna condicion a cumplir para que el jugador se mueva mientras ataca, lo que deberias arreglar
Pero igual lo mejor seria pensar bien la manera de hacerlo siguiendo unos estados, por ejemplo uno guarda en una variable 0, 1 o 2, para saber si el jugador esta quieto, moviendose o atacando respectivamente. Y asi ir haciendo el engine prolijamente. Para eso te recomiendo lapiz y papel
Okey es una buena idea, pero no quiero dearmar mi codigo, y si dejo el engine para mejor comprension?
Probaste agregando esas condiciones andes de cambiar al sprite link_battle?
No hace falta que envies todo el juego, podes hacer un juego nuevo con solo las partes que interesan para solucionar el error, eso seria de mucha ayuda
Pues siii funciono casi bien, solo que
la variable combo ya no aumenta...
No entiendo bien que significaría la variable combo. Pero se debe estar seteando a 0 en animation_end, o si no el jugador esta volando, como dice en step "if place_free (x,y+1) combo=0"
La variable combo esta siempre en 0 en el modo debug? si no es lo que dije antes no se que seria
ok
pasa esto
cada vez que oprimo 'j' (tecla de ataque) la variable combo aumenta en uno hasta 3(hasta porque son tres ataques, si es uno es una taque, si es 2 es otro ataque). mediante este codigo:
if combo=0 {sprite_index=link_atk1 image_index=0}
combo=min(combo+1,3)
es decir que cuando se oprime 'j' cambia de sprite y la variable combo aumenta +1 por vez.
A! lo de estar volando no es eso revisé la vspeed y es siempre 0 asi que esta en el suelo
Lo que pasa es que pasa el sprite pero la variable no aumenta.
debe haber algo que resetee la variable en el evento end step, o se activa en algun lado la alarm
- que devuelve la variable combo a cero pero no lo veo.
Fatal_fury.
Yo tuve una situación de combo también y me desenvolví así...
Primero hice los sprite de ataque... 1 para golpe 1, otro para golpe 2, otro para golpe 3 etc.,..
Cada sprite de cada ataque tenia 3 images_index (osea 3 partes)
Y lo desarrollaba en dos partes
1) por medio de alarmas hacia que cada animación de los golpe en su image_index dure un poco mas la 3
(osea el usuario pegaba el golpe pero al final del golpe "espera" a que golpees otra vez) y que si no pasaba nada vuelva a la posicion de quieto.
2) cada vaz que tocaba la tecla "X" ...
cuando la toco por primera vez (osea si el personaje esta con su sprite de quieto)
hacia el golpe 1 (sprite golpe 1)
si el sprite es golpe 1 y su image index es 3 hacia el golpe 2...
si el sprite es golpe 2 y su image index es 3 hacia el golpe 3...
(Y así)
Te lo explico en palabras para que entiendas mi idea pero si me esperas cuando vengo de trabajar esta noche te hago un codigo rapido.
Pero recorda, nunca es tarde para empezar con el engine de 0, eso va a hacer un juego mas poderoso. saludos
Sabes, cuando empeze a desarrollar el codigo que tengo al ponerme en los combos, al principio tuve tu misma idea (caaaasi lo mismo que tetrico XD)
la diferencia es que si la image_index= 3 (en mi caso era 5) tendria muy poco tiempo para que volviera a oprimir la tecla, (una subimagen es muy poco) pero esa idea de hacer que la imagen final dure algo mas solucionaria eso, pero no supe como hacerlo asi que desarme todo y busque otro camino y resulte con mu codigo actual.
si te sirvio me alegraria usarlo tambien y te lo agradeceria bastante, gracias.
Tambien quiero resolver este problema que tengo, no me puede quedar grande ademas me gusta mucho reolver problemas de codigo y cosas asi. jeje
Cita de: fatalfury en Febrero 25, 2013, 05:00:40 PM
ademas me gusta mucho reolver problemas de codigo y cosas asi. jeje
Y me haces resolver el problema a mi? XD
Sera porque hay un sprite con muy pocas subimagenes, provocando que el evento animation_end se ejecute muy rapido?
No se que puede ser, se me hace dificil saberlo. Se me ocurre que agregues un mensaje cuando combo se haga 0, entonces asi podes descubrir en que lugar de tu codigo la variable coombo se hace 0 cuando no debe. Eso se hace con "show_debug_message(mensaje)". Entonces por ejemplo en animation_end ponés:
switch (sprite_index)
{
case link_atk1 :
if combo>=2 {sprite_index=link_atk2 image_index=0} else {sprite_index=link_battle combo=0 show_debug_message("animation_end, linea 4")}
break;
case link_atk2:
if combo>=3 {sprite_index=link_atk3 image_index=0} else {sprite_index=link_battle combo=0show_debug_message("animation_end, linea 7")}
break;
//....
Entonces ejevutas el juego en modo debug, haces click en "Show Messages" y vas a ver que esta mal, por ejemplo si lo que provoca que combo sea 0 es en el case link_atk2, el debug te va a mostrar muchas veces
animation_end, linea 7
Mira yo lo hice con una linea de tiempo puse que en el step 1 que la sprite index sea golpe 1, y la velocidad de la imagen 0 y aparezca la image index 1 en el step 3 la 2 en el step 4 la 3 y en la 12 cambiaba a sprite index quieto .
Osea al tener la speed en 0 sos vos el que mediante los step de la linea de tiempo dominas cuanto tarda la animacion.
Solo resta apretar el boton x, y si la imagen index del sprite index golpe 1 es 3 que arranque la time line golpe 2.
Leete en el manual la parte de time line ;)s es muuuuy util vas a tener mas dominio