2013-03-27 94 views
1

我有一個項目在一個星期內到期,我已經差不多完成了。我還有一個問題需要解決,我很難過。在flash中設置一個定時器as3

我會粘貼我到目前爲止下面的代碼。

如果你還可以解釋代碼是幹什麼的,所以我知道它在做什麼,如果沒有太多的麻煩,代碼是從課堂活動中獲取的,我改變了標識符以匹配我的圖形。 我試圖在我的下落中實現一個計時器,並且每15秒鐘捕捉一次遊戲,它會增加墜落物體的速度。計時器將從60秒開始,當它達到0秒時,它應該進入單獨的頁面。

請問有人能解釋我該怎麼做?我不擅長理解Flash中的代碼,所以如果你能保持它儘可能簡單,我會非常感激。

我有的代碼如下。它完美的作品,我只需要改變部分定時器:

package { 
import flash.display.*; 
import flash.events.*; 
import flash.text.*; 
import flash.utils.Timer; 
import flash.utils.getDefinitionByName; 

public class CatchingGame extends MovieClip { 
    var catcher:Catcher; 
    var nextObject:Timer; 
    var objects:Array = new Array(); 
    var score:int = 0; 
    const speed:Number = 7.0; 

    public function CatchingGame() { 
     catcher = new Catcher(); 
     catcher.y = 350; 
     addChild(catcher); 
     setNextObject(); 
     addEventListener(Event.ENTER_FRAME, moveObjects); 
    } 

    public function setNextObject() { 
     nextObject = new Timer(1000+Math.random()*1000,1); 
     nextObject.addEventListener(TimerEvent.TIMER_COMPLETE,newObject); 
     nextObject.start(); 
    } 

    public function newObject(e:Event) { 
     var goodObjects:Array = ["Circle1","Circle2"]; 
     var badObjects:Array = ["Square1","Square2"]; 
     if (Math.random() < .5) { 
      var r:int = Math.floor(Math.random()*goodObjects.length); 
      var classRef:Class = getDefinitionByName(goodObjects[r]) as Class; 
      var newObject:MovieClip = new classRef(); 
      newObject.typestr = "good"; 
     } else { 
      r = Math.floor(Math.random()*badObjects.length); 
      classRef = getDefinitionByName(badObjects[r]) as Class; 
      newObject = new classRef(); 
      newObject.typestr = "bad"; 
     } 
     newObject.x = Math.random()*500; 
     addChild(newObject); 
     objects.push(newObject); 
     setNextObject(); 
    } 

    public function moveObjects(e:Event) { 
     for(var i:int=objects.length-1;i>=0;i--) { 
      objects[i].y += speed; 
      if (objects[i].y > 400) { 
       removeChild(objects[i]); 
       objects.splice(i,1); 
      } 
      if (objects[i].hitTestObject(catcher)) { 
       if (objects[i].typestr == "good") { 
        score += 5; 
       } else { 
        score -= 1; 
       } 
       if (score < 0) score = 0; 
       scoreDisplay.text = "Score: "+score; 
       removeChild(objects[i]); 
       objects.splice(i,1); 
      } 
     } 

     catcher.x = mouseX; 

    } 
} 
} 

感謝您抽出時間來閱讀我的問題,並給出

+1

如果你要增加'speed'變量某些部分,你對於初學者來說,會希望它是一個'var'而不是'const'。下面是在AS3的'timer'類的教程:http://www.republicofcode.com/tutorials/flash/as3timer/ – Ronnie 2013-03-27 19:14:06

回答

0

任何幫助聲明speed作爲變量,而不是const,否則你代碼無法更改其值。您可以初始化變量,因此var speed:Number=7.0有效。

var speed:Number=7.0; 
var gameTimer:Timer=new Timer(15000,4); 
var speedCounter:int=0; 
gameTimer.addEventListener(TimerEvent.TIMER,gameTicks); 
function gameTicks(e:TimerEvent):void { 
    if (speedCounter==3) { 
     gameTimer.removeEventListener(TimerEvent.TIMER,gameTicks); 
     gameOver(); // implement this 
     return; 
    } 
    speedCounter++; 
    speed+=2.0; // balance this yourself 
} 
3

所以你想要一個計時器,每15秒鐘滴答60秒。這意味着它將不得不打勾4次(60/15)。我們稱之爲speedTimer; 你必須初始化它類似的東西:

speedTimer = new Timer(60 * 1000, 4); 

然後你需要添加兩個不同的事件偵聽器。每當你的計時器滴答時就會被調用,一個會在停止時被調用。

speedTimer.addEventListener(TimerEvent.TIMER, onSpeedTimer); 
speedTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onSpeedTimerComplete); 

在第一個事件處理程序中,您將值增加爲speed。爲了實現這一點,您需要將其從常量改爲變量。

在第二個處理程序中,您將您的代碼轉到其他頁面。

有幾點是應該被提及:

當你聲明一個變量,你必須指定一個範圍(即私有,公共等),您對功能做同樣的方式:

private var catcher:Catcher; 

