2013-07-08 42 views
0

我學AS3,並創建一個簡單的「小行星」的遊戲。 我寫了一個簡單的類直線運動:AS3:一個行爲,許多對象

package { 

import flash.display.MovieClip; 
import flash.display.Stage; 
import flash.events.Event; 

public class lin extends MovieClip { 

    private var vx:Number=0; 
    private var vy:Number=0; 

    public function lin(x:Number,y:Number,sr:Number,spd:Number) 
    { 

     this.rotation=sr; 
     vy+=Math.sin(degToRad(sr))*spd; 
     vx+=Math.cos(degToRad(sr))*spd; 

     this.x=x+vx; 
     this.y=y+vy; 

     addEventListener(Event.ENTER_FRAME,loop,false,0,true); 
    } 

    public function loop(evt:Event) 
    { 
     y+=vy; 
     x+=vx; 

     if (outOfBounds()) 
      kill(); 
    } 

    public function outOfBounds():Boolean 
    { 
     return (x>stage.stageWidth || x<0 || y>stage.stageHeight || y<0); 
    } 

    public function kill():void 
    { 
     if(parent) 
      parent.removeChild(this); 

     removeEventListener(Event.ENTER_FRAME,loop); 
    } 

    public function degToRad (deg:Number) 
    { 
     return deg * Math.PI/180; 
    } 

} 

} 

,我需要運動的這種行爲設置爲若干個對象(激光光束,小行星) 我創建了類「激光光束」新的MovieClip,並寫了這個:

package { 

import flash.display.MovieClip; 
import flash.display.Stage; 
import lin; 


public class LaserBeam extends MovieClip { 

    public var LaserBeamInstance:lin; 
    public var LaserSPD=15;  

    public function LaserBeam(x,y,r) { 
     LaserBeamInstance=new lin(x,y,r,LaserSPD); 

    } 
} 

} 

但是當我嘗試運行我的遊戲,它說:

Line 1 1203: No default constructor found in base class lin. 

我應該怎麼做,使許多不同MovieCli ps分享一個行爲?

在此先感謝!

UPD:所有項目文件是here

+0

BTW,你應該使用實例的類大寫字母和小寫字母。這是一個無處不在的標準。 – Pier

+0

你也並不需要導入在同一個包中的類。你可以刪除'import lin'。 – Marty

回答

0

嘗試從林構造調用超()。這是因爲它從MovieCLip繼承。如this.rotation屬性不會被初始化,直到調用影片剪輯構造超()

您還應該在類名「林」遵循標準命名慣例。

public function Lin(x:Number,y:Number,sr:Number,spd:Number) 
{ 
    super(); 
    this.rotation=sr; 
    vy+=Math.sin(degToRad(sr))*spd; 
    vx+=Math.cos(degToRad(sr))*spd; 

    this.x=x+vx; 
    this.y=y+vy; 

    addEventListener(Event.ENTER_FRAME,loop,false,0,true); 
} 
+0

不,如果您沒有手動提供調用,ActionScript將隱式調用超類的構造函數。請參閱http://stackoverflow.com/questions/7538701/dont-i-have-to-call-super-in-constructor-when-class-extends-sprite-in-actions – altschuler

+0

謝謝,mfa,尋求幫助!但我遇到了另一個問題:電影開始,但是當我嘗試放置激光影片剪輯時,它說: TypeError:錯誤#1009:無法訪問空對象引用的屬性或方法。在lin/loop() –

+0

階段可能沒有定義,當你引用它。您需要確保在該函數被調用之前剪輯已添加到顯示列表中。 ADDED_TO_STAGE是您可以查找更多信息的活動。 – mfa

0

我想你應該嘗試:

public function lin(x:Number = 1,y:Number = 1,sr:Number = 1,spd:Number = 1) 

我不知道到底發生了什麼,但我認爲你已經指出你的類「林」作爲基類,你的一些符號的你的圖書館。 所以,這象徵嘗試通過調用「林」的構造,但原因不帶任何參數來構建自己。


BTW,黃金法則:

- 變量名應該從小寫字母開頭從大寫構造

-names

+0

謝謝你的回答,但我打電話給lin從LaserBeam.as是這樣的: public function LaserBeam(x,y,r)LaserBeamInstance = new lin(x,y,r,LaserSPD); } 例如發送正確的參數 –

+0

,但您可以請嘗試設置默認參數x:Number = 1 ...在您的構造函數方法「lin」中。只是爲了測試我的假設。 – ZuzEL

+0

我做到了,但沒有任何變化 –

0

回答你的問題:

What should I do to make many different MovieClips share one behaviour?

你應該閱讀關於OOP模式。這本書是一個很好的介紹。

http://www.amazon.com/First-Design-Patterns-Elisabeth-Freeman/dp/0596007124

在回答你的錯誤,我想你是不是給我們的全貌。該錯誤是指類lin被延長,但在代碼有延伸lin沒有類。

+0

謝謝@Pier,參與解決我的問題。也許最好是看全貌?我把所有的文件打包在這裏:[鏈接](http://gallerycocoon.ru/Asteroids.zip) –

+0

你的項目在這裏工作得很好......沒有錯誤。 – Pier