hitTestObject即使没有碰撞就检测到碰撞,而在另一种情况下它没有注册

时间:2014-12-27 08:10:57

标签: actionscript-3 flash

大家好,我正在这个小型的tamogachi游戏上做我的大学项目,我把它拖放到char上,他的健康或金钱wtv根据它改变,我们不得不用多个班级来做,所以eveything很好,除了如果没有通过不同的类正确注册,则为hitTestObject。

这是我的代码,我的所有项目文件链接也附在下面请帮助:

项目文件的链接:https://drive.google.com/folderview?id=0B07PZ7vQgjsteWhVMnItczd2YUE&usp=sharing

主类:

package  {

    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.utils.Timer;


    public class Main extends MovieClip {





        public var addStuff:AddStuff = new AddStuff;
        public var hmClass:HealthMoney = new HealthMoney;

        public function Main() {

            addChild(addStuff.bg);


            addStuff.batMan.x = 700;
            addStuff.batMan.y = 600;
            addChild(addStuff.batMan);

            addChild(addStuff.box);
            addStuff.box.x = 1050;
            addStuff.box.y = 500;

            addChild(addStuff.batHealth);
            addStuff.batHealth.x = 890;
            addStuff.batHealth.y = 430;

            addChild(addStuff.dollar);
            addStuff.dollar.x = 890;
            addStuff.dollar.y = 570;

            addChild(addStuff.men);
            addStuff.men.x = 800;
            addStuff.men.y = 900;

            addChild(addStuff.batBurger);
            addStuff.batBurger.x = 400;
            addStuff.batBurger.y = 900;

            addChild(addStuff.batDrink);
            addStuff.batDrink.x = 600;
            addStuff.batDrink.y = 900;

            addChild(addStuff.batMoney);
            addStuff.batMoney.x = 850;
            addStuff.batMoney.y = 940;

            AddHealth();
            AddMoney();


            }

        public function AddHealth(){

            hmClass.HealthTimer();
            addChild(hmClass.myHealthText);

            addEventListener(Event.ENTER_FRAME,Kill);
            function Kill(e:Event){

                if(hmClass.health <= 0){

                    hmClass.batLifeTimer.stop();
                    addStuff.batMan.rotation -= 1;
                    if(addStuff.batMan.rotation <= -80){

                        addStuff.batMan.alpha = -5;

                        }


                    }

                }


        }

        public function AddMoney(){

                addChild(hmClass.myMoneyText);
                hmClass.Money();



                }










    }

}

AddStuff Class:

package  {


    public class AddStuff{

        public var bg:BG = new BG();
        public var batHealth:BatHealth = new BatHealth();
        public var batMan:BatMan = new BatMan();
        public var batBurger:BatBurger = new BatBurger();
        public var batDrink:BatDrink = new BatDrink();
        public var batMoney:BatMoney = new BatMoney();
        public var men:Men = new Men();
        public var box:Box = new Box();
        public var dollar:Dollar = new Dollar();

        public function AddStuff() {



        }



    }

}

HealthMoney类:

