Página 1 de 3

Dúvida sobre animações de batalha

Enviado: Sex Set 21, 2018 3:01 am
por DarlesLSF
Boa noite,
Gostaria de saber como faço as animações de batalha no GM? No caso, das magias. Segue abaixo um exemplo de um jogo que fiz no rpg maker (quando eu uso Golpe Flamejante):
Imagem
A animação que me refiro é a das chamas.
Devo pegar o spritesheet dessas chamas e montar os frames ou há um programa que eu possa usar pra montar a animação e depois importá-la para o GM?

Re: Dúvida sobre animações de batalha

Enviado: Sex Set 21, 2018 11:17 am
por All-x
Há várias maneiras de fazer isso. A mais fácil:
  • Pegar uma sprite animada do fogo.
  • Criar um objeto eff_fogo e colocar a sprite acima.
  • No evento Other -> Animation End colocar:

    Código: Selecionar todos

    instance_destroy();
  • E criar esse objeto quando o ataque ocorrer usando instance_create.

Re: Dúvida sobre animações de batalha

Enviado: Sex Set 21, 2018 11:52 am
por DarlesLSF
Testei aqui e acontece esse erro:
Imagem

Abaixo o código:

Código: Selecionar todos

if (global.atacando_inimigos == true) && (global.inimigo_atual == 1)
{   
    var posxplayer = obj_player.x;
    var posyplayer = obj_player.y;
    global.aff_normal = false;
    sprite_index = spr_aff_atacando1;
    image_speed = spd;
    if distance_to_point(obj_inimigo1.x, obj_inimigo1.y) > 70
    {
        move_towards_point(obj_inimigo1.x - 70, obj_inimigo1.y  + 20, 20);
    } 
        else 
        { 
            speed = 0;
            sprite_index = spr_aff_atacando2;
            instance_create(obj_inimigo1.x, obj_inimigo1.y, anima_ataque_normal);
            move_towards_point(posxplayer, posyplayer, 20);
            global.atacando_inimigos = false;
            global.aff_normal = true;
                                       
        }
    
}
Mesmo colocando o distance_to_point, ele passa reto.

Re: Dúvida sobre animações de batalha

