简体   繁体   中英

Test collision between two movie clips in two different classes AS3

I need to test the collision between 2 movie clips, using air for android action script 3.

Its a collision between an object and several obstacles.

My structure is the following :

  • The base FLA file, is linked to Action Script file called baseCode.as.
  • In this AS file, i create the obsctacles, using the following code :

baseCode.as :

package {
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.geom.Point;
    import Mc_MC;                // Not strictly needed

    public class baseCode extends flash.display.MovieClip
    {
        //private static var SYMBOLS:Array = new Array(MySymbol1, MySymbol2);
        public var t:int = 0;
        public function baseCode()
        {
            // Create five symbols:
            for (var i:int = 0; i < 5; i++) {
                trace(i);
                makeSymbol();
            }
        }

    function randomRange(minNum:Number, maxNum:Number):Number 
    {
       return (Math.floor(Math.random() * (maxNum - minNum + 1)) + minNum);
    }
        public function makeSymbol():void
        {


            trace("IT entered makeSymbol");
            // Pick a random symbol from the array:
          // var symType:Class = SYMBOLS[0];

            //trace(SYMBOLS[Math.random() * SYMBOLS.length]);
            // Construct the new symbol:
            //var Positi : Number = new Number(Math.random);
           var loc:Point = new Point(randomRange(100,stage.stage.height),0);
           var loc2:Point = new Point(randomRange(110,stage.stage.height),0);
            //var loc:Point = new Point(10*randomRange(15, stage.width),100*randomRange(10 , stage.width));
            trace("this is the starting point" , loc);
            var sym:Mc_MC = new Mc_MC(1 + Math.random() *10, loc);
            if( t % 2 == 0 ){
            var sym2:Mc_MC2 = new Mc_MC2(15 + Math.random() *10, loc);
            // Listen for the object hitting the left edge:
            //sym2.addEventListener(Event.COMPLETE, remakeObject);
            this.addChild(sym2);
            }
            sym.addEventListener(Event.COMPLETE, remakeObject);
            this.addChild(sym);
            t ++;

        }


        public function remakeObject(e:Event):void
        {
                e.target.removeEventListener(Event.COMPLETE, remakeObject);
            //e.removeChild(sym);
            //e.parent.removeChild(this.child);
        //  removeChild(this);
           // this.removeChild(sym);
            // Replace the dead symbol:
            makeSymbol();
        }
    }
}
  • Mc_MC and Mc_MC2 are two Action Script file in which the obstacles are called :

Mc_MC.as :

 package { 
        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.geom.*;
        import flash.display.Screen;
        import flash.system.Capabilities;
        public class Mc_MC extends MovieClip
        {


        public var speed:Number;       //  Pixels moved per frame
     var valuee:baseCode;

    public function Mc_MC(speed:Number, startPosition:Point)
    {
        this.speed = speed;
        this.addEventListener(Event.ENTER_FRAME, update);

        this.x = startPosition.x;
        this.y = startPosition.y;
    }


    public function update(speed:Number)


    {
        var screenWidth:Number = Capabilities.screenResolutionX;
        var screenHeight:Number = Capabilities.screenResolutionY;


        trace("this.y" , this.y);
        trace("this is the stage height" , screenHeight);
        trace("this.speed" , this.speed);

       if (this.y >= screenHeight - 100) {  // We're at the left edge
            trace("Entered if");
            trace("new Starting Pos" , this.y);

            this.y = stage.height;
                parent.removeChild(this);

        this.removeEventListener(Event.ENTER_FRAME, update);

            this.dispatchEvent(new Event(Event.COMPLETE));
        }
        else this.y += this.speed;
    }
    }
}
  • In the base FLA file, i create the main object that will collide with all the obstacles created using Mc_MC and Mc_MC2. I create it using the following code :

Home.fla

import flash.events.*

//import flash.events.EventDispatcher.addEventListener()

import flash.display.DisplayObject;
//import flash.events.MouseEvent;
import flashx.textLayout.events.UpdateCompleteEvent;
import flash.display.MovieClip;

