找出导致命中测试的对象,并将位置与AS3中的角色进行比较

时间:2015-01-27 14:36:45

标签: actionscript-3 actionscript collision-detection hittest flash-cc

我一直在寻找这个答案,我找不到我的问题的答案,因为我的对象不在数组中,而是在舞台上的动画片段中。我试图检测哪个物体引起碰撞,以便我使用这些物体来限制角色的移动。看着所有灌木丛下面的图像,房子和几十个其他物体将被用作阻挡物体。

enter image description here

我找到了一种方法来检测与movieclips子对象的碰撞,但实际上并没有检测到哪个对象发生了这种碰撞。我每次进行一次移动时都尝试循环遍历每个对象,并测试是否存在碰撞,但它从不记录任何命中。

这是我当前正在注册命中的代码。

        var background = bGround; // Make reference to the BG in the mainActions 
        var bgObjects = bGround.bgElements; 

        //trace(bgObjects.numChildren); 

        if(bgObjects.hitTestPoint(character.x,character.y,true)) { 
            trace("character: " + character.x + "," + character.y);
            trace("position of hit " + bgObjects.x + "," + bgObjects.y);
        }

它嵌套在一个事件监视器内,用于监视按键,因此每次按下按钮时或每次用户移动字符时都会重新测试。我认为在命中测试发生后循环遍历对象是最好的想法,或者在每个运动循环中并特别测试该对象,但无法正常工作。这是一次尝试。

for (var i : Number = 0; i < bgObjects.numChildren; i++) { 
                    var instBgElem = bgObjects.getChildAt(i); 

                    if(character.hitTestPoint(instBgElem.x, instBgElem.y, true)) { 

                        // Check X Left
                        if (character.x < bgObjects.getChildAt(i)).x { 
                                trace("hit left"); 
                        }
                        // Check X right 
                        if ( character.x > bgObjects.getChildAt(i)).x { 
                                trace("hit right"); 
                        }
                        // Check Y top 
                        if ( character.y < bgObjects.getChildAt(i)).y { 
                                trace("hit top"); 
                        }
                        // Check Y Bottom
                        if ( character.y > bgObjects.getChildAt(i)).y { 
                                trace("hit bottom"); 
                        }

                    }
                }

编辑:我能够在一定程度上获得一段代码,但它确实没有测试在后台对象上发生命中测试的位置。我可能需要找到每个对象的边界框并找出边界框的哪一侧被击中,接受所有帮助。

for (var i : Number = 0; i < bgObjects.numChildren; i++) { 
                 var instBgElem = bgObjects.getChildAt(i);
                 if(instBgElem.hitTestPoint(character.x,character.y,true)){
                     if(instBgElem.x > character.x) { 
                       trace("right"); 
                     } else if(instBgElem.x < character.x) { 
                       trace("left"); 
                     }
                     if(instBgElem.y > character.y) { 
                       trace("up"); 
                     } else if(instBgElem.y < character.y) { 
                       trace("down"); 
                     }
                 }
            }

编辑2:问题在于找出命中测试与角色接触的位置,以便我可以限制该移动。我不知道该怎么做,我一直在试验边界框。

var charBounding = character.getBounds(this); 

        trace("character bounding box" + charBounding); 
        trace("character bottom: " + charBounding.bottom);
        trace("character top:" + charBounding.top); 
        trace("character left:" + charBounding.left); 
        trace("character right:" + charBounding.right); 

输出角色并在角色移动时更新角色,不知道如何利用这个优势。

字符边界框(x = 85.95,y = 79.05,w = 72.2,h = 72.2) 性格底部:151.25 角色顶部:79.05 性格左:85.95 性格权利:158.15

0 个答案:

没有答案