我有一个自上而下的等距游戏角色。角色是向八个方向移动,因此八个空闲和八个步行动画。我有步行动画工作[除了对角线走动画,我得到一个静止的框架]但如果我尝试添加空闲动画,我的步行动画完全被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"是可见的等等?
答案 0 :(得分:0)
鉴于您当前的代码,您可以尝试的一种方法是分离您的方向处理和步行/空闲状态。
现在,看起来你正在这样做: 你按下按键设置一个布尔值,然后在输入框架上检查该布尔值是否为真,然后你走向那个方向。
相反,您可以这样做: 有一组方向状态(在你的情况下为布尔)和角色状态(现在有两个布尔值,一个用于行走,一个用于空闲)
按键时,您可以设置方向状态和角色状态(例如,从空闲到步行+左侧)。 在键释放时,您只更新字符状态并保持方向状态(从步行到空闲)。 然后,在你的输入框架循环中,你可以查找方向和角色状态,了解要播放哪个动画,哪个是空闲+左边。
将来,如果你决定实施更多的角色状态(比如说“休息”或“跑步”),你可能会遇到大量旗帜/布局的问题。在这一点上,可能值得研究其他方法来处理这个问题。
答案 1 :(得分:0)
我建议你以更清晰,更有条理的方式重写代码。实现这一目标的最佳方法是:
首先,为每个方向的动画创建一个影片剪辑容器,在这个例子中我只会使用4个方向,所以我们会:
以下列方式之一分隔每个动画:
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);
希望这很清楚。