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);
希望这足够清楚