从OOP AS3中的两个对象获取数据

时间:2014-03-29 05:53:01

标签: actionscript-3 oop

我有像这样的Car类

public class Car extends Sprite
{
    private var car :Sprite;
    private var buttonCar :Sprite;
    private var _kmh :int;

    public function Car() 
    {
        makeCar();
        makeButtonCar();
    }
    private function makeCar() : void
    {
        car = new Sprite();
        car.graphics.beginFill(0x0000FF, 1);
        car.graphics.drawRect(0, 0, 100, 50);
        car.x = 100;
        this.addChild(car);
    }
    private function makeButtonCar() : void
    {
        buttonCar = new Sprite();
        buttonCar.graphics.beginFill(0xFF0000, 1);
        buttonCar.graphics.drawCircle(0, 0, 25);
        buttonCar.x = 300;
        this.addChild(buttonCar);
        buttonCar.addEventListener(MouseEvent.MOUSE_DOWN, KMH);
    }
    private function KMH(e:MouseEvent) : void
    {
        _kmh++;
        trace("kmh: "+_kmh);
    }
}

在Main类中我从Car类,newCar1和newCar2创建newCar。

public class OOPVariable extends Sprite
{
    private var newCar1  :Car;
    private var newCar2  :Car;

    public function OOPVariable()
    {
        newCar1 = new Car();
        addChild(newCar1);

        newCar2 = new Car();
        newCar2.y = 100; 
        addChild(newCar2);

        super();
    }
}

当newCar中的一个按钮点击并且鼠标事件仍在Car类中时,我想从所有对象newCar获得变量_kmh的总数。

2 个答案:

答案 0 :(得分:0)

你可以做内森所说的,或者你可以公开你的kmh变量;

这样你可以通过mouseEvent访问它。

首先,您必须导入flash.utils.getQualifiedClassName

然后您可以使用for()循环来获取舞台上的所有汽车,并追踪总KMH。

// traces out the total KMH and num of cars on stage
// your car class should keep kmh updated

private function getTotalKMH(e:MouseEvent) :void
{
     var totalCars:int = 0;
     var KMH:int = 0;

     for (var i:int = 0; i < stage.numChildren-1; i++)
     {
          if (getQualifiedClassName(e.currentTarget) == "Car")
          {   
              ++totalCars;
              KMH += getChildByIndex(i).kmh; // ".kmh" is the variable in your car class
          } 
     }

     trace("Total Cars: " + totalCars + "\nTotal KMH: " + KMH);
}

当然,你可以做的不仅仅是跟踪它。

如果需要,可以将它传递给类范围变量或函数。

答案 1 :(得分:0)

感谢所有人的回复,我使用自定义事件和调度事件,就像Nathan所说:D

这是Main class,carListener方法在按钮车点击时从所有车辆总计所有kmh

package
{
    import flash.display.Sprite;

    import support.CarEvent;
    import support.CarObject;

    public class OOPCar extends Sprite
    {
        private var newCar1 :CarObject;
        private var newCar2 :CarObject;

        private var totalKmh :int = 0;

        private var currentName :String;

        public function OOPCar()
        {
            newCar1 = new CarObject();
            newCar1.name = "car1";
            newCar1.setKmh(2);
            addChild(newCar1);
            newCar1.addEventListener(CarEvent.UPDATE, carListener);

            newCar2 = new CarObject();
            newCar2.name = "car2";
            newCar2.setKmh(4);
            addChild(newCar2);
            newCar2.addEventListener(CarEvent.UPDATE, carListener);
            newCar2.y = 100;
        }

        private function carListener(e:CarEvent) : void
        {
            trace("kmhCar: "+e.kmhCar);
            totalKmh += e.kmhCar;
            trace("totalKmh: "+totalKmh);
            currentName = e.currentTarget.name;
        }
    }
}

上车的课程

package support
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;

    public class CarObject extends Sprite
    {
        private var car         :Sprite;
        private var buttonCar   :Sprite;
        private var _kmh        :int;

        public function CarObject()
        {
            makeCar();
            makeButtonCar();
        }

        private function makeCar() : void
        {
            car = new Sprite();
            car.graphics.beginFill(0x0000FF, 1);
            car.graphics.drawRect(0, 0, 100, 50);
            car.x = 100;
            this.addChild(car);
        }

        private function makeButtonCar() : void
        {
            buttonCar = new Sprite();
            buttonCar.graphics.beginFill(0xFF0000, 1);
            buttonCar.graphics.drawCircle(0, 0, 25);
            buttonCar.x = 300;
            this.addChild(buttonCar);
            buttonCar.addEventListener(MouseEvent.MOUSE_DOWN, update);
        }

        public function setKmh(kmh:int) : void
        {
            _kmh = kmh;
        }

        public function update(e:MouseEvent) : void
        {
            dispatchEvent(new CarEvent(CarEvent.UPDATE, true, false, _kmh));
        }
    }
}

这是我的自定义事件

package support
{
    import flash.events.Event;

    public class CarEvent extends Event
    {
        public static const UPDATE:String = "update";

        public var kmhCar   :int;

        public function CarEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false, kmhCar:int = 0)
        {
            super(type, bubbles, cancelable);

            this.kmhCar = kmhCar;
        }

        public override function clone() : Event
        {
            return new CarEvent(type, bubbles, cancelable, kmhCar);
        }

        public override function toString():String
        {
            return formatToString("CarEvent", "type", "bubbles", "cancelable", "eventPhase", "kmhCar");
        }
    }
}