1

这是我第一次需要在我的游戏中使用它。我想让角色跳跃。我一直试图得到这个结果大约一个小时,但没有运气=(我使用的是 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();
    }
}

}

4

3 回答 3

1

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

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

这将为您提供对外观和感觉的最大动画控制。您也可以以编程方式执行此操作,但就个人而言,我建议不要这样做。设置它需要更少的时间,您可以稍后调整和改进跳跃动画。您可以根据目标附近的物体等制作几种类型的跳跃动画。

我也会改变这些东西:

if(character.currentLabel != "walkingRight")

通过定义一个新函数,您可以在其中拥有可以完成某事的时间和地点的所有规则,以便在您的控制逻辑中,您只需调用

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

其中 characterCan(String) 是一种检查这是否可行的方法。例如,如果你在跳跃和射击,你显然不能正确行走,所以最后,你将不得不开始在这些 if 语句中添加逻辑片段,它会变得一团糟。

于 2012-04-28T21:01:28.937 回答
1

您可以在这里找到一种方法:http ://www.actionscript.org/forums/showthread.php3?t=256009就像您的speed变量一样,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;
        }
    }
}    

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

于 2012-04-28T21:07:00.367 回答
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;
        }
    }
}
于 2012-04-28T21:15:02.263 回答