2013-04-24 3 views
0

몇 시간 만에이 항목을 정렬 할 수 없습니다 (컨테이너에 자식을 추가하고 싶습니다.) 지금까지 내가 한 일입니다. 모든 문제는 클래스 작성자에게 있습니다.이 행은 par2.addChild (ship);// 작동하지만,이 라인 par2.containerSDv.addChild (선박); // 오류 : 1119AS3 : 컨테이너에 자식을 추가하는 방법은 무엇입니까?

감사

public class Main extends MovieClip 
{ 
    private var containerSD:Container = new Container; 
    private var ship:Ship2; 

    public function Main() 
    { 
     // constructor code 
     stage.addChild(containerSD); 
     //ship = new Ship2; 
     //containerSD.addChild(ship); 

    } 
} 

public class AddChild2 extends SimpleButton 
{ 
    private var creatorche:Creator = new Creator; 
    private var s:Ship2; 

    public function AddChild2() 
    { 
     // constructor code 
     addEventListener(MouseEvent.CLICK, onCLICK) 
    } 

    private function onCLICK(e:MouseEvent) 
    { 
     s = new Ship2; 
     creatorche.onCreator(s, stage); 
    } 
} 

public class Creator extends MovieClip 
{ 
    private var ship:MovieClip; 
    private var containerSDv:Container = new Container; 

    public function Creator() 
    { 
     // constructor code 
    } 

    public function onCreator(par1:MovieClip, par2:Stage) 
    { 
     ship = par1; 
     //par2.addChild(ship); //works 
     par2.containerSDv.addChild(ship); //error:1119 
     ship.x = Math.random() * 200; 
     ship.y = Math.random() * 200; 
    } 

} 
...

.

답변

1

나는 당신이 한발 뒤로 물러나서 전반적인 디자인과 목표를 재평가해야한다고 생각한다. 여기

public class Main extends MovieClip 
{ 
    private var container:Sprite = new Sprite; 
    private var newShipButton:NewShipButton = new NewShipButton; 
    private var creator:Creator; 

    public function Main() 
    { 
     creator = new Creator; 
     addChild(container); 
     addChild(newShipButton); 

     newShipButton.addEventListener(MouseEvent.CLICK, newShipButtonHandler); 

    } 

    private function newShipButtonHandler(e:MouseEvent):void 
    { 
     // shipStyle would be a MovieClip of the artwork for a given ship. 
     var ship:Ship = creator.makeShip(shipStyle, speed, power, container); 
     ship.x = Math.random() * 200; 
     ship.y = Math.random() * 200; 
    } 

} 

나는 선박 클래스는 무비 클립/스프라이트를 확장하고 작품을 가지고 것 가지고 같은 당신과 같은 몇 가지 가정을 만들어

public class Creator 
{ 

    public function Creator() 
    { 
     // constructor code 
    } 

    public function makeShip(style:MovieClip, speed:Number, power:Number, container:MovieClip):Ship 
    { 
     var ship:Ship = new Ship(style); 
     ship.speed = speed; 
     ship.power = power; 
     container.addChild(ship); 
     return ship; 
    } 

} 

창조주 클래스의 예 :

이 방법을 고려 , 그리고 당신의 NewShipButton 클래스가 SimpleButton을 확장하고 아트웍을 가질 것입니다.

귀하의 요구에 맞지 않는 경우, 귀하가하고 싶은 것이 무엇인지 설명해주십시오. 매우 단순한 설계에 적합하지 않습니다.

나는 당신이해야 할 것보다 훨씬 어려운 것을 만드는 많은 게시물을 보았습니다. 어쩌면 거기에 좋은 이유가있을 수 있지만, 그렇다면 왜 위의 방법이 당신의 목적을 위해 작동하지 않는지 설명하십시오.

+0

안녕하세요 prototypical, 답변 해 주셔서 감사합니다. 내 게임이 매분마다 바뀌고 있습니다. 나는 게임을 만드는 동안 나의 기술과 학습을 훈련하고있다. 위의 접근 방식은 정상이며 작동하지만 스테이지에서 전달 된 객체를 표시하는 기능을 Creator 클래스를 사용해야합니다. 모든 movieClip 객체를 Creator 클래스에 전달할 수 있고 전달 된 객체 (속도, 크기)에 일부 속성을 추가합니다. 완전히 확신 할 수는 없지만 이것은 디자인의 작곡 유형이어야합니다. 그러나 모든 것이 잘 작동하고 전달 된 객체를 무대에 추가 할 수는 있지만 컨테이너에는 추가 할 수 없습니다. – irnik

+0

원하는 속성을 가진 배를 제공하기 위해 생성자 클래스를 호출 할 수없는 이유는 무엇입니까? – prototypical

+0

그게 무슨 뜻인가요? – irnik

0

컨테이너에 이름을 지정하고 설정에서 엄격 모드를 선택 취소하면 코드가 작동합니다. DisplayObjectContainer에 대한 유용한 정보를 찾았습니다. http://joshblog.net/2007/07/12/disabling-actionscript-3-strict-mode-in-flash-cs3/

public class Creator extends MovieClip 
{ 
    private var ship:MovieClip; 
    private var containerSDv:Container = new Container; 

    public function Creator() 
    { 
     // constructor code 
    } 

    public function onCreator(par1:MovieClip, par2:Stage) 
    { 
     ship = par1; 
     //par2.addChild(ship); //works 
     par2.getChildByName("contain").addChild(ship); //error:1119 
     ship.x = Math.random() * 200; 
     ship.y = Math.random() * 200; 
    } 

} 

public class Main extends MovieClip 
{ 
    private var containerSD:Container = new Container; 
    private var ship:Ship2; 

    public function Main() 
    { 
     // constructor code 
     stage.addChild(containerSD).name = "contain"; 
     containerSD.x = 0; 
     containerSD.y = 0; 


    } 
} 
+0

위와 같이 모든 것을 그대로두고 Strict Mode (ticked)를 터치하지 않으면 1061 : 1061 : 정적 유형 flash.display : DisplayObject가있는 참조를 통해 addChild가 정의되지 않은 메서드를 호출 할 수 있습니다. DisplayObject – irnik

+0

그래서 기본적으로 컴파일러는 내 컨테이너가 동적 객체라는 것을 알지 못한다고 생각하며이를 어떻게 전달할 지 모른다. – irnik

관련 문제