Problema mudança de sprite no ataque [Plataforma]

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Problema mudança de sprite no ataque [Plataforma]

Mensagem por biscoito em Seg 05 Mar 2012, 14:08

Pessoal peguei um tutorial aqui no forum sobre movimento fiz tudo certinho e comecei a modificar o código para meu personagem atacar. Ele ataca, mas não tem os movimentos que eu qeria, ele simplesmente muda para o primeiro frame do sprite e nao tem a animaçao de todos os frames. No caso, a lingua do yoshi deveria se mexer... quando ele pula e aperto space ele ta bugs que nao consigo resolver tbm...
Usei esse codigo:
Código:
if (place_free(x,y+1))
{gravity=0.5; noar=true;

} else
 
 {gravity=0; noar=false;
 }

//Definiões de pulo
if (keyboard_check_pressed(vk_up)) && ! (place_free(x,y+1))
{
vspeed=-9; noar=true; friction=0; 
}

if (vspeed>12)
vspeed=12;
//movimentaçao
if (keyboard_check(vk_left)) && ! (keyboard_check(vk_right)) && (place_free(x-5,y))
{x-=5; lado=0; andando=true; parado=false;
}
if (keyboard_check(vk_right)) && ! (keyboard_check(vk_left)) && (place_free(x+5,y)) 
{x+=5; lado=1; andando=true; parado=false;
}

if ! (keyboard_check(vk_left)) && ! (keyboard_check(vk_right)) 
{andando=false; parado=true;
}
//atacar
if (keyboard_check(vk_space)) && ! (keyboard_check(vk_left)) && ! (keyboard_check(vk_right)){
atacando=true }else
{atacando=false}

//Sprites
if (noar==false)

{
if (andando=true) && (lado==1) 
{
sprite_index=spr_and_dir;
}
if (andando=true) && (lado==0)
{
sprite_index=spr_and_esq;
}
if (andando==false) && (parado==true) && (lado==1)
{
sprite_index=spr_par_dir;
}
if (andando==false) && (parado==true) && (lado==0)
{
sprite_index=spr_par_esq;
}
}

if (atacando==true) && (lado==0)
{sprite_index=spr_atac_esq}

if (atacando==true) && (lado==1)
{sprite_index=spr_atac_dir}

else
{
if (vspeed>0) || (vspeed<0) && (lado==1)
{
sprite_index=spr_pul_dir;
}
if (vspeed>0) || (vspeed<0) && (lado==0)
{
sprite_index=spr_pul_esq;
}
}



Última edição por biscoito em Qua 07 Mar 2012, 13:10, editado 1 vez(es)

biscoito

Número de Mensagens : 181
Idade : 20
Data de inscrição : 07/06/2008
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Problema mudança de sprite no ataque [Plataforma]

Mensagem por saim em Seg 05 Mar 2012, 15:26

Bom, tá na cara que esse código está no step.

Olha só:
Código:
//atacar
if (keyboard_check(vk_space)) && ! (keyboard_check(vk_left)) && ! (keyboard_check(vk_right)){
atacando=true }else
{atacando=false}
Essas linhas mudam a variável "atacando" pra "true" ENQUANTO você estiver, ao mesmo tempo, com o epaço apertado, a seta pra esquerda solta e a seta pra direita solta. Se você solta o espaço ou aperta qualquer direção, "atacando" volta pra false.

A parte que escolhe os sprites também está com um probleminha. Você fechou o colchete do "if (noar==false)" antes do else, então o "else" está se referindo ao "if (atacando==true) && (lado==1)". Deveria ser ao "if (noar==false)", mesmo. Parece que basta deslocar o colchete que fecha mais pra baixo.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Problema mudança de sprite no ataque [Plataforma]

Mensagem por biscoito em Seg 05 Mar 2012, 15:37

Agr ele nao ataca mais enquanto pula... oq eu qeria mesmo é que quando eu apertasse space, o yoshi fizesse a animaçao do ataque(sair a lingua de sua boca e voltar)e quando a animaçao acabar voltar ao normal, mas nao tenho ideia de como fazer isso.
Vc baixou a engine?

biscoito

Número de Mensagens : 181
Idade : 20
Data de inscrição : 07/06/2008
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Problema mudança de sprite no ataque [Plataforma]

Mensagem por saim em Seg 05 Mar 2012, 17:33

Não, nem vi link pra baixar. Não era esperado mesmo que o yoshi continuasse atacando no ar. Pra isso, você tem que mudar toda a estrutura do código na parte que define a sprite. Comece com "if (atacando==false)", passe por todas as opções dele estar atacando e depois vá pra "else" e passe por todas as opções de novo.

