Actionscript 3 如何为actionscript 3的自上而下等轴测角色正确编码一组行走和空闲动画

Actionscript 3 如何为actionscript 3的自上而下等轴测角色正确编码一组行走和空闲动画,actionscript-3,animation,isometric,Actionscript 3,Animation,Isometric,我有一个自上而下的等距游戏的角色。角色将在八个方向上移动,因此有八个空闲动画和八个行走动画。我让行走动画工作[除了对角行走动画,我得到了这些动画的静止帧],但如果我尝试添加空闲动画,我的行走动画会完全停止 我试图让角色根据他们面对的方向进入空闲动画[比如,如果他们向左,空闲会向左,如果他们向上和向右,那么空闲会向上和向右,等等],但是如果我尝试任何类型的空闲代码,行走动画不会播放,且空闲始终仅在一个方向上 以下是到目前为止我成功完成的工作: private var speed = Num

我有一个自上而下的等距游戏的角色。角色将在八个方向上移动,因此有八个空闲动画和八个行走动画。我让行走动画工作[除了对角行走动画,我得到了这些动画的静止帧],但如果我尝试添加空闲动画,我的行走动画会完全停止

我试图让角色根据他们面对的方向进入空闲动画[比如,如果他们向左,空闲会向左,如果他们向上和向右,那么空闲会向上和向右,等等],但是如果我尝试任何类型的空闲代码,行走动画不会播放,且空闲始终仅在一个方向上

以下是到目前为止我成功完成的工作:

    private var speed = Number;
    private var kLeft:Boolean = false;      
    private var kRight:Boolean = false;     
    private var kUp:Boolean = false;        
    private var kDown:Boolean = false;

    //[misc code and listeners]

    private function onFrame(e:Event)
    {
        if (kLeft == true){
            this.x -= 2*speed;
            this.gotoAndStop("WalkSide");
            this.scaleX = -1;}
        if (kRight == true){
            this.x += 2*speed;
            this.gotoAndStop("WalkSide");
            this.scaleX = 1;}
        if (kUp == true){
            this.y -= 1.5*speed;
            this.gotoAndStop("WalkUp");}
        if (kDown == true){
            this.y += 1.5*speed;
            this.gotoAndStop("WalkDown");}

        if (kUp == true && kLeft == true){
            this.gotoAndStop("WalkUpdiagonal");
            this.scaleX = -1;}
        if (kUp == true && kRight == true){
            this.gotoAndStop("WalkUpdiagonal");
            this.scaleX = 1;}
        if (kDown == true && kLeft == true){
            this.gotoAndStop("WalkDowndiagonal");
            this.scaleX = -1;}
        if (kDown == true && kRight == true){
            this.gotoAndStop("WalkDowndiagonal");
            this.scaleX = 1;}
    }//onFrame

    private function keyPressed(k:KeyboardEvent)
    {
        if (k.keyCode == Keyboard.LEFT)
            kLeft = true;
        if (k.keyCode == Keyboard.RIGHT)
            kRight = true;
        if (k.keyCode == Keyboard.UP)
            kUp = true;
        if (k.keyCode == Keyboard.DOWN)
            kDown = true;           
    }//keypressed

    private function keyReleased(k:KeyboardEvent)
    {
        if (k.keyCode == Keyboard.LEFT)
            kLeft = false;
        if (k.keyCode == Keyboard.RIGHT)
            kRight = false;
        if (k.keyCode == Keyboard.UP)
            kUp = false;
        if (k.keyCode == Keyboard.DOWN)
            kDown = false;
    }//keyreleased
那么我如何添加编码,如果我释放[kLeft],那么IdleSide是可见的,等等


考虑到您当前的代码,您可以尝试的一种方法是分离方向处理和行走/空闲状态

现在,看起来你正在这样做: 在按键时设置一个布尔值,在回车框中检查该布尔值是否为真,然后沿该方向行走

相反,您可以这样做: 在您的案例中有一组方向状态布尔值,角色状态现在有两个布尔值,一个用于行走,一个用于空闲

