0

これは私の最初の投稿です。これに対する答えがそれほど明白に見つからないことを願っています-私はそれを見つけることができませんでした. 私は as3 で衝突検出プロジェクトを持っています - 奇妙な形状が組み込みの検出方法に完全にヒットしないことは知っていますが、おそらく完全な長方形は、それらが含まれている境界ボックスの形状とまったく同じです - それでも - 以下のコードを実行して、私はときどき、形状が適切なタイミングでテストをトリガーしないように見えることがありますが、その理由はわかりません。

以下の 2 つのクラスがあります。1 つは長方形の形状を作成し、ランダムな幅と高さの形状を作成するメイン クラスは、重力を模倣して、画面の上部からランダムな x 値で下部に向かってアニメーション化します。形状が画面の下部に当たると、予想どおり、その下の境界についてステージの表示部分と非表示部分の中間に位置しますが、2 つの形状が最終的に衝突すると、予想される動作が常に発生するとは限りません。予想される動作落下して別の形状と衝突した形状は、接触した形状の上で停止して静止する必要がありますが、落下する形状は、衝突したはずの形状を部分的または完全に通過する場合があります。

これがなぜなのか誰にも分かりますか?

以下の 2 つのクラス全体を次に示します。

// ボックスクラス //

package
{
    import flash.display.Sprite;

    public class Box extends Sprite
    {
        private var w:Number;
        private var h:Number;
        private var color:uint;
        public var vx:Number = 0;
        public var vy:Number = 0;

        public function Box(width:Number=50,
                            height:Number=50,
                            color:uint=0xff0000)

        {
            w = width;
            h = height;
            this.color = color;
            init();
        }

        public function init():void{
            graphics.beginFill(color);
            graphics.drawRect(0, 0, w, h);
            graphics.endFill();
        }
    }
}

//メインクラス//

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

    public class Boxes extends Sprite
    {
        private var box:Box;
        private var boxes:Array;
        private var gravity:Number = 16;


        public function Boxes()
        {
            init();
        }
        private function init():void

        {   
            boxes = new Array();
            createBox();
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }

        private function onEnterFrame(event:Event):void
        {
            box.vy += gravity;
            box.y += box.vy;

            if(box.y + box.height / 2 > stage.stageHeight)
            {
                box.y = stage.stageHeight - box.height / 2;
                createBox();
            }
            for(var i:uint = 0; i < boxes.length; i++)
            {
                if(box != boxes[i] && box.hitTestObject(boxes[i]))
                {
                    box.y = boxes[i].y - box.height;
                    createBox();
                }
            }

    }

        private function createBox():void
        {
            box = new Box(Math.random() * 40 + 10,
                          Math.random() * 40 + 10, 
                          0xffaabb)
            box.x = Math.random() *stage.stageWidth;
            addChild(box);
            boxes.push(box);
        }
}
}
4

1 に答える 1