Uma forma de manter a animação até o fim é não mudar atacando pra false no step, mas no animation_end. Você coloca, nesse evento,
Código:
if sprite_index==spr_atacando or sprite_index==seilá{
atacando = false
}

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Problema mudança de sprite no ataque [Plataforma]

Mensagem por biscoito em Seg 05 Mar 2012, 19:33

então eu teria que criar um evento animation end, e ne colocar esse codigo?
o link esta no final...

biscoito

Número de Mensagens : 181
Idade : 20
Data de inscrição : 07/06/2008
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Problema mudança de sprite no ataque [Plataforma]

Mensagem por saim em Ter 06 Mar 2012, 09:10

Ah, tá, tem o link sim. Passei batido.
Se você copiar e colar o código, ele não vai funcionar. Você tem é que prever todos os sprites de ataque possíveis pro yoshi estar sendo animado. Eu não sei quais são. No animation_end, o que você vai dizer pra máquina é "se estiver com qualquer sprite de ataque, já que terminou a animação, a variável 'atacando' passa a valer 'false'".

Lembrando que, no step, você pára de mudar "atacando" pra "false".

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Problema mudança de sprite no ataque [Plataforma]

Mensagem por biscoito em Ter 06 Mar 2012, 12:37

entao cara... tentei fazer desse jeito, mas ele nao vai... a animaçao do yoshi atacando só fica no 1 frame...
O que ele deveria fazer seria, mudar para o spr_atac e a hora que a animaçao acabar ele voltaria ao sprite normal. o problema é q eu nao estou usando um obj_player_atac, estou usando só o obj_player que faz todas as outras funçoes, se eu adicionar um animation end ele vai fazer isso para todos os sprites...
Vc viu a engine como está?

biscoito

Número de Mensagens : 181
Idade : 20
Data de inscrição : 07/06/2008
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Problema mudança de sprite no ataque [Plataforma]

Mensagem por saim em Ter 06 Mar 2012, 14:36

Não vi a engine. Daqui, eu não tenho como baixar. Mas o problema já está (ou parece estar) claro, pra mim.

Não tem problema usar um objeto só, mas você tem que pensar em como estará cada variável a cada step, tem que ver se uma tem relação com a outra, etc.
Usar animation_end deveria funcionar. Ele não vai fazer isso pra todos os sprites se você verificar o sprite index no evento. Que nem eu coloquei no código de exemplo. if (sprite_index == seiláonome){ação}. Daí, se o sprite_index não for aquele do "if", o evento não faz nada.

Eu digo pra fazer isso porque no step tem uma ação que define "atacando" como false se o botão não estiver apertado e, no mesmo step, mais pro final, você verifica se atacando é true ou false e muda a sprite em função disso. Então, se você soltar o botão de ataque, "atacando" passa a valer "false" e a sprite deixa de ser a de atacar.
Minha idéia é que você tranque a variável em "true" até o final da animação, independente do botão estar apertado ou não, pra que aí, só quando o ataque estiver completo, ele pare de atacar e use a sprite normal.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Problema mudança de sprite no ataque [Plataforma]

Mensagem por biscoito em Ter 06 Mar 2012, 14:40

siim entendi... como eu identifico se ja acabou ou nao a animaçao? por exemplo:
if (acabou_animaçao) {
atacando= false
}
tem alguma ideia?

biscoito

Número de Mensagens : 181
Idade : 20
Data de inscrição : 07/06/2008
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Problema mudança de sprite no ataque [Plataforma]

Mensagem por saim em Ter 06 Mar 2012, 14:47

O evento animation_end. Ele só acontece quando a animação acaba. E, se você ainda não entendeu o que eu quis dizer com aquele código, estive pensando aqui e cheguei à conclusão que nem precisa. Não tem problema definir atacando como false no final de cada animação, esteja o yoshi atacando ou não.
Simplesmente tire "atacando = false" do step e coloque no animation_end. Teste. Conte.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Problema mudança de sprite no ataque [Plataforma]

Mensagem por biscoito em Ter 06 Mar 2012, 14:50

Não funcionou.. eu consegui aqui com que ele atacasse... mas a animaçao nao continua, ela fica parada no frame 1 do sprite, isso eu nao estou entendendo...