按键后,您可以设置方向状态和角色状态,例如,从空闲到行走+向左。 释放关键点后,仅更新角色状态,并将方向状态从漫游状态保留为空闲状态。 然后,在enter frame循环中,可以查找方向和角色状态,以确定要播放的动画,该动画将是空闲+左


将来,如果您决定实现更多的字符状态,您可能会遇到一个问题,即有大量的标志/布尔值。。休息或跑步。在这一点上,也许值得对处理此问题的其他方法进行一些研究。

我建议您以更清晰、更有条理的方式重写代码。实现这一目标的最佳方法如下:

player_mc -> leftAnimation_mc -> "idle" keyframe -> leftIdle_mc
                              -> "walk" keyframe -> leftWalk_mc
          -> rightAnimation_mc-> "idle" keyframe -> rightIdle_mc
首先,为每个方向的动画创建一个电影剪辑容器,在本例中,我将只使用4个方向,因此我们将有:

左撇子 右图 UPU-mc 唐宁街 在每个帧上,以以下方式之一分隔每个动画:

1.-不同层中的每个动画,一个接一个,标记每个动画的开始关键帧,如空闲、行走、跑步等

2.-电影剪辑中的每个动画leftIdle\u mc、leftWalk\u mc等,并在主动画电影剪辑中的不同关键帧中添加每个动画:leftAnimations\u mc,并以与前一个动画相同的方式标记每个帧:idle、walk、run。我更喜欢这种方式,因为如果你需要更新你的动画,使其变长或变短,只需更新你的内部leftIdle\u mc或leftWalk\u mc中的帧,并让主leftAnimations\u mc保存所有其他动画

3.-创建一个名为player_mc的新MovieClip,并将每个动画容器添加到此MovieClip的不同层中,并为每个动画MovieClip设置实例名称

最后你应该有这样的东西:

player_mc -> leftAnimation_mc -> "idle" keyframe -> leftIdle_mc
                              -> "walk" keyframe -> leftWalk_mc
          -> rightAnimation_mc-> "idle" keyframe -> rightIdle_mc
你有这个想法

现在进行编码: 1.-设置方向和动画(如常量),为当前方向声明变量,并为当前动画声明变量:

private const LEFT:string = "left";
private const RIGHT:string = "right";
private const UP:string = "up";
private const DOWN:string = "down";

private const IDLE:string = "idle";
private const WALK:string = "walk";

private var currentDirection:string = "right";
private var animation:string = "idle";
2.-添加您的键控和键控侦听器。 在keyDown事件侦听器中,不是设置真值或假值,而是根据按下的键设置当前方向,添加要调用的动画,最后添加名为UpdateImations的新方法,例如:

if(k.KeyCode == KeyBoardLeft)
{
    currentDirection = LEFT;
    animation = WALK;
    updateAnimations();
}
3.-在向上/释放关键帧事件中,只需将动画更改为空闲,并添加UpdateImations方法:

private function keyReleased(k:KeyboardEvent)
{
    animation = IDLE;
    updateAnimations();
}
4.-最后,更新和隐藏方法:

private updateAnimations()
{
    hideAnimations();

    switch(currentDirection)
    {
         case LEFT:
         player_mc.leftAnimations_mc.visible = true; 
         player_mc.leftAnimations_mc.gotoAndStop(animation);
         break;

         case RIGHT: 
         player_mc.rightAnimations_mc.visible = true; 
         player_mc.rightAnimations_mc.gotoAndStop(animation);
         break;
    }
}

private hideAnimations()
{
    player_mc.leftAnimations_mc.visible = false;
    player_mc.rightAnimations_mc.visible = false;
    player_mc.upAnimations_mc.visible = false;
    player_mc.downAnimations_mc.visible = false;
}
如您所见,我使用hideAnimations隐藏了所有动画电影剪辑,然后使用开关将动画设置为仅可见我想要的动画,最后转到当前动画关键帧:

player_mc.rightAnimations_mc.gotoAndStop(animation);
希望这足够清楚