SKAction.WaitForDuration的Xamarin/C++中的完成处理程序是什么样子的

What does a completion handler look like in Xamarin/C++ for SKAction.WaitForDuration?

本文关键字:程序 处理 什么样 Xamarin WaitForDuration C++ SKAction      更新时间:2023-10-16

我正试图在我的Xamarin SpriteKit游戏中实现一个Wait函数。我想让玩家在等待之前做一个胜利动画,然后加载下一个级别的游戏。到目前为止,Wait的实施还没有产生任何效果。

起初,我只是调用了玩家动画,然后是等待动作,然后构建了新的关卡,但等待不起作用:

SKAction Waiting = SKAction.WaitforDuration (2);
SKAction Victory;
var textures = Enumerable.Range (1,20).Select (
(i) => SKTexture.FromImageNamed (String.Format (player_victory_{0}", i))).ToArray ();
Victory = SKAction.RepeatAction (SKAction.AnimateWithTextures (textures, 0.04),1);
SelectedNode.RunAction (Victory);
SelectedNode.RunAction (Waiting);
BuildStage (Stage); //load new level

然后我尝试将等待堆叠成一个序列(同样,它不会等待):

SKAction Waiting = SKAction.WaitforDuration (2);
SKAction Victory;
int Stage;
var textures = Enumerable.Range (1,20).Select (
(i) => SKTexture.FromImageNamed (String.Format (player_victory_{0}", i))).ToArray ();
Victory = SKAction.RepeatAction (SKAction.AnimateWithTextures (textures, 0.04),1);
Sequence = SKAction.Sequence (new SKAction [] {Victory,Waiting});
public void CheckGoal (SKSpriteNote SelectedNode)
{
//extra code that confirms Goal
SelectedNode.RunAction (Sequence);
Stage = Stage + 1;
RemoveAllChildren();
BuildStage (Stage);

我读到这篇文章,仅仅因为代码是顺序的,并不意味着它会等到上一次调用完成,我需要一个完成处理程序。

我在Swift的SO上找到了类似的问题/答案,但我还不够熟练,无法将其转换为Xamarin/C++解决方案。如有任何帮助,我们将不胜感激。

我最初的问题没有答案,但我现在确实有一个变通办法,那就是做这项工作。我仍然热衷于学习SKAction完成代码,但现在必须这样做。

using System.Threading.Tasks
public void CheckGoal (SKSpriteNote SelectedNode)
{
//extra code that confirms Goal
SelectedNode.RunAction (Victory); //animation plays for .8 seconds
await Task.Delay (1500); //waits here for 1.5 seconds, allowing animation to play plus some buffer time
Stage = Stage + 1;
RemoveAllChildren();
BuildStage (Stage);
}

不熟悉您正在使用的Xamarin或C++语法,但这应该会让您接近。您与序列非常接近,但您需要将您希望它在序列末尾执行的操作构建到序列中。runBlock应该能帮你完成任务。

SKAction customBlock = SKAction.runBlock({
            Stage = Stage + 1
            RemoveAllChildren()
            BuildStage (Stage)
        })
Sequence = SKAction.Sequence (new SKAction [] {Victory,Waiting, customBlock});
public void CheckGoal (SKSpriteNote SelectedNode)
{
    //extra code that confirms Goal
    SelectedNode.RunAction (Sequence);
}

希望这是有意义和有用的。