测试两个不同类AS3

时间:2016-03-03 10:13:20

标签: actionscript-3 flash air

我需要测试2个影片剪辑之间的碰撞,使用air for android动作脚本3。

它是一个物体与几个障碍物之间的碰撞。

我的结构如下:

  • 基本FLA文件链接到名为baseCode.as的Action Script文件。
  • 在此AS文件中,我使用以下代码创建了障碍物:

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和Mc_MC2是两个动作脚本文件,其中有障碍物:

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;
    }
    }
}
  • 在基础FLA文件中,我创建的主对象将与使用Mc_MC和Mc_MC2创建的所有障碍物发生碰撞。我使用以下代码创建它:

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



    }

考虑到来自不同AS文件,我如何测试移动Mc_MC / Mc_MC2my_obj的碰撞?

我是AS的新手,所以任何帮助都会受到赞赏!

1 个答案:

答案 0 :(得分:1)

如果您希望能够碰撞来自不同类/父母的测试对象,那么您需要以可以获得对所述对象的引用的方式设置项目。

从它的外观来看,你的两个对象实际上已经在同一个类中(因为你的主时间轴代码和文档类代码共享相同的范围,所以你在另一个中声明的内容应该在另一个中可用)。

您唯一缺少的是对您的障碍/ Mc_MC的顶级参考。目前,您将其分配给范围为makeSymbol函数的var(因此您只能在该函数中引用它)。

<强>解决方案

在您的文档类( baseCode.as )中,创建一个顶级var来保存对该障碍的引用:(作为参考,您有一个名为t的顶级var ,把这一行放在上面或下面)

    private var obstacle:Mc_MC;

稍后在您的函数中实例化新的Mc_MC(makeSymbol),将实例分配给该顶级var:

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

现在,您可以在主时间轴或文档类中的任何其他位置访问obstacle var。

   if(my_obj.hitTest(obstacle)){

   }

顺便说一句,如果你有一个文档类,那么在主时间轴的第一帧上有代码是没有意义的,因为该代码在你的文档类中的工作方式相同(尽管它必须包含在一个函数中) )。以下是移动主时间轴代码的示例:

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