package  {
    import flash.events.TimerEvent;
    import flash.utils.Timer;
    import flash.text.TextField;
    import flash.events.Event;
    import flash.display.MovieClip;
    import flash.text.TextFormat;
    import flash.events.MouseEvent;

    public class HealthMoney extends MovieClip{

        public var health:int = 100;
        public var money:int = 100;
        public var batLifeTimer:Timer = new Timer(1000);
        public var myHealthText:TextField = new TextField();
        public var myHealthTextFormat:TextFormat = new TextFormat();
        public var myMoneyText:TextField = new TextField();
        public var myMoneyTextFormat:TextFormat = new TextFormat();
        public var addStuffClass:AddStuff = new AddStuff;
        public var addStuff1:AddStuff = new AddStuff;
        public function HealthMoney() {
            // constructor code

        }

        public function HealthTimer(){


            myHealthText.setTextFormat(myHealthTextFormat);
            myHealthTextFormat.size = 120;
            myHealthTextFormat.color = 0xFFFFFF;

            myHealthText.defaultTextFormat = myHealthTextFormat;
            //myHealthText.border = true;
            myHealthText.x = 970;
            myHealthText.y = 350;
            myHealthText.width = 200;
            myHealthText.height = 120;





            batLifeTimer.addEventListener(TimerEvent.TIMER, timerListener);

            function timerListener (e:TimerEvent):void{

                health--;
                //trace(health);
                myHealthText.text = health.toString();
                }


            batLifeTimer.start();




            addEventListener(Event.ENTER_FRAME, BatBurger);
            function BatBurger(e:Event):void{

                if(addStuff1.batMan.hitTestObject(addStuff1.batBurger)){

                    health++;
                    //trace("yo");

                    }

                }






            }


        public function Money():void{

            myMoneyText.setTextFormat(myMoneyTextFormat);
            myMoneyTextFormat.size = 120;
            myMoneyTextFormat.color = 0xFFFFFF;

            myMoneyText.defaultTextFormat = myMoneyTextFormat;
            myMoneyText.border = true;
            myMoneyText.x = 970;
            myMoneyText.y = 500;
            myMoneyText.width = 500;
            myMoneyText.height = 200;
            //addChild(myMoneyText);
            myMoneyText.text = money.toString();

            addEventListener(MouseEvent.MOUSE_UP, AddMoney);

            function AddMoney(e:MouseEvent):void{

                if(addStuff1.batMoney.hitTestObject(addStuff1.batMan)){

                    myMoneyText.text = money.toString();
                    money = money + 100;
                    trace("hey");


                    }



                }



            }











    }
}

和DraggableItem类:

(这个类是我要拖动的所有对象的基类)

package  {

    import flash.events.MouseEvent;
    import flash.display.MovieClip;

    public class DraggableItem extends MovieClip{

        public function DraggableItem() {

            addEventListener(MouseEvent.MOUSE_DOWN, startmove);
            addEventListener(MouseEvent.MOUSE_UP, stopmove);

        }

        public function startmove(e:MouseEvent){

            this.startDrag();

            }
        public function stopmove(e:MouseEvent){

            this.stopDrag();

            }

    }

}

1 个答案:

答案 0 :(得分:0)

试试这个:

主要课程:

package  {

import flash.display.MovieClip;
import flash.events.Event;
import flash.utils.Timer;
import flash.display.Stage; 

public class Main extends MovieClip {




    public static var stageRef:Stage; 
    public var addStuff:AddStuff = new AddStuff;
    public var hmClass:HealthMoney;

    public function Main() {

        stageRef = stage;

        addChild(addStuff.bg);


        addStuff.batMan.x = 700;
        addStuff.batMan.y = 600;
        addChild(addStuff.batMan);

        addChild(addStuff.box);
        addStuff.box.x = 1050;
        addStuff.box.y = 500;

        addChild(addStuff.batHealth);
        addStuff.batHealth.x = 890;
        addStuff.batHealth.y = 430;

        addChild(addStuff.dollar);
        addStuff.dollar.x = 890;
        addStuff.dollar.y = 570;

        addChild(addStuff.men);
        addStuff.men.x = 800;
        addStuff.men.y = 900;

        addChild(addStuff.batBurger);
        addStuff.batBurger.x = 400;
        addStuff.batBurger.y = 900;

        addChild(addStuff.batDrink);
        addStuff.batDrink.x = 600;
        addStuff.batDrink.y = 900;

        addChild(addStuff.batMoney);
        addStuff.batMoney.x = 850;
        addStuff.batMoney.y = 940;

        hmClass = new HealthMoney(addStuff);

        AddHealth();
        AddMoney();


        }

    public function AddHealth(){

        hmClass.HealthTimer();
        addChild(hmClass.myHealthText);

        addEventListener(Event.ENTER_FRAME,Kill);
        function Kill(e:Event){

            if(hmClass.health <= 0){

                hmClass.batLifeTimer.stop();
                addStuff.batMan.rotation -= 1;
                if(addStuff.batMan.rotation <= -80){

                    addStuff.batMan.alpha = -5;

                    }


                }

            }


    }

    public function AddMoney(){

            addChild(hmClass.myMoneyText);
            hmClass.Money();



            }










}

}

