AS3: Как добавить ребенка в контейнер?

Я не могу разобраться с этим уже несколько часов ;(. Я хочу добавить ребенка в контейнер. Это то, что я сделал до сих пор. Все проблемы в классе Creator. Эта строка par2.addChild(ship); //работает , но эта строка par2.containerSDv.addChild(ship);//ошибка:1119.

Спасибо

    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;
    }

}

.


person irnik    schedule 24.04.2013    source источник


Ответы (2)


Я думаю, вам, возможно, придется сделать шаг назад и переоценить свой общий дизайн и цели.

рассмотреть этот подход:

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;
    }

}

Вот пример класса Creator

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;
    }

}

Я сделал несколько предположений, например, что у вас есть класс Ship, который будет расширять MovieClip/Sprite и иметь иллюстрацию, а ваш класс NewShipButton будет расширять SimpleButton и иметь иллюстрацию.

Если это не соответствует вашим потребностям, объясните, что вы пытаетесь сделать, что не соответствует этому чрезвычайно простому дизайну.

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

person prototypical    schedule 24.04.2013
comment
Привет, прототип, большое спасибо за ваш ответ. Моя игра меняется каждую минуту. Я тренирую свои навыки и учусь, делая игру. Ваш подход выше подходит и работает, но мне нужно использовать мой класс Creator, функции которого должны отображать переданный объект на сцене. Я хочу иметь возможность передать любой объект movieClip классу Creator, и он добавит некоторые свойства к переданному объекту (скорость, размер). Я не совсем уверен, но это должен быть тип дизайна «Композиция». Однако все работает нормально, и я могу добавить любой переданный объект на сцену, но не в контейнер. - person irnik; 24.04.2013
comment
Почему вы не можете просто вызвать класс создателя, чтобы он дал вам корабль с нужными вам свойствами? - person prototypical; 24.04.2013
comment
Я обновил свой ответ. Теперь у него есть класс Creator. Вы можете видеть, что я имею в виду. Вы даже можете переместить определение скорости/мощности или чего-то еще внутри класса Creator, но это был просто пример того, о чем я говорю. - person prototypical; 24.04.2013
comment
Отправьте мне электронное письмо по адресу [email protected], и я смогу помочь вам гораздо быстрее, чем здесь, если у вас есть Gmail и мы можем общаться в чате. - person prototypical; 24.04.2013
comment
Спасибо prototype, теперь все ясно только одно: Вы добавляете ребенка из класса Main, я пытаюсь сделать это из класса Creator. Я ошибаюсь, поступая таким образом? В чем плюс и минус вашего подхода? - person irnik; 24.04.2013
comment
Я только что изменил его. Честно говоря, это действительно зависит от того, ПОЧЕМУ вам нужно добавить это в Creator. Если есть веская причина, то сделайте это. - person prototypical; 24.04.2013
comment
Лично мне нравится добавлять/удалять дочерние элементы в том месте, где существует контейнер, в данном случае в классе Main. Одним из преимуществ выполнения этого в Creator является то, что в Main на одну строку меньше кода. Но... кто-то, читающий ваш код в main, вряд ли предположит, что вы добавляете дочерний элемент в контейнер. Явность имеет свои преимущества. - person prototypical; 24.04.2013

Если я даю имя контейнеру и снимаю галочку со строгого режима в настройках, мой код работает. Я нашел очень полезную статью о 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;


    }
}
person irnik    schedule 24.04.2013
comment
Если я оставлю все, как указано выше, и не буду касаться строгого режима (отмечено), я получаю сообщение об ошибке 1061:1061: вызов возможно неопределенного метода addChild через ссылку со статическим типом flash.display:DisplayObject - person irnik; 24.04.2013
comment
Итак, в основном я думаю, что компилятор не знает, что мой контейнер является динамическим объектом, и я не знаю, как ему об этом сообщить. - person irnik; 24.04.2013