2013-10-04 23 views
0

我新的動作,通過鍵盤移動符號而不顯示結果,發佈時不讀取stop();但一次又一次地重播它

我的文檔類,

package 
{ 
    //list of our imports these are classes we need in order to 
    //run our application. 
    import flash.display.MovieClip; 
    import flash.display.Stage; 
    import flash.events.Event; 

    public class engine extends MovieClip 
    { 

     // moved ourShip to a class variable. 
     private var Circle:circle = new circle() 
     //our constructor function. This runs when an object of 
     //the class is created 
     public function engine() 
     { 
      addFrameScript(0, frame1); 
      addFrameScript(1, frame2); 
     } 
     // frame 1 layer 1 -------------------------------------------------- 
     public function frame1() 
     { 
     stop(); 
     } 
     //------------------------------------------------------------------- 
     // frame 2 layer 1 -------------------------------------------------- 
     public function frame2() 
     { 
     Circle.x = stage.stageWidth/2; 
     Circle.y = stage.stageHeight/2; 
     addChild(Circle); 
     } 
     //------------------------------------------------------------------- 
    } 
} 

我做了兩幀第一個包含按鈕和其他圈子,我想移動,但它沒有移動並且它停留在第二幀中間

我的按鈕類是

package 
{ 
//imports 
import flash.events.MouseEvent; 
import flash.display.SimpleButton; 
import flash.display.MovieClip; 
//------- 
public class start extends SimpleButton 
{ 
    public function start() 
    { 
    addEventListener(MouseEvent.CLICK, onTopClick); 
    addEventListener(MouseEvent.MOUSE_OVER, onBottomOver); 
    } 

    function onTopClick(e:MouseEvent):void 
    { 
    MovieClip(root).gotoAndStop(2) 
    } 

    function onBottomOver(e:MouseEvent):void 
    { 
     } 
} 
} 

而且我作爲圈的影片剪輯爲

package 
{ 
    //imports 
    import flash.display.MovieClip; 
    import flash.display.Stage; 
    import flash.ui.Keyboard; 
    import flash.events.Event; 
    import flash.events.KeyboardEvent; 

    public class circle extends MovieClip 
    { 
    private var speed:Number = 0.5; 
    private var vx:Number = 0; 
    private var vy:Number = 0; 
    private var friction:Number = 0.93; 
    private var maxspeed:Number = 8; 
    public function circle() 
    { 
     addEventListener(Event.ENTER_FRAME, loop, false, 0, true); 
    } 
    public function loop(e:Event) : void 
    { 
     addEventListener(KeyboardEvent.KEY_DOWN, keyHit); 
     x+=vx; 
     y+=vy 
    } 
    function keyHit(event:KeyboardEvent):void { 
     switch (event.keyCode) { 
      case Keyboard.RIGHT : 
      vx+=speed; 
      break; 
      case Keyboard.LEFT : 
      vx-=speed; 
      break; 
      case Keyboard.UP : 
      vy-=speed; 
      break; 
      case Keyboard.DOWN : 
      vy+=speed; 
      break; 
      } 

      } 
    } 
} 

我很抱歉張貼這麼多爲你們閱讀,但stackoverflow是唯一的網站,任何人都可以幫助我!

回答

1

您犯了幾個重大錯誤。首先,addFrameScript()不適合在幀上放置代碼,請使用Flash的編輯器在時間線上放置代碼。 (IIRC你將不得不從你的兩個人中單獨調用一次,以便讓你添加的所有代碼都起作用)並且,如果MC的currentFrame是與碼。因此,您需要添加一個函數「frame2()」,將Circle放置在每個幀的舞臺中央!您應該在設計時將它鏈接到第二個框架或構造函數中,或者您可以使用一個框架和Sprite而不是MovieClip,而不是使用框架,您可以使用容器精靈,添加並隨意刪除它們,或者採取行動。

另一個主要的錯誤是在enterframe監聽器中添加一個事件監聽器 - 這些監聽器會相互累加,不會相互覆蓋,因此可以將多個函數指定爲特定事件的監聽器,甚至多次指定一個函數。後者發生在你身上,所以每個框架的另一個監聽功能實例keyHit被添加爲一個監聽器。分配偵聽器的正確方法是在構造函數中或在偵聽手動觸發事件的任何函數中(例如,MouseEvent.CLICK),但是必須採取預防措施,以便每個函數都多次偵聽,並且僅使用這些函數偵聽你現在需要。編輯: 好的。您的代碼是:

 addFrameScript(0, frame1); 
     addFrameScript(1, frame2); 

的比較正確的做法應該是:

addFrameScript(0,frame1,1,frame2); 

的原因是,在調用addFrameScript取代所有的時間軸代碼與您提供內這裏。該功能沒有記錄,可能是由於其對舞臺和AS3環境的影響。到目前爲止addFrameScript()最近的文檔是this link

下一頁:您的代碼是:

public function circle() 
{ 
    addEventListener(Event.ENTER_FRAME, loop, false, 0, true); 
} 
public function loop(e:Event) : void 
{ 
    addEventListener(KeyboardEvent.KEY_DOWN, keyHit); 
    x+=vx; 
    y+=vy 
} 

寫這個正確的方法如下:

public function circle() 
{ 
    addEventListener(Event.ENTER_FRAME, loop, false, 0, true); 
    if (stage) init(); 
    else addEventListener(Event.ADDED_TO_STAGE,init); 
} 
private function init(e:Event=null):void 
{ 
    removeEventListener(Event.ADDED_TO_STAGE,init); 
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyHit); 
} 
public function loop(e:Event) : void 
{ 
    x+=vx; 
    y+=vy 
} 

聽衆應在構造函數或分配,如果他們是永久性的,你希望他們在創建對象後立即生效。 KeyboardEvent聽衆是單獨的情況,因爲爲了使它們正常工作,您必須將它們分配給stage,這在創建對象時不可用,因此您需要一箇中間層 - 即僅稱爲「init()」的函數當對象被添加到舞臺時。此時stage不再爲空,您可以在其中分配事件偵聽器。請注意,如果您想讓自己的圈子最終消失,那麼您必須移除您分配給移除處理代碼某個位置的偵聽器。

下一頁:您的代碼:

public function frame2() 
    { 
    Circle.x = stage.stageWidth/2; 
    Circle.y = stage.stageHeight/2; 
    addChild(Circle); 
    } 

正確的代碼應該是:

public function frame2():void 
{ 
    if (Circle.parent) return; // we have added Circle to stage already! 
    Circle.x = stage.stageWidth/2; 
    Circle.y = stage.stageHeight/2; 
    addChild(Circle); 
} 

看,你調用此您的MC停止在第二幀每一次,所以你不斷地重新Circle「 s座標到舞臺中心,所以你不能看它是否移動(它不會,因爲你已經指定了鍵盤監聽器不要舞臺)。

也許還有更多的錯誤,但修復這些會讓你的MC有點滴滴。

+0

請你能還添加我的代碼(用自己的方式完成),並用它告訴我在這裏所做的是不是要做 仍然有許多錯誤添加註釋,混淆 它不承認圈的X和Y –

相關問題