EDIT: agr meu codigo está assim:
Código:
if (keyboard_check(vk_left)) &&  (keyboard_check(vk_right))
{parado=true; andando=false; atacando=false}
if (keyboard_check(vk_left)) && ! (keyboard_check(vk_right)) && (place_free(x-5,y))
{x-=5; lado=1; andando=true; parado=false ; atacando=false; abaixado=false
}
if (keyboard_check(vk_right)) && ! (keyboard_check(vk_left)) && (place_free(x+5,y)) 
{x+=5; lado=0; andando=true; parado=false; atacando=false; abaixado=false
}

if ! (keyboard_check(vk_left)) && ! (keyboard_check(vk_right)) 
{andando=false; parado=true; atacando=false; abaixado=false
}
//abaixar
if (keyboard_check(vk_down)) && (noar=false) && ! (keyboard_check(vk_left)) && ! (keyboard_check(vk_right))
{andando=false; parado=true; atacando=false abaixado=true}
//atacar
if (keyboard_check(vk_space)) && parado=true{
atacando=true }

//Sprites
{if (noar==false)

{
if (andando=true) && (lado==0) 
{
sprite_index=spr_and_dir;
}
if (andando=true) && (lado==1)
{
sprite_index=spr_and_esq;
}
if (andando==false) && (parado==true) && (lado==0)
{
sprite_index=spr_par_dir;
}
if (andando==false) && (parado==true) && (lado==1)
{
sprite_index=spr_par_esq;
}
if (atacando==true) && (lado==1)
{sprite_index=spr_atac_esq}

if (atacando==true) && (lado==0)
{sprite_index=spr_atac_dir}
}
if (abaixado==true) && (lado==0)
{sprite_index=spr_bai_dir}
if (abaixado==true) && (lado== 1)
{sprite_index=spr_bai_esq}

else
{
if (vspeed<0) && (lado==0)
{
sprite_index=spr_pul_dir;
}
if  (vspeed<0) && (lado==1)
{
sprite_index=spr_pul_esq;
}
if (vspeed>0) && (lado==0)
{sprite_index=spr_caindo_dir}
if (vspeed>0) && (lado==1)
{sprite_index=spr_caindo_esq}
}}
Ele muda para o sprite de ataque enquanto eu aperto space, quando eu solto ele volta ao normal, entretando o sprite de ataque nao muda de frame(nao faz o movimento de sair a lingua) só aparece o 1 movimento.

biscoito

Número de Mensagens : 181
Idade : 20
Data de inscrição : 07/06/2008
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Problema mudança de sprite no ataque [Plataforma]

Mensagem por saim em Ter 06 Mar 2012, 17:09

Sério? Complicou...
Onde você define o image_speed? As outras animações (dele andando)rodam direitinho? Como está o animation_end?

Talvez seja porque a sprite é definida a cada step e, com isso, a image_index esteja voltando pra zero, mas eu tenho a impressão que isso não deveria acontecer. Se as outras sprites estiverem rodando direitinho, nem precisa checar.

Gozado que ele ainda volta pra sprite normal, o que só deveria acontecer no final da animação... Espera, tem alguma coisa no seu draw_event? Algo como draw_sprite(sprite_index, 0, x, y)? Se for exatamente isso, troque o "0" pelo "image_index"

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Problema mudança de sprite no ataque [Plataforma]

Mensagem por biscoito em Ter 06 Mar 2012, 17:11

nao tem nada cara... as outras sprites estao com o movimento correto... o problema é só no sprite de ataque... quer que eu te mande o gmk novo dele?

biscoito

Número de Mensagens : 181
Idade : 20
Data de inscrição : 07/06/2008
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Problema mudança de sprite no ataque [Plataforma]

Mensagem por saim em Qua 07 Mar 2012, 08:19

Era o que eu temia, a sprite está sendo re-definida a cada step. Não é o animation_end que está fazendo ela voltar ao normal, ela está mudando pra uma outra sprite (provavelmente a sprite do bicho parado) e voltando pra sprite de ataque, tudo no mesmo step.
Isso deve estar fazendo com que o image_index seja retornado pra zero, porque o game maker faz isso, toda vez que muda o sprite_index, o image_index cai pra zero.
Solução: prever formas do jogo NÃO encontrar as condições pra mudar de sprite até acabar a animação.

Como eu me dei o trabalho de refazer o código, coloco ele aqui pra você. Eu chequei se "atacando" era false antes de mudar cada uma das situações, antes de verificar os sprites. Além disso, redefini cada uma das variáveis quando atacar, pra que as definições de sprite não aconteçam quando o personagem estiver atacando.
Funcionou, mas achei meio gambiarra. Sugiro dar uma lida num tutorial a respeito de máquinas de estados finitos. Eu tenho um na minha assinatura. As MEF são uma solução excelente pra quando você tem muitas situações (estados) pro mesmo objeto, o que é exatamente seu caso.

