2013-10-10 101 views
0

我是AS3的新手,我嘗試做一個簡單的Flash遊戲。 我的問題是訪問類之外的特定數組。 我成功地訪問了一些變量和函數,但我很困擾這一個。AS3訪問類和變量

有3個類:與Flash文件綁定的主類遊戲,產生背景元素和敵人的Level1,最後是敵人類。

遊戲類實例化產生敵人(與敵人類)的Level1類並將它們推送到一個數組。 當敵人被擊中時,敵人類中的一種方法將其從顯示列表中移除,然後嘗試將其從位於Level1類的陣列中移除,並失敗並拋出:

1119:訪問可能未定義的屬性level1通過靜態類型Class的引用。

另一個問題是有些時候子彈停在屏幕中間,我也無法追蹤到這個bug。

任何方式,這是我的第一個代碼相關的帖子,如果它太亂,告訴我,我會盡量讓它更可讀。 對不起任何inconveniance,感謝你的幫助 -Yaniv

package 
{ 
    import flash.display.MovieClip; 

    import flash.events.MouseEvent; 
    import flash.events.Event; 
    import flash.text.*; 
    import flash.geom.Point; 

    public class Game extends MovieClip 
    { 
     public var player:Player; 
     public var level1:Level1; 
     public var bullet:Bullet; 
     private var bullets_arr:Array; 
     var fire_on : Boolean; 
     var fire_counter : int; 

     public function Game() 
     { 
      level1=new Level1(this.stage); 

      player = new Player ; 
      addChild(player); 
      player.y = 600; 
      bullets_arr = []; 
      addEventListener(Event.ENTER_FRAME,Main); 
      stage.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler); 
      stage.addEventListener(MouseEvent.MOUSE_UP,mouseUpHandler); 
     } 

     function mouseDownHandler($e:MouseEvent):void 
     { 
      fire_on = true; 
     } 

     function mouseUpHandler($e:MouseEvent):void 
     { 
      fire_on = false; 
      fire_counter = 0; 
     } 

     function fire():void 
     { 
      bullet = new Bullet ; 
      addChild(bullet); 
      bullet.x = player.x; 
      bullet.y = player.y - 32; 
      bullets_arr.push(bullet); 
     } 

     public function Main(e: Event):void 
     { 
      player.x = mouseX; 

      if (bullets_arr) 
      { 
       for (var m:int = 0; m < bullets_arr.length; m++) 
       { 
        bullets_arr[m].y -= 20; 

        if(level1.enemies_arr) 
        { 
         for (var n:int = 0; n < level1.enemies_arr.length; n++) 
         { 
          if (bullets_arr[m]) 
          { 
           if (level1.enemies_arr[n]) 
           { 
            if (level1.enemies_arr[n].hitTestObject(bullets_arr[m])) 
            { 
             if(bullets_arr[m].parent) 
             { 
              bullets_arr[m].parent.removeChild(bullets_arr[m]); 
              bullets_arr.splice(bullets_arr[m],1); 
              level1.enemies_arr[n].DoDamage(10); 
             } 
            } 
           } 
          } 
         } 
        } 
       } 
      } 

      if(fire_on) 
      { 
       fire_counter++; 
       if(fire_counter == 01) 
       { 

        fire(); 
       } 
       else if(fire_counter >5) 
       { 
        fire_counter =0; 
       } 
      } 
     } 
    } 
} 




package { 

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

    public class Level1 extends MovieClip{ 

     var i:int; 
     var j:int; 
     var frame :int; 
     public var enemy:Enemy; 
     public var enemies_arr:Array; 


     public function Level1(target:Stage) 
     { 
      frame = 0; 
      enemies_arr = []; 

      for (var i:int = 0; i < 3; i++) 
      { 
       for (var j:int = 0; j < 3; j++) 
       { 
        enemy = new Enemy; 
        enemy.x = j*100 + 260; 
        enemy.y = i*40 - 150; 
        target.addChild(enemy); 
        enemies_arr.push(enemy); 
       } 
      } 
     } 
    } 
} 



package 
{ 
    import flash.display.MovieClip; 

    public class Enemy extends MovieClip 
    { 

     var Health : int; 
     var splash:Splash; 

     function Enemy() 
     { 
      Health =30; 
     } 
     public function DoDamage(Damage:int) 
     { 
      Health -= Damage; 
      if (Health <= 0) 
      { 
       Die(); 
      } 
     } 
     public function Die() 
     { 
      if(this.parent) 
      { 
       this.parent.removeChild(this); 

       //HERE IS THE ERROR 
       Game.level1.enemies_arr.splice(this,1); 
      } 
     } 
    } 
} 
+0

您能否告訴我們哪一行導致錯誤?這爲我們節省了搜索特定行的時間。對不起,搜索你的代碼後,我看到了錯誤的評論... – Nunners

+0

我很高興你終於找到它。有沒有辦法將3個代碼塊分開,這樣會更容易閱讀?我沒有看到行號如何顯示它? – Yaniv

回答

0

你正在運行到syntacitical問題是,你」重新嘗試從類Game獲取level1時,當level1是一個實例變量,而不是一個靜態變量。作爲一個實例變量,level1對於每個遊戲實例都是一個完全不同的變量,所以如果你簡單地說Game.level1,編譯器會想知道「哪個遊戲?」。

要改變這一點,你可以簡單地改變1級到一個靜態變量,通過改變這樣的:

public var level1:Level1; 

這樣:

public static var level1:Level1; 

這樣的變量將在所有場合的同一,你不應該有任何麻煩訪問它在這條線上:

Game.level1.enemies_arr.splice(this,1); 

我會盡管在某些設計原則(可能是你應該使用回調或信號或模塊化的東西)這裏可能存在問題,但快速簡單的解決方法是僅將static字添加到level1的聲明中。

+0

它似乎太工作了,但現在行爲似乎很奇怪。當我殺死1或2個敵人後,我不能再殺了更多。就像一個物體阻擋子彈一樣。如果我找不到解決方案,我會運行一些測試並上傳遊戲。謝謝任何方式 – Yaniv

+0

是否有可能獲得不在顯示列表中並阻止我的子彈對象的重複敵人對象? – Yaniv

+0

我不知道......我之前沒有使用過對象引用的拼接,所以我試着運行一個真正的快速實驗來看看這可能是否無法從數組中刪除引用,看起來像。 – Panzercrisis

0

你應該叫1級的遊戲實例。

在一個簡單的方法,你可以定義遊戲爲辛格爾頓

public class Game extends MovieClip { 

    private static var _instance:Game; 

    public static function getInstance():Game { 

     if (_instance == null) { 

      _instance = new Game(); 
     } 

     return _instance ; 

    } 
} 

所以模具的功能會是這樣

public function Die() 
    { 
     if(this.parent) 
     { 
      this.parent.removeChild(this); 

      //HERE IS THE ERROR 
      Game.getInstance().level1.enemies_arr.splice(this,1); 
     } 
    } 
+0

這很奇怪,它會拋出1120:訪問未定義的屬性_instance。儘管變量聲明。 – Yaniv

+0

應將_instance聲明爲靜態。我已經編輯了答案 – Pan

+0

這似乎工作,但就像Panzercrisis的答案,我現在有一個奇怪的行爲,可能與我的代碼有關。我需要深入挖掘。感謝您的幫助,我需要挖掘所有這些概念。 – Yaniv