2012-07-24 53 views
0

我正在學習成爲一名遊戲設計師,現在我的Flash遊戲出現了一些問題。如何從一個類AS3中調用函數

遊戲有一個計數器類,有一個擴展計數器的分數類。它被添加到我的PlayScreenA類的舞臺中。

定時器以數字開頭,每減少24幀。但在我的英雄類中,我可以拿起一些硬幣,並且硬幣會增加我的分數上的時間。

問題是:我可以說在我的英雄類中執行計數器類中的addToValue函數?

代碼件: 創建我的PlayScreenA類分數:

private var myTime:Score = new Score(); 
    private function create_time(){ 

     myTime.x = 800; 
     myTime.y = 50;   
     addChild(myTime); 
    } 

Counter類:

package 
{ 
import flash.display.MovieClip; 
public class Counter extends MovieClip 
{ 
    public var currentValue:Number; 

    public function Counter() 
    { 
     reset(); 
    } 

    public function addToValue(amountToAdd:Number):void 
    { 
     currentValue = currentValue + amountToAdd; 
     updateDisplay(); 
    } 

    public function subToValue(amountToSub:Number):void 
    { 
     currentValue = currentValue - amountToSub; 
     updateDisplay(); 
    } 

    public function reset():void 
    { 
     currentValue = 20; 
     updateDisplay(); 
    } 

    public function updateDisplay():void 
    { 

    } 
} 
} 

評分等級:

package 
{ 
import flash.text.TextField; 
import flash.events.Event; 
public class Score extends Counter 
{ 
    protected var _timeCounter:int;  

    public function Score() 
    { 
     super(); 
     addEventListener(Event.ENTER_FRAME, onUpdate); 
    } 
    override public function updateDisplay():void 
    { 
     super.updateDisplay(); 
     scoreDisplay.text = currentValue.toString(); 
    } 
    protected function onUpdate(e:Event):void 
    { 
     _timeCounter++; 
     trace(currentValue); 

     if (_timeCounter == 24) 
     { 
      this.subToValue(1); 
      _timeCounter = 0; 
     }   
    } 
} 
} 

我的英雄類,其中的一塊我需要調用該函數:

for(var i:int; i<collisionList.length;i++) 
     { 
      var $collision:platform_tile = collisionList[i]; 

      if($hasCollided = hitbox.hitTestObject($collision.hitBox) && $collision.alpha<0.8 && $collision.alpha>0.6) 
      { 
       $collision.alpha=0; 
       $collision.visible = false; 
       //Here is where I want to call my subToValue          function! 
       break; 
      } 

回答

0

我假設你正在試圖訪問在PlayerScreenA類最初創建得分類的對象...

如果是這樣的話,那麼您導出的關係兩個類來傳遞這個對象,或者你可以保留的功能的靜態類保持跟蹤在全球範圍內...

public class AppRefrences 
{ 
    public static var addToValueFunc:Function;  
} 

在玩家A類,

private var myTime:Score = new Score(); 
    private function create_time(){ 

     myTime.x = 800; 
     myTime.y = 50;   
     addChild(myTime); 

     // This is where you set the function 
     Apprefrences.addToValueFunc = myTime.addToValue; 
    } 

在英雄類,

for(var i:int; i<collisionList.length;i++) 
     { 
      var $collision:platform_tile = collisionList[i]; 

      if($hasCollided = hitbox.hitTestObject($collision.hitBox) && $collision.alpha<0.8 && $collision.alpha>0.6) 
      { 
       $collision.alpha=0; 
       $collision.visible = false; 

       // This is where you call the function 
       if(AppRefrences.addToValueFunc != null) 
       AppRefrences.addToValueFunc(0); 

       break; 
      } 

嘗試使用吸氣劑& setters來控制靜態變量的更新。爲了清楚起見,我沒有包含它。

+0

工作得如此甜蜜! 非常感謝。 – 2012-07-24 04:00:35

+0

我很高興你能用它來處理這麼幾行代碼。現在我只是一名初學者遊戲程序員,如果你有時間給新手,我會很感激你是否可以看看我的整個代碼,並指出我做得很差,以及如何改進我的邏輯下一個工作。我更喜歡通過電子郵件發送文件併發送文件,但我可以用任何其他方式聯繫。 (遊戲甚至還沒有完成,但這是我的主要問題,我不認爲我現在有任何其他困難時間) 我的電子郵件是[email protected] 非常感謝! – 2012-07-24 04:11:16

1

因爲addToValuesubToValue實例方法,你應該提供一個參考(實例變量)在你的英雄對象中的計數器對象,然後調用其addToValuesubToValue方法。

var theCounter:Counter; 

你應該在你的英雄對象中啓動它,或者通過getter/setters分配一個預先存在的計數器對象。那麼你可以撥打:

theCounter.addToValue(); 
+0

嗨,這真的很有用,並解決了幾乎所有類似於我的問題,但不適用於我的情況。 當我試圖做你的第一個建議。該程序運行正常,但現在我每次拿起硬幣時都會收到此錯誤: TypeError:錯誤#1009:無法訪問空對象引用的屬性或方法。 \t在英雄/ collidesAt() \t在英雄/的onUpdate() 如果你認爲使用getter/setter方法就能解決問題,你能告訴我多一點關於它們如何工作? 如果問題是別的東西,我會很感激,如果你可以更多地看我的代碼。問我需要些什麼 – 2012-07-24 03:38:48

+0

我不知道你是如何設計你的項目的,但我想你應該有一些主控制器負責啓動必要的對象並啓動應用程序,最有可能的是你應該初始化計數器對象,那麼你可以將其引用傳遞給英雄對象,然後英雄對象可以使用它。要做到這一點英雄類應該有一個反擊的二傳手... – 2012-07-24 04:49:56

+0

請參閱此鏈接(http://qwickthoughts.blogspot.ca/2007/07/getset-in-actionscript-3-explained.html)定義getter setter ...另外,如果計數器應該是您應用程序中唯一的計數器,並且所有其他對象都應該使用同一個計數器,那麼您可能想要使用單例設計模式,請參閱此鏈接(http:/ /www.actionscript.org/forums/showthread.php3?t=192449)瞭解如何將你的櫃檯變成單身人士 – 2012-07-24 04:50:20

相關問題