【问题标题】:as3 space bar function not workingfas3空格键功能不起作用
【发布时间】:2014-03-24 12:30:18
【问题描述】:

我编写了一个代码来移动MovieClip 按空格键。因此,如果有人按下空格键..它会激活一个从falsetrue 的布尔变量,如果它为真,则对象移动..但它不起作用。有人可以帮忙吗?谢谢

     var rope = MovieClip(this.root).boat_mc.rope_mc.fishyrope_mc.hitbox_mc;
var ropeMove:Boolean = false;

stage.addEventListener(Event.ENTER_FRAME, ropeCode);
stage.addEventListener(KeyboardEvent.KEY_UP, onSpacebarUp);

function onSpacebarUp(e:KeyboardEvent):void
{
    if (e.keyCode == Keyboard.SPACE)
        ropeMove = !ropeMove; // toggles ropeMove (i.e. if it's true, sets it to false, and vice versa)
}

function ropeCode(e:Event):void
{
    // move the rope
    if( ropeMove )
    {
        rope.y += xSpeed;

        // stop moving if we've gone too far
        if( rope.y > 600.0 )
        {
            rope.y = 600.0;
            ropeMove = false;
        }
    }
}

【问题讨论】:

    标签: actionscript-3 flash actionscript flash-cs5 flash-cs4


    【解决方案1】:

    这应该可以工作

    var ropemove:Boolean = true;
    var xSpeed = 5;
    var once:Boolean=false;
    
    
    stage.addEventListener(Event.ENTER_FRAME,ropeCode);
    stage.addEventListener(KeyboardEvent.KEY_UP,onSpacebarUp);
    function onSpacebarUp(e:KeyboardEvent):void
    {
        if (e.keyCode == 32)
        {
            if (ropemove==true)
            {
                if(once==false)
                {
                    ropemove = false;
                    once=true
                }
            }
            if(ropemove==false)
            {
                ropemove==true
            }
    
        }
        if (rope.x >= stage.stageWidth )
        {
            ropemove = false;
        }
        trace(ropemove)
    
    }
    function ropeCode(e:Event):void
    {
    
        if (ropemove == true)
        {
            rope.x +=  xSpeed;
        }
    }
    

    【讨论】:

    • 嗨 bennettliam,非常感谢您的帮助,我真的很感激。如果您查看我的帖子,您会看到我已经根据您所说的内容编辑了我的代码。然而现在发生了一件奇怪的事情。当电影加载时,movieclip 开始自行移动,如果我使用空格键,它就会停止:/。我在做什么菜鸟?谢谢
    • 一目了然,可能是因为ropemove一开始就为真
    • ok 再次编辑了我的代码,现在它可以工作了,因为它会下降,但在达到一个点后不会停止。所以我对 x 和 y 都做了跟踪..即使物体在移动,Y 也不会改变。因此他们不会停止。知道为什么吗?
    【解决方案2】:

    我可以在您的代码中发现两个问题:

    1.) 一切都在您的 Event.ENTER_FRAME 事件处理程序中。这意味着每一帧,该代码都将运行:包括您添加键盘事件侦听器的位置。 1 秒后,(假设您以 30 fps 的速度运行)onSpacebarUp() 将在您按下空格键时触发 30 次,并不断增加。可能不是一个好主意,很确定您只想添加一次。

    2.) 布尔值将导致您的影片剪辑移动的部分在一个方法中:dropRope()。但这在任何地方都没有被调用,所以它实际上什么也没做。也可能不需要事件参数(e:event)部分,因为您没有使用它,也没有从事件中调用它。

    BennettLiam 的代码应该做一些更接近你想要的事情,我只是添加这个答案作为你的代码为什么不起作用的解释。在他们的回答中,他们解决了我提到的上述问题:将键盘的事件侦听器代码移到事件帧处理程序循环之外,因此它只添加一次,并将输入帧事件处理程序更改为每次调用 dropRope()框架,以便它在做某事。

    【讨论】:

    • 实际上,它确实存在于 AS3 中。但这不是引用主类的优雅方式。
    • 哦,你是对的。 “根”确实存在。从我的帖子中删除它。
    • 非常感谢您的解释,非常感谢。如果我看不懂,那么简单地从人们那里获取代码是没有意义的。
    【解决方案3】:
    var rope = MovieClip(this.root).boat_mc.rope_mc.fishyrope_mc.hitbox_mc;
    var ropeMove:Boolean = false;
    
    stage.addEventListener(Event.ENTER_FRAME, ropeCode);
    stage.addEventListener(KeyboardEvent.KEY_UP, onSpacebarUp);
    
    function onSpacebarUp(e:KeyboardEvent):void
    {
        if (e.keyCode == Keyboard.SPACE)
            ropeMove = !ropeMove; // toggles ropeMove (i.e. if it's true, sets it to false, and vice versa)
    }
    
    function ropeCode(e:Event):void
    {
        // move the rope
        if( ropeMove )
        {
            rope.y += xSpeed;
    
            // stop moving if we've gone too far
            if( rope.y > 600.0 )
            {
                rope.y = 600.0;
                ropeMove = false;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      • 2016-10-28
      • 2023-03-11
      相关资源
      最近更新 更多