开发者

About class(es) in ActionScript

开发者 https://www.devze.com 2023-03-02 05:07 出处:网络
I have one folder(Projects), which contains 2 files: FirstPro.fla, FirstClass.as The goal of my question is interaction with two different objects (MovieClip) from class, which i created by myself, i

I have one folder(Projects), which contains 2 files: FirstPro.fla, FirstClass.as The goal of my question is interaction with two different objects (MovieClip) from class, which i created by myself, i have only one class, and it class for only one MovieClip, my goal is interaction, for MovieClip second which has name(letterPanel) has no class, its only MovieClip on scene;

In FirstClass.as i have the next code:

package
{
    import flash.utils.Timer; 
    import flash.events.TimerEvent; 
    import flash.display.MovieClip;
    import flash.events.*;
    import flash.display.Stage;

    public class FirstClass extends MovieClip
    {
        public function FirstClass()
        {
            var NewMyTimer:Timer = new Timer(100);
            NewMyTimer.addEventListener(TimerEvent.TIMER, hm);
            NewMyTimer.start();

        }

        public function hm(TimerEvent):void
        {
            this.y += 5;

            if(this.hitTestObject(letterPanel))
            {
                trace("Coincidens");

            }

        }

    }

}

And in FirstPro.fla file i have on the scene i have two MovieClip (Images), one of them has firstobj name, which has link with my created class, and it works, my object firstobj going down with the timer, but i would like to in开发者_C百科teraction with the second object(MovieClip-letterPanel) - if(this.hitTestObject(letterPanel)) { trace("Coincidens"); } If i write this code in my class this output mistake (letterPanel) is not undefined, what can i do with interactions of those two object in one class,?


You have to assign the MovieClip and you also can not start the timer untill that var has been set

package{
  import flash.utils.Timer; 
  import flash.events.TimerEvent; 
  import flash.display.MovieClip;
  import flash.events.*;
  import flash.display.Stage;
  public class FirstClass extends MovieClip{
    private var _letterPanel:MovieClip;
    public function FirstClass(){

    }
    public function startConter( ):void{
      var NewMyTimer:Timer=new Timer(100);
      NewMyTimer.addEventListener(TimerEvent.TIMER, hm);
      NewMyTimer.start();
    }
    public function hm(TimerEvent):void{
      this.y+=5;
      if(this.hitTestObject(this._letterPanel)){
        trace("Coincidens");
       }
    }
    public function set letterPanel( val:MovieClip ):void{
      this._letterPanel = val;
    }
  }
}


var firstClass:FirstClass = new FirstClass( );
firstClass.letterPanel = letterPanel;
firstClass.startCounter( );


My initial response(other than being confused, since your explaination of your project is a bit hard to understand) is that you don't have a good grasp on OOP. There was an answer for this question before that I believed to be correct. If I remember correctly you rejected it simply because it didn't utilize classes. OOP is about knowing how to as well as when to implement OOP concepts such as abstraction, encapsulation, inheritance, polymorphism etc.

In your case I think the simple answer to your question is the following:

stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);

function onEnterFrame(e:Event):void
{
    if(displayObject1.hitTestObject(displayObject2)
    trace("hit");

}// end function

However if you feel the need to truely use classes, I've created a similar flash application to demonstrate how you would go about it. Its basically 3 draggable red, green and blue circle display objects on the stage and when you drag a circle display object and it overlaps/intersects another circle display object a trace is made to describe the collision. You can run the application by simply copying and pasting the following code into your document class:

package 
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite 
    {
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            var redCircle:Circle = new Circle(Color.RED, 50);
            redCircle.name = "redCircle";
            redCircle.x = 100;
            redCircle.y = 100;
            addChild(redCircle);

            var greenCircle:Circle = new Circle(Color.GREEN, 50);
            greenCircle.name = "greenCircle";
            greenCircle.x = 300;
            greenCircle.y = 100;
            addChild(greenCircle);

            var blueCircle:Circle = new Circle(Color.BLUE, 50);
            blueCircle.name = "blueCircle";
            blueCircle.x = 500;
            blueCircle.y = 100;
            addChild(blueCircle);

            var collision:Collision = new Collision(stage, redCircle, greenCircle, blueCircle);
            collision.addEventListener(CollisionEvent.COLLISION, onCollision);

        }// end function

        private function onCollision(e:CollisionEvent):void
        {
            var collision:Collision = Collision(e.target);
            collision.removeEventListener(CollisionEvent.COLLISION, onCollision);

            trace("There was a collision between " + e.displayObject1.name + " and " + e.displayObject2.name);

        }// end function

    }// end class

}// end package

