【问题标题】:Actionscript 3: hitTestObject inside classesActionscript 3:类内的 hitTestObject
【发布时间】:2012-06-02 15:59:58
【问题描述】:

当我单击汽车 (MouseEvent.MOUSE_DOWN) 时,汽车会消失并执行 verlaagLevens() 函数。这可行(但我把它放在了 cmets 中)

现在,我想检测我的 Ship 和同一辆车之间的 hitTestObject 而不是 clickevent,但它似乎不起作用。 这是我的汽车级:

package {
import flash.display.*;
import flash.events.*;

public class Car extends MovieClip
{
    //private var hit:uint = 0;
    private var mySpeed:uint = 0;
    private var target:Ship;
    private var stageRef:Stage;
    public static var instance2:Car;

    public function Car(stageRef:Stage, target:Ship) {
        instance2 = this;
        this.x = x;
        this.stageRef = stageRef;
        this.target = target;
        mySpeed = 10;
        addEventListener(Event.ENTER_FRAME, beweeg);
        reset();

    }
    public function reset() {
        if(Main.end_def == 0){
        this.y =0-100/Math.random();
        this.x = Math.random()*(1+300-60)+60;
        }
        //hit = 0;

    }
    public function getroffen() {

        Main.instance.verlaagLevens();
        this.parent.removeChild(this);

    }


    public function beweeg(evt:Event):void {
        if (hitTestObject(target.hit))
        {
            trace("hitTest");
            getroffen();
            reset();
        }
        this.y += mySpeed;
        if (this.y>480) {
            reset();
        }

    }


}

}

这是我的主班:

package {

    import flash.display.*;
    import flash.display.Stage;
    import flash.events.*;
    import flash.utils.*;

    public class Main extends MovieClip
    {

        private var aantaltegenliggers:uint = 5;
        private var _levens:uint = 3;
        var ourShip:Ship = new Ship(stage);
        public static var instance:Main;
        var car:MovieClip;
        var end = 0;
        public static var end_def:uint;


        public function Main()
        {
            stop();
            instance = this;
        }

        public function initGame():void
        {
            //add it to the display list
            stage.addChild(ourShip);
            ourShip.x = stage.stageWidth / 2;
            ourShip.y = stage.stageHeight / 1.3;

            _levens=3;
            end_def=0;
            teken_levens();


            for (var i:uint=0; i<aantaltegenliggers; i++) 
                {
                    var myTimer:Timer = new Timer(5000, 1);
                    myTimer.start();
                    myTimer.addEventListener(TimerEvent.TIMER_COMPLETE, function(e:TimerEvent){


                    if (end==0){
                    car = new Car(stage, ourShip);
                    car.name = "car"+i;
                    //car.addEventListener(Event.ENTER_FRAME,getroffen);
                    car.addEventListener(Event.ENTER_FRAME,gameover);
                    stage.addChild(car);

                    }
                    });


            }

        }
            public function verlaagLevens():void 
            {
                verwijder_een_leven(_levens);
                _levens--;
            }
            // één leven tekenen
            public function teken_een_leven(levenIndex:uint):void 
            {
                var leven:MovieClip = new Leven(); // linkage - export voor Actionscript
                leven.x = levenIndex*35; // positie leven in de x as, 35 pixels opschuiven
                leven.y = 10; // positie leven in de y as
                leven.name = "leven"+levenIndex;
                addChild(leven);    // één leven tonen op het scherm
            }
            // alle levens tekenen
            public function teken_levens():void 
            {
                verwijder_levens(); // verwijder één leven als je de missile niet hebt kunnen raken
                for (var i:uint=1; i<=_levens; i++) 
                {
                    teken_een_leven(i);
                }
            }
            // een leven van het scherm verwijderen
            public function verwijder_een_leven(levenIndex:uint):void 
            {
                if (!(getChildByName("leven"+levenIndex)==null) ) 
                {  // ! is negatie = logische operator
                    removeChild(getChildByName("leven"+levenIndex));
                }
            }
            // alle levens verwijderen
            public function verwijder_levens():void 
            {
                for (var i:uint=1; i<=_levens; i++) 
                {
                    verwijder_een_leven(i);
                }
            }

            public function gameover(evt:Event):void 
            {
                if(_levens==0)
                {   
                    if(end_def == 0){
                    end = 1;
                    stage.removeChild(ourShip);
                    gotoAndStop("gameover");
                    }
                    end_def=1;
                }
            }



    }

}

【问题讨论】:

  • 我不太擅长actionscript,所以可能会有一些错误,我真的很感激任何帮助。谢谢!

标签: actionscript-3 flash class hittest


【解决方案1】:

您正在 Car 的构造函数中执行命中测试,该构造函数仅被调用一次。 您可能想要的(因为汽车移动)是在您的开始功能中检查每一帧是否发生碰撞。 (这也是假设 target.hit 是正确的,我无法判断,因为我无法访问您的船,但我会为您提供疑问)。

【讨论】:

  • 好的,就是这样。hittest 被检测和跟踪。现在我的函数 beweeg() 看起来像这样: public function beweeg(evt:Event):void { if (hitTestObject(target.hit)) { trace("hitTest"); //getrofen(); } this.y += mySpeed;如果(this.y>480){重置();但是当我删除 getroffen();从 cmets 我得到一个错误:TypeError:错误#1009:无法访问空对象引用的属性或方法。
  • 抱歉格式化,添加评论时不能这样做
  • 我认为问题出在 this.parent.removeChild(this);当我调试时,这就是出现的错误
  • 您可以编辑原始帖子以显示更改。您还想从汽车中删除事件侦听器。即使它已从舞台上移除,这些事件仍将触发。接下来我会进入 main 并尝试注释掉将被调用的路径后面的行,不确定错误来自哪一行
  • 跟踪 this.parent 而不是 removechild
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多