我有一个自上而下的等距游戏的角色。角色要向八个方向移动,因此有八个空闲动画和八个行走动画。我有行走动画工作[除了对角线行走动画,我得到了一个静止帧],但如果我试图添加空闲动画,我的行走动画会被完全破坏。
我试图让角色进入空闲动画,这取决于他们所面对的方向[比如,如果他们向左走,空闲将向左,如果他们向上和向右倾斜,那么空闲将向上和右,等等],但如果我尝试任何类型的空闲代码,行走动画都不会播放,空闲将始终只在一个方向上。
到目前为止,我设法做到了以下几点:
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);
希望这一点足够清楚。