簡體   English   中英

AS3 Flash鍵盤事件空格鍵問題

[英]AS3 flash keyboard events spacebar issue

大家好,非常感謝您的幫助

好的,問題是這樣的。 我正在嘗試自動移動動畫片段

movieClip.x += xspeed ; 

當然這可行,但問題在於我希望通過按下鍵盤來觸發..問題是我無法進行鍵盤事件,就像鼠標點擊一樣。 .it停止工作。.我希望它像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;
                        }
                    }



    }

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檢查,您仍然需要重新計算)
  • 現在,鍵盤事件與Enter frame事件一起添加(您在每個幀中添加了一個新的鍵盤事件
  • 鍵盤事件偵聽器只需切換ropeMove var(此處不檢查> 600.0 ,因為這意味着您僅在按下任何其他鍵時進行檢查)
  • Enter框事件僅使繩索y移動
  • 在回車事件中,如果我們的y太大,我們將停止移動

代碼在做什么:

  • 我們建立了我們瓦爾- roperopeMove - ropeMove是用於了解,如果我們可以將繩子或不
  • 我們添加了事件監聽器-一個用於keybard事件,用於捕獲空格鍵,另一個用於輸入frame事件,因此如有必要,我們可以移動繩索
  • 在鍵盤事件中,如果我們的鍵是空格鍵,則切換我們的ropeMove變量
  • 在enter frame事件中,如果ropeMove為true,我們將移動繩索
  • 如果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;
    }
}
addEventListener(KeyboardEvent.KEY_DOWN, moveStarter);

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM