AS3闪存键盘事件空格键问题

时间:2014-02-19 07:09:19

标签: actionscript-3 flash actionscript flash-cs5

你好,非常感谢你们帮助

好的,问题是这个。我想用

自动移动一个movieclip
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;
                        }
                    }



    }

2 个答案:

答案 0 :(得分: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用于了解我们是否可以移动绳索
  • 我们添加我们的事件监听器 - 一个用于keybard事件,用于捕获空格键,一个用于输入框架事件,因此我们可以在必要时移动绳索
  • 在键盘事件中,如果我们的键是空格键,我们切换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;
    }
}

答案 1 :(得分:0)

addEventListener(KeyboardEvent.KEY_DOWN, moveStarter);

function moveStarter():void
{
   addEventListener(Event.ENTER_FRAME, startMove);
}