actionscript 3.0内置的碰撞检测似乎有缺陷,即使是完美的矩形

actionscript 3.0内置的碰撞检测似乎有缺陷,即使是完美的矩形,actionscript,collision-detection,Actionscript,Collision Detection,这是我的第一篇文章。我希望这个问题的答案不是那么明显——我找不到。 我在as3中有一个碰撞检测项目-我知道奇怪的形状不会完美地命中内置的检测方法,但据说完美的矩形正是它们所包含的边界框的形状-然而-运行下面的代码,我发现偶尔一个形状似乎不会在正确的时间触发测试,我不知道为什么 我有以下两个类-一个类创建一个矩形形状,一个主要类创建一个具有随机宽度和高度的形状,以一个随机的x值从屏幕顶部向底部以设定的速率设置动画,模仿重力。如果一个形状撞到屏幕底部,它会像预期的那样,位于舞台显示部分和未显示部分之

这是我的第一篇文章。我希望这个问题的答案不是那么明显——我找不到。 我在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);
        }
}
}
包
{
导入flash.display.Sprite;
导入flash.events.Event;
公共类框扩展了Sprite
{
专用var箱:箱;
专用变量框:数组;
私人var比重:数字=16;
公共功能盒()
{
init();
}
私有函数init():void
{   
box=新数组();
createBox();
addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
私有函数onEnterFrame(事件:事件):void
{
box.vy+=重力;
box.y+=box.vy;
如果(方框y+方框高度/2>舞台高度)
{
box.y=stage.stageHeight-box.height/2;
createBox();
}
对于(变量i:uint=0;i
确保box.vy不会超过创建的任何长方体的任何高度。否则,箱子可能会在下落时穿过其他箱子。(如果box.vy=40,box[i].height=30,则有可能直接越过它)

只需添加一张支票:

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

其中terminalVelocity是框的最小高度(在代码中,它看起来像10)。如果你真的想要这些小盒子,你必须使用比hitTestObject更精确的东西。

这可能是重力在进入帧时将盒子发送到特定位置的时候,这发生在执行hitTest之前。你可以试着在实际操作之前测试重力的结果,但我会加速重力,看看它是否仍然可以,如果可以,请在上面的if语句中输入