Enviado: Sex Set 21, 2018 1:02 pm
por Midgard
,[

Código: Selecionar todos

var posxplayer = obj_player.x;
    var posyplayer = obj_player.y;

Código: Selecionar todos

 move_towards_point(posxplayer, posyplayer, 20);
Pelo que entendi depois da primeira movimentação, digamos na segunda verificação, ele atualizou a posição do obj_player com a posição atual depois do move_towards, enquanto o valor global.atacando_inimigos == true ele atualiza as variáveis, recebendo a mesma posição e adicionado a velocidade 20, ou seja, ele não retornou para posição inicial, por isso continuo para a direita.
Acho que é isso que está acontecendo.

Re: Dúvida sobre animações de batalha

Enviado: Sáb Set 22, 2018 3:50 am
por DarlesLSF
Midgard escreveu: Pelo que entendi depois da primeira movimentação, digamos na segunda verificação, ele atualizou a posição do obj_player com a posição atual depois do move_towards, enquanto o valor global.atacando_inimigos == true ele atualiza as variáveis, recebendo a mesma posição e adicionado a velocidade 20, ou seja, ele não retornou para posição inicial, por isso continuo para a direita.
Acho que é isso que está acontecendo.
Eu tirei as variáveis do step event e coloquei elas como global no create event. Agora o jogador vai até o monstro, ataca e volta. O problema é que ele não tá parando na volta agora, passa reto da posição que é pra ir. Segue o código:
global.posxaff e posyaff são criadas em outro objeto no início da batalha, pra pegar a localização inicial do jogador.

Código: Selecionar todos

if (distance_to_point(global.posxaff, global.posyaff)) > 0 
    {
        move_towards_point(global.posxaff, global.posyaff, 20);
    }
    else
    {
        speed = 0;
        global.aff_normal = true;
        with (obj_inimigo1)
        {
            image_blend = c_white;
        }
    
    }
E aqui o que acontece:
Imagem

Re: Dúvida sobre animações de batalha

Enviado: Dom Set 23, 2018 1:16 am
por None
O jeito mais simples seria dividir o seu código em avançando (ou atacando) e voltando.
O de avançar já esta feito, só poderia estar um pouco mais bem organizado.
O que você faria é garantir que ao final da animação (eu não vi no código como você esta lidando com a animação) ele iria para o momento de voltando.
Você pode lidar ele do jeito que esta lidando, e fazer o teste usando o xstart e o ystart, se o x - xstart < 20 (por exemplo) então x = xstart, desta forma ele volta para a posição inicial, eu usaria um lerp para não deixar forçada a transição, mas isso é um detalhe.
depois de definir o x = xstart e o y = ystart você tira ele do voltando, e pronto ele deve ficar parado.

Depois dê uma olhada neste vídeo
https://youtu.be/irDKx_vCYsE

Eu não sei como você esta lidando com a animação, mas aconselho a NESTE caso não usar o evento animation end, o vídeo que vem depois do que eu postei mostra uma maneira mais controlada de lidar com o final e o inicio da animação.

Você não precisa (e tecnicamente não deveria) tornar as variáveis globais, o escopo delas já abrange todo o player, basta cria-las (sem o var) dentro do create event, variáveis globais geralmente são criadas para que outros objetos possam acessa-las.

Re: Dúvida sobre animações de batalha

Enviado: Dom Set 23, 2018 8:49 am
por DarlesLSF
Então, a animação ela tá separada.
Aqui seria a parte em que o jogador ataca:

Código: Selecionar todos

if (global.atacando_inimigos == true) && (global.inimigo_atual == 1)
    {   
        global.aff_poses = 0;
        sprite_index = spr_aff_atacando1;
        image_speed = spd;
        if distance_to_point(obj_inimigo1.x, obj_inimigo1.y) > 70
        {
            move_towards_point(obj_inimigo1.x - 50, obj_inimigo1.y  + 20, 18);
        } 
        else 
        { 
            speed = 0;
            sprite_index = spr_aff_atacando2; 
            instance_create(obj_inimigo1.x - 20, obj_inimigo1.y, anima_ataque_normal);
            audio_play_sound(atacando_inimigo, 1, false);
            with (obj_inimigo1)
            {
            image_blend = c_red;
            }
            encerrandoatk = true;
            alarm[0] = .2 * room_speed; 
            global.atacando_inimigos = false;                           
        }    
    
}
E dentro do alarm[0], eu coloquei a parte em que ele volta do ataque:

Código: Selecionar todos

if (encerrandoatk == true) && (global.inimigo_atual == 1) // voltando do ataque
{   
    with (obj_inimigo1)
    {
        image_blend = c_white;
    }
    
        if (distance_to_point(global.posxaff, global.posyaff) > 1)
            {
                move_towards_point(global.posxaff, global.posyaff, 18);
            }
            else
            {
                speed = 0;
                if (health > (global.max_hp / 10) * 3)
                {
                    global.aff_poses = 1;
                }
                else
                {
                    global.aff_poses = 2;
                }
                encerrandoatk = false;
            }       
}
Como dito antes, o erro só acontece quando o jogador vai voltar. Mesmo depois que a distance_to_point fica <= 1, ele não para de andar e acaba saindo da tela.
Tentei usar o xstart e ystart, mas como o jogador é criado em outra room, ele pega outra posição. Onde eu deveria colocar essas variáveis?

Imagem

Re: Dúvida sobre animações de batalha

Enviado: Dom Set 23, 2018 3:29 pm
por Midgard
Você informou que colocou no alarm[0] o código abaixo, tenta ao invés de usar o alarm, adicionar no end step
E dentro do alarm[0], eu coloquei a parte em que ele volta do ataque:
Código:
if (encerrandoatk == true) && (global.inimigo_atual == 1) // voltando do ataque
{
with (obj_inimigo1)
{
image_blend = c_white;
}

if (distance_to_point(global.posxaff, global.posyaff) > 1)
{
move_towards_point(global.posxaff, global.posyaff, 18);
}
else
{
speed = 0;
if (health > (global.max_hp / 10) * 3)
{
global.aff_poses = 1;
}
else
{
global.aff_poses = 2;
}
encerrandoatk = false;
}
}

Re: Dúvida sobre animações de batalha

Enviado: Dom Set 23, 2018 3:46 pm
por DarlesLSF
Dessa vez deu certo, ele vai e volta. Só que agora ele ataca muito rápido e volta.
Imagem

Como faço pra ele atacar, esperar um pouco e voltar, como nos outro gifs que postei acima? E também, como faço pra voltar a animação?
To usando esse código pras "poses" do jogador durante a batalha:

Código: Selecionar todos

switch (global.aff_poses)
    {
    case 1:      // estado normal
        obj_player.sprite_index = spr_affbatalha;
        image_speed = 3.5;
        break;
    case 2:     // pouca vida
        obj_player.sprite_index = spr_aff_poucavida;
        image_speed = 3.5;
        break;
    case 3:    // morto
        obj_player.sprite_index = spr_affdeitado;
        image_speed = 3.5;
        break;
}

Re: Dúvida sobre animações de batalha

Enviado: Dom Set 23, 2018 4:04 pm
por Midgard
Para ele aguardar um pouco para voltar, observer o seguinte código que já havia feito anteriormente:

Código: Selecionar todos

encerrandoatk = true; 
alarm[0] = .2 * room_speed; 
Cria o alarm e dentro do alarm adiciona o valor true na variável encerrandoatk.

Assim a condição do end step só será iniciada quando encerrandoatk receber o valor depois do tempo determinado no alarm.

Sobre a animação não entendi muito bem, você diz, assim como no rpg maker aparecer novamente a seleção de ataque ou magia?

Re: Dúvida sobre animações de batalha

Enviado: Dom Set 23, 2018 6:53 pm
por DarlesLSF
Sobre a animação não entendi muito bem, você diz, assim como no rpg maker aparecer novamente a seleção de ataque ou magia?
Não. Observa quando ele entra na batalha, ele fica naquela sprite em posição de batalha, se mexendo, antes de atacar. Depois que ele volta do ataque, essa animação da sprite fica estática, não se mexe, mesmo eu colocando no código a image_speed = 3.5.

Outra coisa: eu achei meio "cagado" o jeito que o jogador volta depois que ataca, eu estava pensando em fazer ele pulando ao ponto inicial. Pra fazer isso, eu deveria usar criar um path em forma de meio circulo ou dá pra fazer isso usando o move_towards_point?

Re: Dúvida sobre animações de batalha

Enviado: Seg Set 24, 2018 12:27 am
por None
Para voltar a animação é só retornar a image_speed ao valor inicial.

O xstart e ystart são referentes apenas a room atual, teoricamente não haveria necessidade de criar uma variável para checar a posição, enfim.

Seu código possui uns problemas de abstração, você não pode NUNCA neste tipo de contexto se referir a um objeto diretamente.
Todas as vezes que você usou obj_inimigo1 você deve substituir por inimigo_atual, porque se não seu código inteiro vai estar referenciado um objeto especifico e caso na luta tenha algum outro inimigo ou duas instâncias do mesmo inimigo seu jogo vai dar problema (um exemplo é a cobra não mudando de cor).

A mesma lógica se aplica ao personagem principal, caso você queira herdar os códigos dele (ou duplicar mesmo) para outros herois você vai precisar parar de fazer referências absolutas e focar em referências relativas, você vai precisar tirar estas variaveis globais sobre a pose do herói e torna-las variaveis normais.

Sei que sua base são meus vídeos do youtube, mas conforme você for avançando na série você vai ver que eu foco nisso e explico como corrigir estes problemas, como aplicar a state machine (que deixa todo o trabalho MUITO mais fácil), mas este tipo de coisas é bom fazer antes de avançar muito no projeto.

Re: Dúvida sobre animações de batalha

Enviado: Seg Set 24, 2018 8:06 am
por DarlesLSF
None escreveu:Para voltar a animação é só retornar a image_speed ao valor inicial.

O xstart e ystart são referentes apenas a room atual, teoricamente não haveria necessidade de criar uma variável para checar a posição, enfim.

Seu código possui uns problemas de abstração, você não pode NUNCA neste tipo de contexto se referir a um objeto diretamente.
Todas as vezes que você usou obj_inimigo1 você deve substituir por inimigo_atual, porque se não seu código inteiro vai estar referenciado um objeto especifico e caso na luta tenha algum outro inimigo ou duas instâncias do mesmo inimigo seu jogo vai dar problema (um exemplo é a cobra não mudando de cor).

A mesma lógica se aplica ao personagem principal, caso você queira herdar os códigos dele (ou duplicar mesmo) para outros herois você vai precisar parar de fazer referências absolutas e focar em referências relativas, você vai precisar tirar estas variaveis globais sobre a pose do herói e torna-las variaveis normais.

Sei que sua base são meus vídeos do youtube, mas conforme você for avançando na série você vai ver que eu foco nisso e explico como corrigir estes problemas, como aplicar a state machine (que deixa todo o trabalho MUITO mais fácil), mas este tipo de coisas é bom fazer antes de avançar muito no projeto.
Muito obrigado pelas dicas, vou tentar adaptar tudo e melhorar kkk.
Sò fiquei na dúvida ainda quanto ao xstart e o ystart. Eu preciso declará-los no Create antes de usá-los ou posso simplesmente colocá-los dentro do código?

Re: Dúvida sobre animações de batalha

Enviado: Seg Set 24, 2018 11:40 am
por Zalliant
Sò fiquei na dúvida ainda quanto ao xstart e o ystart. Eu preciso declará-los no Create antes de usá-los ou posso simplesmente colocá-los dentro do código?
O xstart e o ystart é a posição inicial do objeto, não precisa declará - los não.
Também é possível altera - los.

Re: Dúvida sobre animações de batalha

Enviado: Ter Set 25, 2018 9:27 am
por DarlesLSF
Aproveitando o tópico, tem algum meio de fazer ele não voltar em linha reta, mas sim como o gráfico abaixo?
Imagem

Re: Dúvida sobre animações de batalha

Enviado: Ter Set 25, 2018 10:11 am
por Zalliant
Bom dia,
Huum, creio que poderia usar path amigo.
Dei uma experimentada, você pode criar um path:

Código: Selecionar todos

path_start(path,speed,endaction,absolute);
speed: A velocidade positiva faz ele seguir o caminho, já caso negativo é o inverso.
endaction: Ação final, aqui diz o que será feito quando for atingido a posição final, no caso 0 é para parar.
absolute: Diz se é relativo ao personagem ou a room, no caso false é relativo ao personagem.

Re: Dúvida sobre animações de batalha

Enviado: Ter Set 25, 2018 1:06 pm
por DarlesLSF
Zalliant escreveu:Bom dia,
Huum, creio que poderia usar path amigo.
Dei uma experimentada, você pode criar um path:

Código: Selecionar todos

path_start(path,speed,endaction,absolute);
speed: A velocidade positiva faz ele seguir o caminho, já caso negativo é o inverso.
endaction: Ação final, aqui diz o que será feito quando for atingido a posição final, no caso 0 é para parar.
absolute: Diz se é relativo ao personagem ou a room, no caso false é relativo ao personagem.
Conseguir fazer ele voltar do jeito que eu queria graças a sua ajuda. Obrigado mais uma vez :D

Re: Dúvida sobre animações de batalha

Enviado: Ter Set 25, 2018 1:26 pm
por Zalliant
Que isso amigo
DanielLSF, eu gostaria de ver como está indo o seu game, poderia nos enviar um .exe ?

Re: Dúvida sobre animações de batalha

Enviado: Ter Set 25, 2018 2:11 pm
por DarlesLSF
Zalliant escreveu:Que isso amigo
DanielLSF, eu gostaria de ver como está indo o seu game, poderia nos enviar um .exe ?
Por enquanto tô só montando o sistema de batalha, criei o mapa da batalha e o mapa que leva a batalha.
Faz pouco tempo que comecei a mexer no game maker. Antes eu usava o rpg maker, então tô meio que me baseando nele pra fazer as coisas no GM. Só que aqui há funções novas pra mim, que simplificam um eito de trabalho haha
Mas assim que eu finalizar essa parte, começo o enredo e posto aqui uma demo.

Re: Dúvida sobre animações de batalha

Enviado: Ter Set 25, 2018 2:28 pm
por Zalliant
Opa maravilha,
Qualquer duvida meu cara pode perguntar, caso eu não saiba há muito aqui melhores que eu.
Abraços