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

时间:2015-02-24 01:42:12

标签: actionscript-3 animation isometric

我有一个自上而下的等距游戏角色。角色是向八个方向移动,因此八个空闲和八个步行动画。我有步行动画工作[除了对角线走动画,我得到一个静止的框架]但如果我尝试添加空闲动画,我的步行动画完全被borked。

我试图让角色根据他们面对的方向进入空闲动画[就像他们离开时一样,如果他们继续闲置,他们就会离开对角线向上和向右,然后空闲将是向上和向右等等]但是如果我尝试任何类型的空闲代码,则步行动画不会播放,空闲将始终只在一个方向。

这是我到目前为止所做的工作:

    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"是可见的等等?

Here is my current .swf file.

2 个答案:

答案 0 :(得分:0)

鉴于您当前的代码,您可以尝试的一种方法是分离您的方向处理和步行/空闲状态。

现在,看起来你正在这样做: 你按下按键设置一个布尔值,然后在输入框架上检查该布尔值是否为真,然后你走向那个方向。

相反,您可以这样做: 有一组方向状态(在你的情况下为布尔)和角色状态(现在有两个布尔值,一个用于行走,一个用于空闲)

按键时,您可以设置方向状态和角色状态(例如,从空闲到步行+左侧)。 在键释放时,您只更新字符状态并保持方向状态(从步行到空闲)。 然后,在你的输入框架循环中,你可以查找方向和角色状态,了解要播放哪个动画,哪个是空闲+左边。

将来,如果你决定实施更多的角色状态(比如说“休息”或“跑步”),你可能会遇到大量旗帜/布局的问题。在这一点上,可能值得研究其他方法来处理这个问题。

答案 1 :(得分:0)

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

首先,为每个方向的动画创建一个影片剪辑容器,在这个例子中我只会使用4个方向,所以我们会:

  • leftAnimations_mc
  • rightAnimations_mc
  • upAnimations_mc
  • downAnimations_mc
每个帧上的

以下列方式之一分隔每个动画:

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

2.-影片剪辑中的每个动画(“leftIdle_mc”,“leftWalk_mc”等)并在主动画影片剪辑中的不同关键帧中添加每个动画:“leftAnimations_mc”,并以与以下相同的方式标记每个帧上一个例子:“闲置,走路,跑步”。 (我更喜欢这种方式,因为如果您需要更新动画(使其更长或更短),只需更新内部leftIdle_mc或leftWalk_mc中的帧,并保持主leftAnimations_mc(包含所有其他动画)完好无损。

3.-创建一个名为player_mc的新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和keyUp侦听器。 在keyDown事件侦听器中,不是设置true或false值,而是根据按下的键设置当前方向,添加要调用的动画,最后添加一个名为updateAnimations()的新方法,例如:

if(k.KeyCode == KeyBoardLeft)
{
    currentDirection = LEFT;
    animation = WALK;
    updateAnimations();
}

3.-在你的密钥启动/发布事件中,只需将动画更改为IDLE并添加updateAnimations方法:

private function keyReleased(k:KeyboardEvent)
{
    animation = IDLE;
    updateAnimations();
}

4.-最后是updateAnimations和hideAnimations方法:

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);

希望这很清楚。