怎么做一个角色跳?

时间:2012-04-28 20:49:14

标签: actionscript-3 flash flash-cs5

这是我第一次需要在我的一款游戏中使用它。我想让角色跳跃。我一直试图得到这个结果大约一个小时,但没有运气=(我使用AS3,并闪存CS5.5。到目前为止,我的所有代码都是让角色左转,并根据键盘输入。有人可以帮忙吗?

到目前为止,这是我的代码:

public class Dodgeball extends MovieClip
{
    public var character:Character;
    public var rightDown:Boolean = false;
    public var leftDown:Boolean = false;
    public var speed:Number = 3;
    public var timer:Timer;


    public function Dodgeball()
    {

        character= new Character();
        addChild(character);

        stage.addEventListener(KeyboardEvent.KEY_DOWN, myKeyDown);
        stage.addEventListener(KeyboardEvent.KEY_UP, MyKeyUp);
        timer = new Timer(24);
        timer.addEventListener(TimerEvent.TIMER, moveClip);
        timer.start();

    }
    public function myKeyDown(event:KeyboardEvent):void
    {
        if (event.keyCode == Keyboard.RIGHT)
        {
        rightDown = true;

            if(character.currentLabel != "walkingRight")
            {
                character.gotoAndStop ("walkingRight");
            }
        }
        if (event.keyCode == Keyboard.LEFT)
        {
            leftDown = true;
                if (character.currentLabel != "backingUp")
                {
                    character.gotoAndStop("backingUp");
                }
        }
    }
    public function MyKeyUp(event:KeyboardEvent):void
    {
        if(event.keyCode == Keyboard.RIGHT)
        {
            character.gotoAndStop("standing");
            rightDown = false;
        }
        if (event.keyCode == Keyboard.LEFT)
        {
            character.gotoAndStop("standingLeft");
            leftDown = false;
        }
    }
    public function moveClip(event:TimerEvent):void
    {
        if (rightDown)
        {
            character.x += speed;
        }
        if (leftDown)
        {
            character.x -=speed;
        }
        event.updateAfterEvent();
    }
}

}

3 个答案:

答案 0 :(得分:1)

我要做的是创建角色跳跃的补间动画。然后在该帧上调用gotoAndPlay,并在补间的最后一帧上放置一个停止点,或者在“静止”帧上放置一个gotoAndStop,或者任何帧代表一个中立位置。

   if (event.keyCode == Keyboard.SHIFT)
   {
       character.gotoAndPlay("simpleJump");
       jumpDown = false;
   }

这将为您提供对外观的最佳动画控制。你也可以通过编程方式进行,但就个人而言,我建议不要这样做。设置它需要的时间更少,您可以稍后调整和优化跳转动画。您可以根据目标附近的对象等制作几种类型的跳转动画。

我也会改变这个东西:

if(character.currentLabel != "walkingRight")

通过定义一个新功能,您可以在其中拥有可以执行某些操作的时间和地点的所有规则,以便在您的控制逻辑中,您只需调用

if(characterCan(character,"walkright")) ...

其中characterCan(String)是一种检查是否可行的方法。例如,如果你是跳跃和射击,你显然无法正确行走,所以最后,你必须开始在那些if语句中添加逻辑部分,这将变得混乱。

答案 1 :(得分:1)

您可以尝试一种方法:http://www.actionscript.org/forums/showthread.php3?t=256009speed变量一样,grav确定角色的垂直位置。

var grav:Number = 10;
var jumping:Boolean = false;
var jumpPow:Number = 0;

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
stage.addEventListener(Event.ENTER_FRAME, update);

function onKeyDown(evt:KeyboardEvent):void
{
    if(evt.keyCode == Keyboard.UP)
    {
        if(jumping != true)
        {
            jumpPow = -50;
            jumping = true;
        }
    }   
}


function update(evt:Event):void
{
    if(jumping)
    {
        player_mc.y += jumpPow;
        jumpPow += grav;

        if(player_mc.y >= stage.stageHeight)
        {
            jumping = false;
            player_mc.y = stage.stageHeight;
        }
    }
}    

编辑:Jason的方法很好,但是我不确定如果你计划进行某种碰撞检测它是否有用。

答案 2 :(得分:1)

一种非常简单的方法是具有垂直速度和水平速度。 当用户按下“UP”或“JUMP”时,将y speed设置为负值并在movieClip功能中更新它。当角色达到一定高度时,反转速度。

使用重力和加速度看起来更好,但这是一个非常好的起点。查看运动方程,看看如何使角色加速。

public var originalY;

public function myKeyDown(event:KeyboardEvent):void
{
    if (event.keyCode == Keyboard.UP && vSpeed == 0)
    {
        originalY = character.y;
        ySpeed = -1;
    }
}


public function moveClip(event:TimerEvent):void
{
    if (vSpeed != 0)
    {
        character.y += vSpeed;

        /* make the character fall down after reaching max jump height */
        if(originalY - character.y > jumpHeight) {
            vSpeed = vSpeed * -1;
        }

        /* level the character after he's hit the ground (so he doesn't go through) */
        else if(character.y >= originalY) {
            character.y = originalY;
            vSpeed = 0;
        }
    }
}