O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

[VXAce] Como usar wait no Scene_Map?

Iniciado por Conspiracy, 08/09/2016 às 04:27

08/09/2016 às 04:27 Última edição: 10/09/2016 às 16:22 por Conspiracy
Então, minha dúvida é bem direta, como diz o tópico
Basicamente, quero mostrar uma animação, mas espera-la terminar. (No caso é para um ABS).
Estou modificando o SAS - IV para isso.
Segue um trecho código da minha função:
class Game_Player < Game_Character
  def attack
    if $game_switches[5]
      if !$posx_time.empty? && $cooldown_time <= 0
        $game_player.animation_id = 2
        $game_troop.interpreter.wait(5)
        RPG::SE.new("Wind7", 100, 100).play

        $game_player.animation_id = 3

No caso, sem o wait ele roda ambos (as duas animações e o som) ao mesmo tempo.
Como a função existe na Game_Interpreter, tentei chamá-la. Mas ocorre o seguinte erro.
"FiberError: Cannot yield from root fiber".
Não entendo muito disto, mas acredito que é por estar na Scene_Map (E não ter nenhum "parente").
Não faço a menor ideia de como resolver isso. E como o sistema trabalha todo por script, pelo menos por agora, estou correndo da ideia de ir para os eventos comuns.
Writing codes. Writing novels. Writing... Fates.

Veja se isso atende:

Spoiler

sleep(5)
[close]

Citação de: Resque online 09/09/2016 às 00:09
Veja se isso atende:

Spoiler

sleep(5)
[close]
Valeu a sugestão, mas, já esperava que não funcionasse. Testei só pra confirmar mesmo. No caso o sleep para o jogo inteiro. (Gera um "freeze").
Writing codes. Writing novels. Writing... Fates.

Sim.

Cara, se conseguir aguardar um pouco, eu consigo fazer um script de "wait" para você.

Deixa só eu arrumar um tempo livre.

Citação de: Resque online 09/09/2016 às 15:05
Sim.

Cara, se conseguir aguardar um pouco, eu consigo fazer um script de "wait" para você.

Deixa só eu arrumar um tempo livre.
Dei uma fuçada na API do Ruby e não consegui.
Se não for te atrapalhar, fique a vontade. Perguntei por achar que fosse algo simples.
Por enquanto estou tentando um jeito de não usar o 'wait' e não ficar estranho.
Agradeço sua disposição, vou aguardar então.
Writing codes. Writing novels. Writing... Fates.

10/09/2016 às 04:37 #5 Última edição: 10/09/2016 às 04:53 por tonyhart
Não sei qual o seu conhecimento de programção, e eu não programo em ruby, mas posso te passar uma lógica:

O codigo possui umas variaveis de controle que vc usa pra dizer que a animacao deve comecar e em quantos frames deve comecar... Qualquer dúvida só falar

    var mostrarAnimacao = false;
    var waitFramesAnimacao = 0;

    function metodoUpdateDoRpgMaker() { // Metodo update, no Ace nao sei dizer qual é, vc deve saber
        //[...]
        if(mostrarAnimacao === true) { // Se mostrarAnimacao for verdadeiro
            waitFramesAnimacao--; // Diminuir o contador de frames da animacao
            if(waitFramesAnimacao == 0) { // Se o contador chegar a zero
                RPG::SE.new("Wind7", 100, 100).play // executa animacao
                mostrarAnimacao = false; // Finaliza animacao
            }
        }
        //[...]
    }


    function funcaoAttackQueVocePostouNoTopico() {
        //[...]
        $game_player.animation_id = 2
        // $game_troop.interpreter.wait(5)
        // RPG::SE.new("Wind7", 100, 100).play Ao inves de tocar animacao
        mostrarAnimacao = true; // Dizer que vc quer iniciar animacao
        waitFramesAnimacao = 32; // Dizer em quantos frames vc quer que a animacao seja executada
        //[...]
    }
Born in 95 to die

10/09/2016 às 13:29 #6 Última edição: 10/09/2016 às 16:22 por Conspiracy
Vou dar uma olhada nessa lógica...
Volto e dou um edit se conseguir.

@EDIT:
Citação de: tonyhart online 10/09/2016 às 04:37
Não sei qual o seu conhecimento de programção, e eu não programo em ruby, mas posso te passar uma lógica:

O codigo possui umas variaveis de controle que vc usa pra dizer que a animacao deve comecar e em quantos frames deve comecar... Qualquer dúvida só falar

Spoiler
    var mostrarAnimacao = false;
    var waitFramesAnimacao = 0;

    function metodoUpdateDoRpgMaker() { // Metodo update, no Ace nao sei dizer qual é, vc deve saber
        //[...]
        if(mostrarAnimacao === true) { // Se mostrarAnimacao for verdadeiro
            waitFramesAnimacao--; // Diminuir o contador de frames da animacao
            if(waitFramesAnimacao == 0) { // Se o contador chegar a zero
                RPG::SE.new("Wind7", 100, 100).play // executa animacao
                mostrarAnimacao = false; // Finaliza animacao
            }
        }
        //[...]
    }


    function funcaoAttackQueVocePostouNoTopico() {
        //[...]
        $game_player.animation_id = 2
        // $game_troop.interpreter.wait(5)
        // RPG::SE.new("Wind7", 100, 100).play Ao inves de tocar animacao
        mostrarAnimacao = true; // Dizer que vc quer iniciar animacao
        waitFramesAnimacao = 32; // Dizer em quantos frames vc quer que a animacao seja executada
        //[...]
    }
[close]
Consegui aqui (Também não programo ruby, mas to aprendendo, enfim).
Dei uma modificada na game_map (que seria a GameMap do MV). Agora estou só adaptando os tempos da animações pra corrigir a gambiarra que tinha feito. Mas deu certo, Obrigado!



Citação de: Resque online 09/09/2016 às 15:05
Sim.

Cara, se conseguir aguardar um pouco, eu consigo fazer um script de "wait" para você.

Deixa só eu arrumar um tempo livre.
Well, Bom, como já foi citado, consegui seguindo a lógica do [user]tonyhart[/user], mas agradeço o esforço.
Writing codes. Writing novels. Writing... Fates.