2013-10-10 4 views
0

Я новичок в AS3, и я стараюсь сделать простую флеш-игру. Моя проблема касается доступа к определенному массиву вне его класса. Мне удалось получить доступ к некоторым переменным и функциям, но я полностью застрял на этом.AS3 Доступ к классам и переменным

Существует 3 класса: игра, которая является основным классом, связанным с флеш-файлом, Level1, который порождает элемент фона и врагов, и, наконец, класс Enemy.

Класс игры создает экземпляр класса Level1, который порождает врагов (с классом Enemy) и нажимает их на массив. Когда враг получает удар, метод класса Enemy удаляет его из списка отображения, а затем пытается удалить его из массива, расположенного в классе Level1, который терпит неудачу и бросает:

1119: Доступ к возможному неопределенному свойству level1 через ссылку со статическим типом класса.

Другой проблемой является некоторое время, когда пули останавливаются в середине экрана, и я не смог отследить эту ошибку.

В любом случае, это мой первый пост, связанный с кодом, и если он слишком запутан, скажите мне, и я постараюсь сделать его более читаемым. извинения за 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 проблемы вы бежите в том, что вы» re пытается получить level1 из класса Game, когда level1 является переменной экземпляра, а не статической переменной. В качестве переменной экземпляра level1 является совершенно другой переменной для каждого экземпляра игры, поэтому, если вы просто скажете Game.level1, компилятор задается вопросом: «Какая игра?»

Чтобы изменить это, вы могли бы просто изменить level1 в статической переменной, изменив следующим образом:

public var level1:Level1; 

к этому:

public static var level1:Level1; 

Таким образом, переменная будет одинаков во всех случаях , и вы не должны иметь никаких проблем с его доступом по этой линии:

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

Я буду скажем, что здесь могут быть проблемы с определенными принципами проектирования (возможно, вы должны использовать обратные вызовы или сигналы или что-то для модульности), но быстрое и простое решение состоит в том, чтобы просто добавить слово static в декларацию уровня1.

+0

кажется, что это работает, но поведение кажется странным сейчас. После того, как я убью 1 или 2 врагов, я не могу убить больше. Как если бы объект блокировал пулю. Я проведу тест и выгружу игру, если не найду решение. Спасибо любым способом – Yaniv

+0

Возможно ли, что я получил дублированный объект врага, который не находится в списке отображения и блокирует мой объект пули? – Yaniv

+0

Я не уверен ... Я раньше не использовал сплайсинг с ссылкой на объект, поэтому я попытался выполнить настоящий быстрый эксперимент, чтобы проверить, не удалось ли удалить ссылку из массива, но это не так, Похоже на это. – Panzercrisis

0

Вы должны назвать level1 на экземпляре игры.

В простой форме, можно определить игру, как Singleton

public class Game extends MovieClip { 

    private static var _instance:Game; 

    public static function getInstance():Game { 

     if (_instance == null) { 

      _instance = new Game(); 
     } 

     return _instance ; 

    } 
} 

Так Die функция будет как этот

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

Смежные вопросы