當你聲明一個函數時,你應該指定一個返回值,除了你的類的構造函數。如果函數返回什麼都沒有,你可以使用無效:

public function setNextObject():void { 
    [...] 
} 

命名是很重要的,尤其是要了解你的代碼時,你會以後讀它。如果您使用Timer,最好將它命名爲myTimer而不是nextObject

這是函數的名字相同:setNextObject()創建一個新的Timer並啓動它,所以我想它命名爲startTimer()

當你創建一個新的計時器是這樣的:

new Timer(1000 + Math.random() * 1000, 1); 

您指定的1重複計數這意味着,延遲滿足後,您的計時器將停止。因爲你希望它一遍又一遍地跑,你應改爲指定0(無限)一repeatCount。 爲了保持functionnality,在隨機時間間隔你的計時器滴答,你那麼需要在你的事件處理程序來設置一個新的德來值

myTimer.delay = 1000 + Math.random() * 1000; 

goodObjectsnadObjects決不會被修改,所以你應該在常量提取它們:

private const GOOD_OBJECTS:Array = ["Circle1","Circle2"]; 
private const BAD_OBJECTS:Array = ["Square1","Square2"]; 

伴隨着這些變化,現在應該是更容易理解你的代碼做什麼。以下是更新後的代碼:

package 
{ 
    import flash.display.*; 
    import flash.events.*; 
    import flash.text.*; 
    import flash.utils.Timer; 
    import flash.utils.getDefinitionByName; 

    public class CatchingGame extends MovieClip 
    { 
     private const GOOD_OBJECTS:Array = ["Circle1","Circle2"]; 
     private const BAD_OBJECTS:Array = ["Square1","Square2"]; 

     private var catcher:Catcher; 
     private var myTimer:Timer; 
     private var speedTimer:Timer; 
     private var objects:Array = new Array(); 
     private var score:int = 0; 
     private var speed:Number; 

     public function CatchingGame() 
     { 
      speed = 7.0; 
      catcher = new Catcher(); 
      catcher.y = 350; 
      addChild(catcher); 
      startTimer(); 
      startSpeedTimer(); 
      addEventListener(Event.ENTER_FRAME, onEnterFrame); 
     } 

     public function startTimer():void 
     { 
      myTimer = new Timer(1000 + Math.random() * 1000, 0); 
      myTimer.addEventListener(TimerEvent.TIMER, onTimer); 
      myTimer.start(); 
     } 

     public function startSpeedTimer():void 
     { 
      speedTimer = new Timer(60 * 1000, 4); 
      speedTimer.addEventListener(TimerEvent.TIMER, onSpeedTimer); 
      speedTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onSpeedTimerComplete); 
      speedTimer.start(); 
     } 

     public function onTimer(e:Event):void 
     { 
      myTimer.delay = 1000 + Math.random() * 1000; 
      if (Math.random() < .5) 
      { 
       var r:int = Math.floor(Math.random() * GOOD_OBJECTS.length); 
       var classRef:Class = getDefinitionByName(GOOD_OBJECTS[r]) as Class; 
       var newObject:MovieClip = new classRef(); 
       newObject.typestr = "good"; 
      } 
      else 
      { 
       r = Math.floor(Math.random() * BAD_OBJECTS.length); 
       classRef = getDefinitionByName(BAD_OBJECTS[r]) as Class; 
       newObject = new classRef(); 
       newObject.typestr = "bad"; 
      } 
      newObject.x = Math.random() * 500; 
      addChild(newObject); 
      objects.push(newObject); 
      startTimer(); 
     } 

     private function onSpeedTimer(e:Event):void 
     { 
      speed++; 
     } 

     private function onSpeedTimerComplete(e:Event):void 
     { 
      // Go to some page... 
     } 

     public function onEnterFrame(e:Event):void 
     { 
      moveObjects2(); 
     } 

     public function moveObjects2():void { 
      for(var i:int = objects.length - 1; i >= 0; i--) 
      { 
       objects[i].y += speed; 
       if (objects[i].y > 400) 
       { 
        removeChild(objects[i]); 
        objects.splice(i, 1); 
       } 
       if (objects[i].hitTestObject(catcher)) 
       { 
        if (objects[i].typestr == "good") 
        { 
         score += 5; 
        } 
        else 
        { 
         score -= 1; 
        } 
        if (score < 0) 
        { 
         score = 0; 
        } 
        scoreDisplay.text = "Score: "+score; 
        removeChild(objects[i]); 
        objects.splice(i,1); 
       } 
      } 
      catcher.x = mouseX; 
     } 
    } 
} 

如果還有,你不明白,請隨時提他們在評論

+0

太感謝你了,這幫助了很多:)我只需要實現一些小改進我意識到和完成了,再一次,謝謝你:) – 2013-03-28 12:26:23

+0

不客氣。請考慮接受我的答案,如果它回答了你的問題 – duTr 2013-03-28 19:38:01

+0

我有另一個問題,我的代碼如下,我嘗試從舞臺中刪除的對象,彈出一個宣傳屏幕對此,我促進該項目的項目。 (我認爲這個問題是在下面 – 2013-04-16 10:19:33