2012-05-28 3 views
0

이 간단한 예제 을 만들었습니다. 더 복잡한 클래스 인 Main 클래스의 모든 설정을 초기화하고 필요할 때 Game 클래스에 추가 (및 업데이트)하려는 메뉴 항목을 사용했기 때문에 클래스는표시 목록에 (addChild)를 추가하려면 한 클래스의 초기화 된 객체 참조를 다른 클래스로 전달하려면 어떻게합니까?

) 분리 된 클래스 : 홈페이지 (문서 클래스입니다 (이상적으로) 모든 것이 초기화된다/생성)

public class Main extends MovieClip 
    { 
      //testing passing on reference to Game 
     private var testBitmap:Bitmap; 
     private var testBitmapData:BitmapData; 
     private var testArray:Array; 

      public function Main():void 
      { 
       testBitmapData = new BitmapData(256, 256, false, 0xCCDDEE);   
       testBitmap = new Bitmap(testBitmapData);    
       testArray = []; 
       testArray.push(testBitmap); //Array for reference 

       game = new Game(540, 960, testArray); 
        //create Game class, pass reference to Object 
       game.x = 0; 
       game.y = 0; 
      } 
    } 

클래스 : 게임 (문서 클래스에 의해 생성된다 (이상적으로) 모든 실행하는 경우)

public class Game extends MovieClip 
    { 

      private var testingArray:Array 

      public function Game(gameWidth:int, gameHeight:int, testArray:Array):void 
      { 
        this.testingArray = testArray; //assign to local Array and access 
        addChild(testingArray[0]); 
      //addChild to Game from an item intialised in Main, doesn't work >___< 
      } 
    } 

.

.

.

것은 나의 원래 게임 종류에서이다;

public function Game(gameWidth:int, gameHeight:int, cachedBitmapClipArray:Array) 
    { 

      this.cachedBitmapClipArray = cachedBitmapClipArray; 


      private function update():void 
      {   
       for each (tempCachedBitmapClip in cachedBitmapClipArray) 
       { 
        tempCachedBitmapClip.updateCurrentTile(); 
      //but updating through the reference to an item initialised in Main works !! 
       } 
      } 

    } 
: 그것은 캐시의 BitmapData의 초기 번들 이미 홈페이지에 addedChild 경우가) ( 여기 컷 다운 (만 작품을 업데이트하기위한 해당 참조를 순환 필요의 BitmapData을 알려주는 목록의 배열을 받아

.

는 어떻게 (

크로스 '범위'를 할 수있는 객체 즉, (하는 AddChild 할 수있는)? 원래 인스턴스로 행동 기준을 만들고 객체에 전달 (또는에 액세스) 할 ??) 또는 객체가 초기화 된 클래스에서만 제어 (인스턴스화)되어야하는지 여부

답변

1

마지막 질문에 대답하기를 원할 경우 예 객체를 한 객체에서 다른 객체로 전달할 수 있습니다. 문제가 정확히 무엇인지 이해하는 데 어려움을 겪고 있습니다. 일반적인 프로그래밍 용어로 객체 또는 다른 복합 유형은 참조로 전달되지만 원시 유형도 참조로 전달되지만 AVM의 내부는이를 값으로 전달 된 방식으로 처리합니다. 함수/메소드 호출을 통해 인수가 전달되는 방법에 대한 내 명확한 설명은 여기를 참조하십시오. http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f56.html

언어 자체에 대한 자세한 내용은 왼쪽의 트리 탐색에서 다른 영역을 확인하십시오. .

비록 컴파일러가이 오류를 해결할 것이라고 생각합니다. 첫 번째 코드는 게임에 게시했습니다. 반환 값은 다음과 같습니다. 생성자에 대한 void는 암시 적으로 선언 된 반환 유형이어야합니다. 클래스가 무엇이든간에 타이프됩니다.

참조로 전달하거나 값으로 전달하는 것과 관련하여 나 자신의 말로 설명을 추가하십시오. 값에 의한 전달은 객체의 값, 즉 변수가 가리키는 위치에 저장된 바이트가 실제로 사용되는 새 메모리 위치로 복사된다는 것을 의미합니다. 이것이 실제로 의미하는 바는 동일한 바이트의 메모리가 아니라, 각각 동일한 값을 가진 두 개의 분리 된 메모리 위치이고, 통과 한 후에 한 값의 수정은 원본에 영향을 미치지 않는다는 것입니다. 참조에 의한 전달은 메모리 위치를 전달하므로 값에 대한 새로운 메모리가 할당되지 않으며 두 값이 실제로 동일한 메모리 위치를 가리키고 있음을 나타냅니다 (포인터 자체는 다를 수 있지만 포인터는 둘 다 같은 위치를 가리 킵니다). 기억). 이 경우 객체는 동일합니다.

당신이하고있는 일이 바람직합니다. 노동을 나누고 클래스의 특정 유형의 기능을 포함 시키면 코드가 더 쉽게 작동합니다. 게임 개체 자체가 표시 트리의 무언가 (무대에 연결된 무언가)에 자식으로 추가되지 않는다면 문제가 될 것이라고 생각합니다. 새로운 게임을 만들고 그 위치를 설정했지만 무대에 추가하지 않은 것으로 보입니다. 그런 다음 Game에 아무 것도 추가해도 결코 디스플레이 트리의 일부가 아닙니다.

+0

감사합니다. (!!) 매개 변수를 전달하면 (동작) 값 또는 참조가 전송되었는지 여부에 따라 차별화 될 수 있음을 알게되었습니다. 지금까지 참조 방법을 생각해 보았습니다 ((예 : properites/변수를 설정하는 방법/함수) 나는 모든 전달 된 개체 (특히 자신의 클래스) 실제로 복제 된 실제 값 자체 (!!) 내 경우에 문제가 is'addChild (testingArray [0]); line testingArray가 Main에서 Bitmap에 대한 참조 만 포함하기 때문에 가정합니다. Game 클래스에서 실제로 addChild를 수행 할 수 없습니다. 아무 것도 표시 목록에 추가됩니다. – bikutaa

+0

다른 곳에서 나타나지 않는 한 내가 볼 수 없습니다 .. addChild (testBitmap); .. 하지만 게임 클래스에서 'testArray [0]'은 '[object Bitmap]'으로 추적됩니다. (이제 이건 그냥 참조하는 것입니다.) 기본적으로 나는 거대한 클래스 패키지에있는 모든 것 대신에 별도의 클래스로 물건을 나누고 싶다. (오 yeh : void는 거기에 의미가 없기 때문에 내가 왜 추가했는지 모르겠다 !!) – bikutaa

+0

@bikutaa 내 대답을 편집했습니다. 나는 몇 가지 시도를 해 주셔서 감사합니다. 좀 더 많은 정보를 되돌려 보냅니다. 당신이 확인한 것은 객체가 통과되고 있다는 것입니다. 객체의 메모리 주소 및/또는 UID 값을 살펴 보는 것이 동일한 객체인지를 실제로 확인하는 유일한 방법입니다. – shaunhusain