2012-05-26 61 views
0

我正在做一個Flash Pro CS6的小應用程序,並且我使用箭頭鍵(使用代碼Sippets製作)以每幀4個像素的速度移動球。問題在於,每當我死的時候,我都會到達另一個框架,我可以重播並重試遊戲,但是這一次,球的速度是8像素/幀,並且每次我重玩遊戲時,這個數字都會不斷增加。有什麼辦法解決這個問題嗎?下面是我使用的代碼片段:AS3 - 球超速

var upPressed:Boolean = false; 
var downPressed:Boolean = false; 
var leftPressed:Boolean = false; 
var rightPressed:Boolean = false; 

ball.addEventListener(Event.ENTER_FRAME, fl_MoveInDirectionOfKey); //I think the problem might be this "Enter Frame" 
stage.addEventListener(KeyboardEvent.KEY_DOWN, fl_SetKeyPressed); 
stage.addEventListener(KeyboardEvent.KEY_UP, fl_UnsetKeyPressed); 

function fl_MoveInDirectionOfKey(event:Event) 
{ 
if (upPressed) 
{ 
    ball.y -= 4; 
} 
if (downPressed) 
{ 
    ball.y += 4; 
} 
if (leftPressed) 
{ 
    ball.x -= 4; 
} 
if (rightPressed) 
{ 
    ball.x += 4; 
} 
} 

function fl_SetKeyPressed(event:KeyboardEvent):void 
{ 
switch (event.keyCode) 
{ 
    case Keyboard.UP : 
     { 
      upPressed = true; 
      break; 


     }; 
    case Keyboard.DOWN : 
     { 
      downPressed = true; 
      break; 


     }; 
    case Keyboard.LEFT : 
     { 
      leftPressed = true; 
      break; 


     }; 
    case Keyboard.RIGHT : 
     { 
      rightPressed = true; 
      break; 


    } 
} 
}; 

function fl_UnsetKeyPressed(event:KeyboardEvent):void 
{ 
switch (event.keyCode) 
{ 
    case Keyboard.UP : 
     { 
      upPressed = false; 
      break; 


     }; 
    case Keyboard.DOWN : 
     { 
      downPressed = false; 
      break; 


     }; 
    case Keyboard.LEFT : 
     { 
      leftPressed = false; 
      break; 


     }; 
    case Keyboard.RIGHT : 
     { 
      rightPressed = false; 
      break; 


    } 
} 
}; 
+0

是在'ball'的MovieClip的實例名稱階段? – PanterA

+0

是的,它是舞臺上的movieClip實例 – Zoske

回答

1

它看起來對我的樣子,你每次gotoAndPlay創建一個新球實例的第一幀 - 但仍有原隸屬一個事件偵聽器,即使它從舞臺上移開後也是如此。

因此,在每個新的ENTER_FRAME中,該方法不僅被調用一次,而且每次調用一次。解決方法是在「你死了」時刪除事件監聽器,或者使用弱引用,以便可以乾淨地刪除球實例。

順便說一句,這是你的腳本的短版 - 沒有必要對所有這些如果 - 和開關語句,和實例變量:

var keyPressed:int = -1; 
ball.addEventListener(Event.ENTER_FRAME, fl_MoveInDirectionOfKey); 
stage.addEventListener(KeyboardEvent.KEY_DOWN, fl_SetKeyPressed); 
stage.addEventListener(KeyboardEvent.KEY_UP, fl_UnsetKeyPressed); 

function fl_SetKeyPressed(event:KeyboardEvent):void { 
    keyPressed = event.keyCode; 
} 

function fl_UnsetKeyPressed(event:KeyboardEvent):void { 
    keyPressed = -1; 
} 

function fl_MoveInDirectionOfKey(event:Event) { 
    ball.y += keyPressed == Keyboard.UP ? -4 : keyPressed == Keyboard.DOWN ? 4 : 0; 
    ball.x += keyPressed == Keyboard.LEFT ? -4 : keyPressed == Keyboard.RIGHT ? 4 : 0; 
} 
+0

「解決方法是在」死掉「時刪除事件偵聽器,或者使用弱引用,以便可以乾淨地刪除球實例。」我在as3上有點新,所以我還不知道這是一個什麼弱點。 – Zoske

+0

'addEventListener'有一個可選的第三個參數'weakReferences'。如果將其設置爲「true」,那麼即使偵聽器仍然連接到對象,「ball」的實例也會被正確地垃圾收集。如果你不這樣做,你會*刪除聆聽者,以便將球從記憶中刪除。 http://dispatchevent.org/mims/creating-weak-references-in-as3/ – weltraumpirat

+0

謝謝你的代碼,現在moviment更現實。好的,在等待您的回覆時,我添加了一個ball.removeEventListener(Event.ENTER_FRAME,fl_MoveInDirectionOfKey),所以現在沒有更多的錯誤! – Zoske