Анимации AnimationPlayer не воспроизводятся в Godot - PullRequest
0 голосов
/ 07 апреля 2020

Предисловия

Во-первых, я знаю, что размещение графических ресурсов для кодов на этой платформе не рекомендуется. Я также опубликую код, но в данном конкретном случае я думаю, что опубликовать видео о нем гораздо полезнее, чем просто опубликовать произвольный код, потому что структура игровых проектов действительно варьируется в зависимости от их требований. Тем не менее, я все еще уважаю правила платформы, поэтому, если мод просит меня отформатировать мой вопрос в соответствии с правилами сообщества, я могу это сделать, или они также могут просто удалить мой вопрос. Я уважаю это.

Проблема

На самом деле это простая проблема, но она сводит меня с ума из-за своей простоты. Я просто хочу постепенно появиться, когда я загружаю сцену, а затем исчезать всякий раз, когда я нажимаю кнопку. Что касается того, как я это делаю, это видео об этом .

Подводя итог, я загружаю другую сцену под названием "Fader", которая содержит ColorRect с черным цветом и AnimationPlayer для изменения альфа-значения ColorRect.

Ниже приведен код с дополнительными комментариями к соответствующим частям:

using Godot;
using System;

public class TitleScreen : Control
{
    private Button[] buttons;
    private Control fader;  // the scene that I inject

    public override void _Ready()  // when title screen gets ready
    {
        GD.Print("Preparing TitleScreen...");
        InitButtons();
        InitFader();  // initialize fader
        FadeIn();  // do fade in animation
    }

    private void InitFader()  // initializing fader
    {
        GD.Print("Initializing fader...");
        var faderScene = (PackedScene)ResourceLoader.Load("res://components/Fader.tscn");  // load external fader scene
        fader = (Control)faderScene.Instance();  // instantiate the scene
        fader.SetSize(OS.WindowSize);  // set the size of fader scene to the game window, just in case
        var rect = (ColorRect)fader.GetNode("rect");  // get "rect" child from fader scene
        rect.SetSize(OS.WindowSize);  // set "rect" size to the game window as well, just in case
        fader.Visible = false;  // set the visibility to false
        AddChild(fader);  // add initialized fader scene as a child of title screen
    }

    private void InitButtons()
    {
        GD.Print("Initializing buttons...");
        buttons = new Button[3]{
            (Button)GetNode("menu_container/leftmenu_container/menu/start_button"),
            (Button)GetNode("menu_container/leftmenu_container/menu/continue_button"),
            (Button)GetNode("menu_container/leftmenu_container/menu/exit_button"),
        };

        GD.Print("Adding events to buttons...");
        buttons[0].Connect("pressed", this, "_StartGame");
        buttons[2].Connect("pressed", this, "_QuitGame");
    }

    private void FadeIn()
    {
        GD.Print("Fading in...");
        fader.Visible = true;  // set visibility of fader to true
        var player = (AnimationPlayer)fader.GetNode("player");  // get animation player
        player.Play("FadeIn");  // play FadeIn animation
        fader.Visible = false;  // set visibility of fader to false
    }

    private void FadeOut()
    {
        // similar to FadeIn
        GD.Print("Fading out...");
        fader.Visible = true;
        var player = (AnimationPlayer)fader.GetNode("player");
        player.Play("FadeOut");
        fader.Visible = false;
    }

    public void _StartGame()  // whenever I click start game button
    {
        FadeOut();  // fade out
        GetTree().ChangeScene("res://stages/Demo01.tscn");
    }

    public void _QuitGame()  // whenever I click quit game button
    {
        FadeOut();  // fade out
        GetTree().Quit();
    }
}

Похоже, я чего-то не вижу. Почему он не исчезает и не исчезает?


Среда

  • Manjaro 19.0.2
  • Mono JIT Compiler 6.4.0 (если это актуально)
  • Годо 3,2

1 Ответ

1 голос
/ 08 апреля 2020

Итак, проблема заключалась в Play методе на AnimationPlayer объекте вроде , работающем как asyn c (не знаю, правильный ли это термин для него).

К счастью, В Godot есть функция, называемая сигналов . На объектах AnimationPlayer имеются сигналы animation_started и animation_finished. По сути, я создал сценарий C# для сцены Фейдера, подключил сигналы от player до fader, например:

  • animation_started до _FaderAnimationStart
  • animation_finished до _FaderAnimationEnd

В конце мой скрипт выглядит следующим образом:

using Godot;
using System;

public class Fader : Control
{
    private ColorRect rect;
    private AnimationPlayer player;

    public override void _Ready()
    {
        GD.Print("Initializing Fader...");

        rect = (ColorRect)GetNode("rect");
        player = (AnimationPlayer)GetNode("player");

        SetSize(OS.WindowSize);
        rect.SetSize(OS.WindowSize);

        Visible = false;
    }

    private void _FaderAnimationStart(String anim_name)
    {
        Visible = true;
    }

    private void _FaderAnimationEnd(String anim_name)
    {
        Visible = false;
    }
}

Я решил это благодаря njamster ответ и Ханс Пассант комментарий .

Однако это решает только половину проблемы. Да, сцена теперь исчезает при загрузке, но не исчезает. Учитывая, что он выполняет своего рода asyn c (опять же, я не уверен, что это правильный термин), изменение прерываний сцены во время запуска анимации. Я также обновлю ответ, когда решу эту проблему.

Обновление

Что ж, я не могу решить проблему с затуханием, потому что она требует доступа к родительскому узлу из инициализированной детской сцены. Есть несколько методов, о которых я могу подумать.

Первый - это каким-то образом параметризовать сцену "Fader". Это можно сделать разными способами, но в конце, когда вы инициализируете его из другой сцены, вам нужно привести его к Fader, и я не знаю, является ли это верным способом сделать это. Другой проблемой является стандартизация этого в кодовой базе. Подобный метод обсуждается в здесь .

Второй способ - написать его в виде плагина , который имеет свои преимущества и недостатки. C# в этой конкретной области не испытан в бою.

Третий - использование системы управления государством. Вот реализация redux для Godot. И вам нужно каким-то образом интегрировать его для сигналов, что кажется хлопотным.

Итак, в общем, я до сих пор не знаю, как исчезнуть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...