internal class Color
{
    public static const RED:uint = 0xFF0000;
    public static const GREEN:uint = 0x00FF00;
    public static const BLUE:uint = 0x0000FF;

}// end class

import flash.display.Sprite;
import flash.display.Stage;
import flash.events.EventDispatcher;
import flash.events.Event;
import flash.display.DisplayObject;
import flash.events.Event;
import flash.events.MouseEvent;

internal class Circle extends Sprite
{
    public function Circle(color:uint, radius:Number)
    {
        graphics.beginFill(color);
        graphics.drawCircle(0,0,radius);
        graphics.endFill();

        addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);

    }// end function

    private function onMouseDown(e:MouseEvent):void
    {
        parent.setChildIndex(this, parent.numChildren - 1);
        startDrag();

        stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp)

    }// end function

    private function onMouseUp(e:MouseEvent):void
    {
        stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);

        stopDrag();

    }// end function

}// end class

internal class Collision extends EventDispatcher
{
    private var _stage:Stage;
    private var _doVector:Vector.<DisplayObject>; 

    public function Collision(stage:Stage, ...displayObjects)
    {
        _stage = stage;
        _doVector = getDOVector(validateArgs(displayObjects, DisplayObject));

        init();

    }// end function

    private function init():void
    {   
        _stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);

    }// end function

    private function onEnterFrame(e:Event):void
    {
        for(var i:uint = 0; i < _doVector.length; i++)
        {
            for(var j:uint = 0; j < _doVector.length; j++)
            {
                if (_doVector[i] != _doVector[j])
                {
                    if (_doVector[i].hitTestObject(_doVector[j]))
                    dispatchEvent(new CollisionEvent(CollisionEvent.COLLISION, _doVector[i], _doVector[j]));

                }// end if

            } // end for

        }// end for

    }// end function

    private function validateArgs(args:Array, type:Class):Array
    {
        for each(var arg:* in args)
        if(!(arg is type))
        throw new ArgumentError("Argument must be of type " + type);

        return args;

    }// end function

    private function getDOVector(array:Array):Vector.<DisplayObject>
    {
        var doVector:Vector.<DisplayObject> = new Vector.<DisplayObject>();

        for each(var displayObject:DisplayObject in array)
        doVector.push(displayObject);

        return doVector;

    }// end function

}// end class

internal class CollisionEvent extends Event
{
    public static const COLLISION:String = "collision";

    private var _displayObject1:DisplayObject;
    private var _displayObject2:DisplayObject;

    public function get displayObject1():DisplayObject { return _displayObject1 };
    public function get displayObject2():DisplayObject { return _displayObject2 };

    public function CollisionEvent(type:String, 
                                   displayObject1:DisplayObject,
                                   displayObject2:DisplayObject,
                                   bubbles:Boolean = false,
                                   cancelable:Boolean = false):void
    {
        _displayObject1 = displayObject1;
        _displayObject2 = displayObject2;

        super(type, bubbles, cancelable);

    }// end function

    override public function clone():Event
    {
        return new CollisionEvent(type, displayObject1, displayObject2, bubbles, cancelable);

    }// end function

}// end class  
0

精彩评论

暂无评论...
验证码 换一张
取 消