HealthMoney类:

package  {
import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.text.TextField;
import flash.events.Event;
import flash.display.MovieClip;
import flash.text.TextFormat;
import flash.events.MouseEvent;

public class HealthMoney extends MovieClip{

    public var health:int = 100;
    public var money:int = 100;
    public var batLifeTimer:Timer = new Timer(1000);
    public var myHealthText:TextField = new TextField();
    public var myHealthTextFormat:TextFormat = new TextFormat();
    public var myMoneyText:TextField = new TextField();
    public var myMoneyTextFormat:TextFormat = new TextFormat();
    public var addStuffClass:AddStuff = new AddStuff;
    public var addStuff1:AddStuff;

    public function HealthMoney(addStuff:AddStuff) {
        this.addStuff1 = addStuff;

    }

    public function HealthTimer(){


        myHealthText.setTextFormat(myHealthTextFormat);
        myHealthTextFormat.size = 120;
        myHealthTextFormat.color = 0xFFFFFF;

        myHealthText.defaultTextFormat = myHealthTextFormat;
        //myHealthText.border = true;
        myHealthText.x = 970;
        myHealthText.y = 350;
        myHealthText.width = 200;
        myHealthText.height = 120;





        batLifeTimer.addEventListener(TimerEvent.TIMER, timerListener);

        function timerListener (e:TimerEvent):void{

            health--;
            //trace(health);
            myHealthText.text = health.toString();
            }


        batLifeTimer.start();




        addEventListener(Event.ENTER_FRAME, BatBurger);
        function BatBurger(e:Event):void{

            if(addStuff1.batMan.hitTestObject(addStuff1.batBurger)){

                health++;
                //trace("yo");

                }

            }






        }


    public function Money():void{

        myMoneyText.setTextFormat(myMoneyTextFormat);
        myMoneyTextFormat.size = 120;
        myMoneyTextFormat.color = 0xFFFFFF;

        myMoneyText.defaultTextFormat = myMoneyTextFormat;
        myMoneyText.border = true;
        myMoneyText.x = 970;
        myMoneyText.y = 500;
        myMoneyText.width = 500;
        myMoneyText.height = 200;
        //addChild(myMoneyText);
        myMoneyText.text = money.toString();

        Main.stageRef.addEventListener(MouseEvent.MOUSE_UP, AddMoney);

        function AddMoney(e:MouseEvent):void{

            if(addStuff1.batMoney.hitTestObject(addStuff1.batMan)){

                myMoneyText.text = money.toString();
                money = money + 100;
                trace("hey");


                }



            }



        }











}
}

行&#34; public static var stageRef:Stage;&#34;创建一个Stage类型的静态变量。可以从其他类访问静态变量,而无需该类的实例。

行&#34; stageRef = stage&#34;基本上将stageRef的值设置为stage。您只需编写&#34; Main.stageRef&#34;即可访问stageRef。你需要一个舞台实例,因为行#34; Main.stageRef.addEventListener(MouseEvent.MOUSE_UP,AddMoney);&#34;在HealthMoney类中。如果您只编写&#34; addEventListener(MouseEvent.MOUSE_UP,AddMoney);&#34 ;,则mouse_up事件将无法正常工作,因为焦点位于舞台上。

行&#34; hmClass = new HealthMoney(addStuff);&#34;将AddStuff类的实例发送到HealthMoney构造函数。你需要这样做,因为如果你写了#34; addStuff1 = new AddStuff&#34;,你将创建一个新的AddStuff实例,而新的AddStuff实例没有你在主类中添加的动画片段,这将是使hittestobject不会触发。