Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 循环问题的冲突检测,仅测试一个数组项?_Actionscript 3_Collision Detection - Fatal编程技术网

Actionscript 3 循环问题的冲突检测,仅测试一个数组项?

Actionscript 3 循环问题的冲突检测,仅测试一个数组项?,actionscript-3,collision-detection,Actionscript 3,Collision Detection,[如果这不是一个真正深入的问题,我深表歉意,但我想一劳永逸地解决这个问题] 我试图查看四叉树,但在没有任何优化的情况下,碰撞检测已经遇到了问题。进行了搜索,发现了一个非常简洁的示例: (主要是内部框架C部分) 试图模仿这一点,它不会起同样的作用。 在特定对象之间只检测到一些碰撞。当物体不移动时,出于某种原因,它似乎工作得更好 我真的搞不清楚问题出在哪里,代码基本上与示例相同。我没有盲目复制粘贴它,我知道除了这一部分发生了什么: if (j <= i)

[如果这不是一个真正深入的问题,我深表歉意,但我想一劳永逸地解决这个问题]

我试图查看四叉树,但在没有任何优化的情况下,碰撞检测已经遇到了问题。进行了搜索,发现了一个非常简洁的示例: (主要是内部框架C部分)

试图模仿这一点,它不会起同样的作用。 在特定对象之间只检测到一些碰撞。当物体不移动时,出于某种原因,它似乎工作得更好

我真的搞不清楚问题出在哪里,代码基本上与示例相同。我没有盲目复制粘贴它,我知道除了这一部分发生了什么:

if (j <= i)
                        continue;
方格

package com.martino.objects 
{
    import flash.display.Sprite;
    /**
     * ...
     * @author Martino Wullems
     */
    public class Square extends CollisionObject
    {
        public var hitGraphic:Sprite;

        public function Square(Size:int) 
        {
            size = Size;

            drawSquare();
        }

        private function drawSquare():void 
        {
            graphic = new Sprite();
            graphic.graphics.beginFill(0xFF0000);
            graphic.graphics.drawRect(0, 0, size, size);
            graphic.graphics.endFill();
            addChild(graphic);

            hitGraphic = new Sprite();
            hitGraphic.graphics.beginFill(0x0066FF);
            hitGraphic.graphics.drawRect(0, 0, size, size);
            hitGraphic.graphics.endFill();
            addChild(hitGraphic);
            hitGraphic.visible = false;
        }

        override public function Collision():void {

            trace("I collided with a friend (inside joke)");
        }

        public override function debugDraw():void {

            if (isHit) {

                graphic.visible = false;
                hitGraphic.visible = true;

            }else {

                graphic.visible = true;
                hitGraphic.visible = false;
            }
        }

    }

}
如果您有任何帮助,我们将不胜感激,希望进一步了解


编辑:更改了一些内容,虽然有所进展,但我仍然不清楚

在TestWorld.as中更改了一些内容:

package com.martino.world 
{
    import com.martino.objects.Ball;
    import com.martino.objects.CollisionObject;
    import flash.display.MovieClip;
    import flash.events.Event;
    /**
     * ...
     * @author Martino Wullems
     */
    public class TestWorld extends MovieClip
    {
        public var objects:Array;

        public function TestWorld()
        {
            initWorld();
        }

        private function initWorld():void 
        {
            objects = new Array();
            addEventListener(Event.ENTER_FRAME, loopWorld);
        }

        private function loopWorld(e:Event):void 
        {
            var object:*;

            for (var i:int = 0; i < objects.length; i++) {

                MoveObject(objects[i]);
                //CheckCollision(i);// doesn't work here for some reason [case 1]

            }

            CheckCollision(0); //[case 2]

        }

        private function CheckCollision(i:int):void 
        {               
                //test collision
                for (var i:int = 0; i < objects.length; i++){ //only use in case 2

                    var elementA:CollisionObject;
                    var elementB:CollisionObject;
                    elementA = objects[i];

                for (var j:int = i + 1; j < objects.length; j++) {

                    if (j <= i){
                        continue; //j resets each I loop and therefor sets collision to false while it could be true
                          }

                    elementB = objects[ j ]// as ObjSprite;

                    if (elementA.hitTestObject(elementB)) {
                       elementA.isHit = elementB.isHit = true;

                    }
                }
            } //[case 2]



        }

        private function MoveObject(object:CollisionObject):void 
        {
            object.x += object.vx;
            object.y += object.vy;

            ////////////////////
            //check boundaries//
            ////////////////////

            if (object.x > stage.stageWidth)
            {
                object.vx *= -1;

            }else if (object.x < 0)
            {
                object.vx *= -1;

            }else if (object.y > stage.stageHeight)
            {
                object.vy *= -1;

            }else if (object.y < 0)
            {
                object.vy *= -1;
            }

            object.isHit = false;// where do we check when it isn't colliding? this seems messy!
        }

        public function addObject(object:CollisionObject):void
        {
            objects.push(object);
            addChild(object);
        }

    }

}
package com.martino.world
{
导入com.martino.objects.Ball;
导入com.martino.objects.CollisionObject;
导入flash.display.MovieClip;
导入flash.events.Event;
/**
* ...
*@作者Martino Wullems
*/
公共类TestWorld扩展了MovieClip
{
公共变量对象:数组;
公共函数TestWorld()
{
initWorld();
}
私有函数initWorld():void
{
对象=新数组();
addEventListener(Event.ENTER_FRAME,loopWorld);
}
私有函数loopWorld(e:事件):void
{
var对象:*;
for(变量i:int=0;istage.stageHeight)
{
object.vy*=-1;
}else if(object.y<0)
{
object.vy*=-1;
}
object.isHit=false;//当它没有碰撞时,我们在哪里检查?这看起来很混乱!
}
公共函数addObject(对象:CollisionObject):void
{
对象。推(对象);
addChild(object);
}
}
}
在collisionobject中还添加了setter和getter(编辑之前的so部分)