var offsetX:Number;
var offsetY:Number;
//var draggedObject:DisplayObject;
var my_obj:OriginalObject = new OriginalObject();
//left.addEventListener(MouseEvent.MOUSE_MOVE, drag);


//The speed of the scroll movement.
var scrollSpeed:uint = 2;

//This adds two instances of the movie clip onto the stage.
var s1:ScrollBg = new ScrollBg();
var s2:ScrollBg = new ScrollBg();



left.addEventListener(MouseEvent.MOUSE_DOWN,mouseDown);

function mouseDown(e:MouseEvent):void {

    stage.addEventListener(MouseEvent.MOUSE_UP,mouseUp); //listen for mouse up on the stage, in case the finger/mouse moved off of the button accidentally when they release.
    addEventListener(Event.ENTER_FRAME,myButtonClick); //while the mouse is down, run the tick function once every frame as per the project frame rate
}

function mouseUp(e:MouseEvent):void {
    removeEventListener(Event.ENTER_FRAME,myButtonClick);  //stop running the tick function every frame now that the mouse is up
    stage.removeEventListener(MouseEvent.MOUSE_UP,mouseUp); //remove the listener for mouse up
}


right.addEventListener(MouseEvent.MOUSE_DOWN,mouseDown2);
function mouseDown2(e:MouseEvent):void {

    stage.addEventListener(MouseEvent.MOUSE_UP,mouseUp2); //listen for mouse up on the stage, in case the finger/mouse moved off of the button accidentally when they release.
    addEventListener(Event.ENTER_FRAME,stopDragging); //while the mouse is down, run the tick function once every frame as per the project frame rate
}

function mouseUp2(e:MouseEvent):void {
    removeEventListener(Event.ENTER_FRAME,stopDragging);  //stop running the tick function every frame now that the mouse is up
    stage.removeEventListener(MouseEvent.MOUSE_UP,mouseUp2); //remove the listener for mouse up
}



my_obj.x = stage.width / 2;
my_obj.y = stage.height  - (stage.height / 3 );


stage.addChild(my_obj);

function myButtonClick(ev:Event):void
{

    trace("UPPP");


    if(my_obj.x > (my_obj.width*2)){
    my_obj.x = my_obj.x - 10;

    trace("In the limit");
    }

    else {

          trace("out of bounds");

    }

    trace("myButton has been clicked.");

    }

    //// This function is called when the mouse button is released. 
    function stopDragging(ev2:Event):void
    {
            trace("Down");
            if(my_obj.x <= right.x){
            my_obj.x = my_obj.x + 10;
            }



    }

How can I test the collision of the moving Mc_MC / Mc_MC2 with my_obj considering that the come from different AS files?

I am new to AS, so any help would be appreciated!

If you want to be able to collision test objects from different classes / parentage, then you need to set up your project in a way that you can gain a reference to said objects.

From the looks of it, your two objects are actually in the same class already (as your main timeline code and document class code share the same scope, so what you declare in one should be available in the other).

The only thing you are missing, is a top-level reference to your obstacle/Mc_MC. As currently you assign it to a var that is scoped to the makeSymbol function (so you only have a reference to it inside that function).

Solution

In your document class ( baseCode.as ) , create a top-level var to hold a reference to that obstacle: (for reference, you have a top level var called t , put this line above or below that)

    private var obstacle:Mc_MC;

later in your function that instantiates the new Mc_MC ( makeSymbol ), assign the instance to that top level var:

    obstacle = new Mc_MC(1 + Math.random() *10, loc);
    addChild(obstacle);

Now you can access that obstacle var anywhere else in the main timeline or document class.

   if(my_obj.hitTest(obstacle)){

   }

As an aside, if you have a document class, there is no point in having code on the first frame of your main timeline as that code would work the same in your document class (though it has to be contained in a function). Here is an example of where to move main timeline code:

    public class Main extends MovieClip {

        public function Main():void {
            //listen for the added to stage event prior to do anything display oriented
            this.addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event):void {
            //this is the best place to put the equivalent of timeline code (not including vars or functions, put those in the class root NOT nested here)
        }
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM