0

这是我的第一篇文章。我希望这个问题的答案不是那么明显——我找不到。我在 as3 中有一个碰撞检测项目——我知道奇怪的形状不会完美地击中内置检测方法,但据说完美的矩形正是它们包含的边界框的形状——但运行下面的代码,我发现每隔一段时间,一个形状似乎不会在正确的时间触发测试,我不知道为什么。

我有以下两个类 - 一个创建一个矩形形状,一个创建具有随机宽度和高度的形状的主类,以设定的速率从屏幕顶部以随机 x 值向底部设置动画,模仿重力。如果一个形状撞到屏幕底部,它会像预期的那样位于舞台下边界的显示和未显示部分之间的中间位置 - 但是当两个形状最终碰撞时,预期的行为并不总是发生 - 预期的行为因为已经下落并与另一个形状碰撞的形状应该停止并停留在它所接触的形状的顶部,而有时下落的形状会部分或完全穿过它应该碰撞的形状。

有谁知道这是为什么?

以下是我的两个完整课程:

// 盒子类 //

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

1

确保 box.vy 永远不会超过任何创建的盒子的高度。否则,盒子有可能在下落时穿过其他盒子。(如果 box.vy = 40 且 box[i].height=30,则可以直接通过它)。

只需添加一个检查:

if(box.vy>terminalVelocity)box.vy=terminalVelocity)

其中 terminalVelocity 是一个盒子的最小高度(在您的代码中,它看起来像 10)。如果你真的想要那些小盒子,你将不得不使用比 hitTestObject 更精确的东西。

于 2013-06-10T14:40:24.390 回答