2013-10-10 3 views
0

저는 AS3을 처음 사용하고 간단한 플래시 게임을 만들려고합니다. 내 문제는 클래스 외부의 특정 배열에 액세스하는 것입니다. 일부 변수 및 기능에 액세스하는 데 성공했지만이 기능에 상당히 집착하고 있습니다.AS3 클래스 및 변수 액세스

플래시 파일에 연결된 주 클래스 인 게임, 배경 요소와 적을 생성하는 Level1, 마지막으로 적 클래스가 있습니다.

Game 클래스는 적 (Enemy 클래스 포함)을 스폰하고 레벨을 클래스로 인스턴스화합니다. 적을 공격하면 Enemy 클래스의 메서드가 표시 목록에서 해당 메서드를 제거한 다음 실패하고 throw하는 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 문제는 '당신이 그에게

public class Game extends MovieClip { 

    private static var _instance:Game; 

    public static function getInstance():Game { 

     if (_instance == null) { 

      _instance = new Game(); 
     } 

     return _instance ; 

    } 
} 

입니다

level1이 정적 변수가 아닌 인스턴스 변수 인 경우 Game 클래스에서 level1을 가져 오려고합니다. 인스턴스 변수 인 level1은 각 게임 인스턴스마다 완전히 다른 변수입니다. 따라서 Game.level1이라고 말하면 컴파일러는 "어떤 게임입니까?"라고 궁금해합니다.

이를 변경하려면, 당신은 단순히이를 변경하여, 정적 변수로 레벨 1을 변경할 수 있습니다 :

public var level1:Level1; 

을 여기에 :

public static var level1:Level1; 

그 방법은 변수가 모든 인스턴스에서 동일한 것 이 줄에서 액세스하는 데 문제가 없어야합니다.

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

특정 디자인 원칙에 문제가있을 수 있지만 (모듈화를 위해 콜백이나 신호 등을 사용해야 할 수도 있음), 신속하고 쉬운 해결책은 level1의 선언에 static이라는 단어를 추가하는 것입니다.

+0

그것도 효과가있는 것 같지만 행동이 이상하게 보입니다. 내가 1 ~ 2 명의 적을 죽인 후에 나는 더 많은 것을 죽일 수 없습니다. 어떤 물체가 총알을 막고있는 것처럼 말입니다. 솔루션을 찾을 수없는 경우 몇 가지 테스트를 실행하고 게임을 업로드합니다. 어떤 식 으로든 – Yaniv

+0

고마워 디스플레이 목록에 없으며 내 총알 개체를 차단하는 중복 적 개체가있을 가능성이 있습니까? – Yaniv

+0

확실하지 않습니다 ... 전에 객체 참조로 스플 라이스를 사용하지 않았으므로 실제 빠른 실험을 실행하여 배열에서 참조를 제거하지 못했을지를 확인했지만, 그것처럼 보입니다. – Panzercrisis

0

당신은 게임 인스턴스 레벨 1 호출해야 주셔서 감사합니다. 간단한 방법으로

, 당신은 싱글로 게임을 정의 할 수 있습니다 것은 그래서 다이 기능이

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

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

그것은 이상한데, 그것은 1120을 던졌습니다 : 정의되지 않은 속성 _ 인스턴스의 액세스. 변수 선언에도 불구하고. – Yaniv

+0

_instance는 정적으로 선언해야합니다. 나는 대답을 편집했습니다 – Pan

+0

이것은 잘 작동하지만, Panzercrisis 대답처럼 보입니다. 이제는 이상한 행동이 내 코드와 관련이있을 수 있습니다. 나는 더 깊게 파고 갈 필요가있다. 도움을 주셔서 감사합니다. 이러한 모든 개념을 파헤쳐 야합니다. – Yaniv