【问题标题】:AS3 flash keyboard events spacebar issueAS3 flash 键盘事件空格键问题
【发布时间】:2014-03-19 08:51:24
【问题描述】:

大家好,非常感谢您的帮助

好的,问题是这样的。我正在尝试使用

自动移动影片剪辑
movieClip.x += xspeed ; 

当然这可行,但关键是我希望通过键盘按下来触发它。问题是我不能像鼠标点击一样工作的键盘事件。只要按下空格键它就可以工作,但如果我释放它..它停止工作..我希望它像 onclick 它应该开始自动移动。

有什么想法吗?谢谢

您好,非常感谢您的回复,很抱歉耽搁了。你的代码给了我一个想法,但我试图在没有类的情况下编写它。它不会引发任何错误,但它也不起作用。我一定是在做一些愚蠢的事情,请看看并告诉我。 //绳子编码

var ropey = MovieClip(this.root).boat_mc.rope_mc.fishyrope_mc.hitbox_mc.y ;
    trace(ropey);
    var ropemove:Boolean;


    stage.addEventListener(Event.ENTER_FRAME,ropeCode);

    function ropeCode(e:Event):void
    {
                //detect keyboard spacebar click
                stage.addEventListener(KeyboardEvent.KEY_UP,onSpacebarUp);

                function onSpacebarUp(e:KeyboardEvent):void
                {
                    if (e.keyCode == Keyboard.SPACE)
                    {
                        ropemove = true;
                    } else if(ropey > 600 ) {
                        ropemove = false;
                    }

                }

                    //drop rope if variable = true

                    function dropRope(e:Event):void 
                    {

                        if(ropemove = true) {
                            MovieClip(this.root).boat_mc.rope_mc.y += xSpeed;
                        } else if (ropemove = false) {
                            MovieClip(this.root).boat_mc.rope_mc.y -= xSpeed;
                        }
                    }



    }

【问题讨论】:

    标签: actionscript-3 flash actionscript flash-cs5


    【解决方案1】:

    MyObj 扩展 MovieClip(或 Sprite)。基本上所有发生的事情是,当您获得KEY_UP(而不是KEY_DOWN,因为如果按住键时会重复),您应该只切换一个变量。然后,每一帧,检查这个变量,如果它是好的,移动

    类似:

    private var m_shouldMove:Boolean = false;
    
    // constructor
    public function MyObj()
    {
        // add our listener for when we're added to the stage as we'll be adding events on it
        this.addEventListener( Event.ADDED_TO_STAGE, this._onAddedToStage );
    }
    
    private function _onAddedToStage( e:Event ):void
    {
        // NOTE: the keyboard listener goes onto the stage
        // you'll also need to remove the events when your object is removed (e.g. REMOVED_FROM_STAGE)
        this.removeEventListener( Event.ADDED_TO_STAGE, this._onAddedToStage );
        this.addEventListener( Event.ENTER_FRAME, this._onEnterFrame );
        this.stage.addEventListener( KeyboardEvent.KEY_UP, this._onKeyUp );
    }
    
    private function _onEnterFrame( e:Event ):void
    {
        // every frame, if we should move, do so
        if( this.m_shouldMove )
            this.x += this.speed;
    }
    
    private function _onKeyUp( e:KeyboardEvent ):void
    {
        if( e.keyCode == Keyboard.SPACE )
            this.m_shouldMove = !this.m_shouldMove; // toggle our var
    }
    

    更新

    我已经修改了你的代码示例,所以它现在应该可以工作了:

    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;
            }
        }
    }
    

    我改变了什么:

    • 将您的绳索作为一个变量,以便更容易访问
    • 删除了不需要的ropey(对于您的> 600.0 检查,无论如何您都需要重新计算它
    • 键盘事件现在与输入帧事件一起添加(您每帧都添加一个新的键盘事件
    • 键盘事件监听器只是切换ropeMove var(这里没有必要检查> 600.0,因为这意味着您只检查何时按下任何其他键)
    • 进入帧事件只是移动绳子 y
    • 在进入帧事件中,如果我们的 y 太大,我们停止移动

    代码在做什么:

    • 我们设置了我们的变量 - roperopeMove - ropeMove 用于知道我们是否可以移动绳索
    • 我们添加了我们的事件侦听器 - 一个用于键盘事件,用于捕捉空格键,另一个用于输入帧事件,因此我们可以在必要时移动我们的绳索
    • 在键盘事件中,如果我们的键是空格键,我们切换 ropeMove 变量
    • 在进入帧事件中,如果ropeMove 为真,我们移动绳子
    • 如果我们的 rope.y 大于 600,我们将其钳制为 600,并将 ropeMove 设置为 false,因此我们停止移动

    更新 2

    添加变量ropeDir后,绳子现在将连续上下移动(假设ropeMovetrue

    var rope = MovieClip(this.root).boat_mc.rope_mc.fishyrope_mc.hitbox_mc;
    var ropeMove:Boolean = false;
    var ropeDir:int = 1;
    
    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 * ropeDir;
    
            // stop moving if we've gone too far
            if( rope.y > 600.0 && ropeDir == 1 )
                ropeDir = -1;
            else if( rope.y < 0.0 && ropeDir == -1 )
                ropeDir = 1;
        }
    }
    

    【讨论】:

    • 嗨,请检查我上面的代码,我试图在没有课程的情况下遵循你的想法,但它不起作用,非常感谢你的帮助。如果您能帮助我更多,将不胜感激。
    • 非常感谢你,对于像我们这样的菜鸟来说,这是一个很好的解释。只是一个问题,由于某种原因,它不会停留在 Y 600。
    • 没关系我犯了一个错误:) 修复它。非常感谢
    • 您好我有一个问题,如果当它达到所需的深度时,它应该回到原来的位置。对此有什么想法吗?谢谢
    • 有一个dir 变量,可以是1-1。你的绳子 y 代码变成了rope.y += xSpeed * dir,你的支票变成了if( rope.y &gt; 600 &amp;&amp; dir == 1 ) { dir = -1 } else if ( rope.y &lt; 0 &amp;&amp; dir == -1 ) { dir = 1 }
    【解决方案2】:
    addEventListener(KeyboardEvent.KEY_DOWN, moveStarter);
    
    function moveStarter():void
    {
       addEventListener(Event.ENTER_FRAME, startMove);
    }
    

    【讨论】:

    • 抱歉我不够清楚 addEventListener(KeyboardEvent.KEY_DOWN, startMove);这就是我正在使用的,但是对象仅在按下键时移动,我希望键被按下,然后对象在不按下键的情况下继续移动。希望能澄清我的问题。
    • 所以,您的意思是即使单击鼠标右键也无法制作您想要的东西?好的,我正在编辑我的答案
    猜你喜欢
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多