不确定为什么我不能将checkcollision放在enter frame函数的循环中?(如果我不这样做,则不会显示碰撞)。并且将“isHit=false”放在moveobjects中以重置命中检查似乎也很混乱

我想我看不出什么时候物体没有碰撞来重置它们。 在hittest上做一个else语句来检查是否没有冲突是不可行的,这似乎是合乎逻辑的,因为hittestcheck中可能有两个以上的项目发生冲突


有什么想法吗?

我必须查看原始资料才能理解这一点。下面是供参考的

这条线

if (j <= i) continue;
if(j元素b.rect.y+元素b.rect.height){
}否则{
elementA.isHit=elementB.isHit=true;
}
}
}

(值得一提的是,我认为这家伙的代码实际上是在检查对象与自身的碰撞情况——他应该在查看他的代码并检查代码之后,更改“if j两件事

这一部分是必要的,以确保您不会浪费时间遍历循环并重新检查已比较的项目

if (j <= i)
                    continue;

if(j Right,我现在不明白了!在阅读您的文章之前,请看我的更新代码!在您的新编辑中,在“CheckCollision(I:int)”中,您传递了参数“I”,但您在“for”循环中用“for”(var I:int=0;“。您需要做的是检查每一项,确保没有重复检查(即,这是j@Dominic关于重置var i的好方法的要点,但他不应该需要j i实际注释掉整个循环,因此它捕捉到传递的“i”直接。对不起,应该注意到了。你能编辑这篇文章以便我们能看到最新的代码吗?我不确定最新的代码是什么。谢谢,我现在明白了:)我真的不想为hittest的方法烦恼,只是想知道为什么它不能正常工作。谢谢你的回复!
package com.martino.world 
{
    import com.martino.objects.Ball;
    import com.martino.objects.CollisionObject;
    import flash.display.MovieClip;
    import flash.events.Event;
    /**
     * ...
     * @author Martino Wullems
     */
    public class TestWorld extends MovieClip
    {
        public var objects:Array;

        public function TestWorld()
        {
            initWorld();
        }

        private function initWorld():void 
        {
            objects = new Array();
            addEventListener(Event.ENTER_FRAME, loopWorld);
        }

        private function loopWorld(e:Event):void 
        {
            var object:*;

            for (var i:int = 0; i < objects.length; i++) {

                MoveObject(objects[i]);
                //CheckCollision(i);// doesn't work here for some reason [case 1]

            }

            CheckCollision(0); //[case 2]

        }

        private function CheckCollision(i:int):void 
        {               
                //test collision
                for (var i:int = 0; i < objects.length; i++){ //only use in case 2

                    var elementA:CollisionObject;
                    var elementB:CollisionObject;
                    elementA = objects[i];

                for (var j:int = i + 1; j < objects.length; j++) {

                    if (j <= i){
                        continue; //j resets each I loop and therefor sets collision to false while it could be true
                          }

                    elementB = objects[ j ]// as ObjSprite;

                    if (elementA.hitTestObject(elementB)) {
                       elementA.isHit = elementB.isHit = true;

                    }
                }
            } //[case 2]



        }

        private function MoveObject(object:CollisionObject):void 
        {
            object.x += object.vx;
            object.y += object.vy;

            ////////////////////
            //check boundaries//
            ////////////////////

            if (object.x > stage.stageWidth)
            {
                object.vx *= -1;

            }else if (object.x < 0)
            {
                object.vx *= -1;

            }else if (object.y > stage.stageHeight)
            {
                object.vy *= -1;

            }else if (object.y < 0)
            {
                object.vy *= -1;
            }

            object.isHit = false;// where do we check when it isn't colliding? this seems messy!
        }

        public function addObject(object:CollisionObject):void
        {
            objects.push(object);
            addChild(object);
        }

    }

}
if (j <= i) continue;
for (var j:int = i + 1; i < objects.length; j++) {
    for (i = 0; i < myrects.length; i++) {
        elementA = myrects[ i ] as ObjMyRect;
        for (j = 0; j < myrects.length; j++) {
            if (j <= i)
                continue;
            elementB = myrects[ j ] as ObjMyRect;
            if (elementA.rect.x + elementA.rect.width < elementB.rect.x) {
            } else if (elementA.rect.x > elementB.rect.x + elementB.rect.width) {
            } else if (elementA.rect.y + elementA.rect.height < elementB.rect.y) {
            } else if (elementA.rect.y > elementB.rect.y + elementB.rect.height) {
            } else {
                elementA.isHit = elementB.isHit = true;
            }
        }
    }
if (j <= i)
                    continue;