Código:
if (keyboard_check(vk_left)) &&  (keyboard_check(vk_right) && (atacando == false)){
   parado = true; andando = false; atacando = false;
   }
if (keyboard_check(vk_left)) && ! (keyboard_check(vk_right)) && (place_free(x-5,y) && (atacando == false)) {
   x -= 5; lado = 1; andando = true; parado = false ; atacando = false; abaixado = false;
   }
if (keyboard_check(vk_right)) && ! (keyboard_check(vk_left)) && (place_free(x+5,y) && (atacando == false)) {
   x += 5; lado = 0; andando = true; parado = false; atacando = false; abaixado = false;
   }
if ! (keyboard_check(vk_left)) && ! (keyboard_check(vk_right))  && (atacando == false){
   andando = false; parado = true; atacando = false; abaixado = false;
   }
//abaixar
if (keyboard_check(vk_down)) && (noar = false) && ! (keyboard_check(vk_left)) && ! (keyboard_check(vk_right)) && (atacando == false){
   andando = false; parado = true; atacando = false; abaixado = true;
   }
//atacar
if (keyboard_check(vk_space)) && parado = true {
   atacando = true; andando = false;  parado = false ;
   }

//Sprites
{
// if (atacando == true){
   // if (lado == 1){
      // sprite_index = spr_atac_esq
      // }
      // else {
         // sprite_index = spr_atac_dir;
         // }
   // }
if (noar == false) {
   if (andando = true) && (lado == 0) {
      sprite_index = spr_and_dir;
      }
   if (andando = true) && (lado == 1) {
      sprite_index = spr_and_esq;
      }
   if (andando == false) && (parado == true) && (lado == 0) {
      sprite_index = spr_par_dir;
      }
   if (andando == false) && (parado == true) && (lado == 1) {
      sprite_index = spr_par_esq;
      }
   if (atacando == true) && (lado == 1){
      sprite_index = spr_atac_esq
      }
   if (atacando == true) && (lado == 0){
      sprite_index = spr_atac_dir;
      }
   }
if (abaixado == true) && (lado == 0){
   sprite_index = spr_bai_dir
   }
if (abaixado == true) && (lado ==  1){
   sprite_index = spr_bai_esq
   }
   else {
      if (vspeed<0) && (lado == 0) {
         sprite_index = spr_pul_dir;
         }
      if  (vspeed<0) && (lado == 1) {
         sprite_index = spr_pul_esq;
         }
      if (vspeed>0) && (lado == 0){
         sprite_index = spr_caindo_dir
         }
      if (vspeed>0) && (lado == 1){
         sprite_index = spr_caindo_esq
         }
      }
}

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Problema mudança de sprite no ataque [Plataforma]

Mensagem por biscoito em Qua 07 Mar 2012, 12:40

Sim agora funcionou.. mas ele fica atacando somente... como faço para ele fazer a animaçao do ataque e quando essa animaçao acabar ele voltar ao normal?
pois agora ele fica atacando enquanto eu deixo o space apertado, eu qeria que ele atacasse somente uma vez...

EDIT: Resolvi o problema... a animaçao continuava, entao coloquei um alarm para que dps de algum tempo o atacando virasse falso. eu calculei o tempo e coloquei no alarm. Então ele ataca e dps de 1segundo(alarm=10) a var atacando vira false e ele volta ao sprite normal!
Muito obrigaado !!

biscoito

Número de Mensagens : 181
Idade : 20
Data de inscrição : 07/06/2008
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Problema mudança de sprite no ataque [Plataforma]

Mensagem por saim em Qua 07 Mar 2012, 14:05

Como eu disse umas 3 vezes e achei que já estava incorporado ao objeto, o evento animation_end é mais adequado pra parar a animação do que o alarm, mas se você está feliz, eu estou feliz. Smile

Agora, sério, dê uma olhada em máquinas de estados finitos. O conceito é mais simples do que parece e o ganho em simplicidade é imenso. Você deve gastar de 20 minutos a duas horas estudando (depende da bagagem que você tenha) e isso vai te economizar alguns séculos resolvendo bugs como esse.

Como a dúvida foi resolvida, o tópico está sendo trancado. Se quiser reabrir, entre em contato com a moderação.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Problema mudança de sprite no ataque [Plataforma]

Mensagem por Conteúdo patrocinado Hoje à(s) 10:12


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum