如何正确地为actionscript 3的自上而下的等距角色编写一组行走和空闲动画



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

我试图让角色进入空闲动画,这取决于他们所面对的方向[比如,如果他们向左走,空闲将向左,如果他们向上和向右倾斜,那么空闲将向上和右,等等],但如果我尝试任何类型的空闲代码,行走动画都不会播放,空闲将始终只在一个方向上。

到目前为止,我设法做到了以下几点:

    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"是可见的,我该如何添加编码呢?

这是我当前的.swf文件。

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

现在,您似乎正在执行以下操作:在按键时设置一个布尔值,在进入框时检查该布尔值是否为真,然后朝那个方向走。

相反,您可以执行以下操作:有一组方向状态(在您的情况下是布尔值)和字符状态(目前有两个布尔值,一个用于行走,另一个用于空闲)

按键后,您可以设置方向状态和角色状态(例如,从空闲到行走+向左)。释放关键帧后,只更新角色状态,而不更改方向状态(从行走到空闲)。然后,在输入帧循环中,可以查找要播放的动画的方向和角色状态,该动画将处于空闲+左侧。

将来,如果您决定实现更多的字符状态(例如.."正在休息"或"正在运行"),您可能会遇到大量标志/布尔值的问题。在这一点上,对处理这个问题的其他方法进行一些研究可能是值得的。

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

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

  • left动画_mc
  • 右动画_mc
  • up动画_mc
  • 向下动画_mc

在每一帧上,以以下方式之一分离每个动画:

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

2.-电影片段中的每个动画("leftIdle_mc"、"leftWalk_mc"等),并将每个动画添加到主动画电影片段中不同的关键帧中:"leftAnimations_mc",并以与前一个eample相同的方式标记每个帧:"idle,walk,run"。(我更喜欢这种方式,因为如果你需要更新动画(使其更长或更短),只需更新内部leftIdle_mc或leftWalk_mc中的帧,并保持主leftAnimations_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和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.-最后更新动画和隐藏动画方法:

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

希望这一点足够清楚。

相关内容

  • 没有找到相关文章

最新更新