Actionscript 3 使用AS3中的所有场景对象检查角色命中测试

Actionscript 3 使用AS3中的所有场景对象检查角色命中测试,actionscript-3,collision-detection,hittest,Actionscript 3,Collision Detection,Hittest,好的,这是我的问题,需要解释一下 我们班在AS3中开发了一个街机游戏。这所大学有一台arcade机器,机器上的操作系统由我们的老师开发,并提供软件开发工具包。这没什么疯狂的,所以大部分都相当简单。我只是想指出这一点,主要是因为我没有使用ENTER_FRAME事件和循环函数,而是使用了一个名为update()的重写函数,SDK提供了该函数来执行每一帧的更新 好吧,别挡道,这是我的问题。我有一个名为GameState的文档类,它基本上在处于该状态时处理游戏。在这门课上,我设置了世界和角色。现在它只有

好的,这是我的问题,需要解释一下

我们班在AS3中开发了一个街机游戏。这所大学有一台arcade机器,机器上的操作系统由我们的老师开发,并提供软件开发工具包。这没什么疯狂的,所以大部分都相当简单。我只是想指出这一点,主要是因为我没有使用ENTER_FRAME事件和循环函数,而是使用了一个名为update()的重写函数,SDK提供了该函数来执行每一帧的更新

好吧,别挡道,这是我的问题。我有一个名为GameState的文档类,它基本上在处于该状态时处理游戏。在这门课上,我设置了世界和角色。现在它只有两座山,两座城堡,三个岛屿和角色

private function initWorld():void
    {
        trace("World has initiated");
        addChild(hazardArea)
        positionElement(hazardArea, 0, 560);

        addChild(mountainSideRight);
        positionElement(mountainSideRight, 730, 200)

        addChild(mountainSideLeft);
        positionElement(mountainSideLeft, 0, 200);

        addChild(castleOne);
        positionElement(castleOne, 5, 160);

        addChild(castleTwo);
        positionElement(castleTwo, 765, 160);

        addIslands();
    }
position元素只是一个函数,用于设置添加到stage的mci的x和y坐标。现在,我还在AddChild上创建了一个覆盖,这样每当我将一个子元素添加到stage时,它都会将其保存到一个数组中,我以后可以访问该数组:

override public function addChild(object:*):void
    {
        super.addChild(object);
        worldObjects.push(object);
    }
好的,这三个岛是通过addIsland添加的,看起来像这样:

private function addIslands():void
    {
        var island:Array = Islands.getIslandCords();
        for (var x:int = 0; x < DiceNumbers.NUM_ISLS; x++) 
        {
            addChild(island[x].mc);
            positionElement(island[x].mc, island[x].x, island[x].y);

        }
    }
var gravity:Number = 2;
public var moveX:Number = 300;
public var moveY:Number = 50;
public var xSpeed:Number = 0;
public var ySpeed:Number = 2;
public static const playerSpeed:Number = 3;
public var friction:Number = .75;
public function checkCollision(listOfObjects:Vector.<MovieClip>):void
{   

   OuterLoop: for (var i:int = 0; i < worldObjects.length; i++) {
        if(worldObjects[i] is Player){

            var objOne:MovieClip = worldObjects[i];             
            for (var j:int = 0; j < worldObjects.length; j++){
                if (j == i){
                    // elimates self comparisons.
                }
                else{
                    var objTwo:MovieClip = worldObjects[j];
                    player.ySpeed = checkIntersect(objOne, objTwo )
                    if (player.ySpeed == -1)
                        break OuterLoop;
                }
            }
        }
    }
}

private function checkIntersect(player:MovieClip, objTwo:MovieClip):int
{
    if(player.hitTestObject(objTwo)){
        return -1;
    }
    else{
        return 2;
    }
}
然后,我提到的update()函数的工作原理类似于EVENT_FRAME循环,其中包含以下内容:

public function update():void
{
    xSpeed *= friction;
    moveX += xSpeed;
    moveY += ySpeed
    theDwarf.y += gravity;

    this.x = moveX;
    this.y = moveY;

    updateControls();
}
theDwarf是我的侏儒电影剪辑的实例,UpdateControl为我的侏儒提供了移动的功能

好的。。。。最后,在update()函数下的GameState类中,我调用了碰撞类,并将包含场景中所有对象的数组传递给它。在这个类中,我检查碰撞:

public function checkCollision(listOfObjects:Vector.<MovieClip>):void
    {   

        for (var i:int = 0; i < worldObjects.length; i++) {
            if(worldObjects[i] is Player){

                var objOne:MovieClip = worldObjects[i];             
                for (var j:int = 0; j < worldObjects.length; j++){
                    if (j == i){
                        // elimates self comparisons.
                    }
                    else{
                        var objTwo:MovieClip = worldObjects[j];
                        checkIntersect(objOne, objTwo )
                    }
                }
            }
        }
    }

private function checkIntersect(player:MovieClip, objTwo:MovieClip):void
    {
        if(player.hitTestObject(objTwo)){
            player.ySpeed = -1;
        }
        else{
            player.ySpeed = 2;
        }
    }
公共函数checkCollision(ListofObject:Vector.):void
{   
for(var i:int=0;i

我的问题是:这个函数检查我的玩家在舞台上的每一个物体。所以,即使我的矮人降落在1个岛上,他也没有撞到其他2个岛,所以Y速度一直重置为2。如果我去掉else语句,我的矮人引力永远不会回到2,他也不会再摔倒。我找不到解决这个问题的办法。。。我非常努力地想找到一种方法来解决这个问题,但我很困惑。。。我想让我的侏儒倒下,除非他在我的岛上或山上。我希望我已经足够清楚地解释了我的问题,这已经成为一个巨大的帖子D谢谢你

为了更好地解释我之前的评论,您必须更改最后两个函数,如下所示:

private function addIslands():void
    {
        var island:Array = Islands.getIslandCords();
        for (var x:int = 0; x < DiceNumbers.NUM_ISLS; x++) 
        {
            addChild(island[x].mc);
            positionElement(island[x].mc, island[x].x, island[x].y);

        }
    }
var gravity:Number = 2;
public var moveX:Number = 300;
public var moveY:Number = 50;
public var xSpeed:Number = 0;
public var ySpeed:Number = 2;
public static const playerSpeed:Number = 3;
public var friction:Number = .75;
public function checkCollision(listOfObjects:Vector.<MovieClip>):void
{   

   OuterLoop: for (var i:int = 0; i < worldObjects.length; i++) {
        if(worldObjects[i] is Player){

            var objOne:MovieClip = worldObjects[i];             
            for (var j:int = 0; j < worldObjects.length; j++){
                if (j == i){
                    // elimates self comparisons.
                }
                else{
                    var objTwo:MovieClip = worldObjects[j];
                    player.ySpeed = checkIntersect(objOne, objTwo )
                    if (player.ySpeed == -1)
                        break OuterLoop;
                }
            }
        }
    }
}

private function checkIntersect(player:MovieClip, objTwo:MovieClip):int
{
    if(player.hitTestObject(objTwo)){
        return -1;
    }
    else{
        return 2;
    }
}
公共函数checkCollision(ListofObject:Vector.):void
{   
OuterLoop:for(变量i:int=0;i

这也可以通过更好的方式来实现。但这是解决您问题的最快方法。

如果您击中目标,您必须断开循环,这样它就不会进行进一步检查,也不会重置玩家速度。谢谢!!你的例子对我来说不太管用。玩家是checkIntersect的私有财产,在checkCollision中不存在,尽管它可以改成objOne,但即使如此,我测试了它,我的侏儒一点也没有倒下。然而!多亏了您的逻辑,我只是用一种不同的方式实现了它,其中checkIntersect返回一个布尔值,如果没有命中则返回false,如果命中则返回true。然后在checkCollision中,我创建一个名为hit的布尔变量,然后将checkIntersect返回赋值给它,并创建一个类似的if条件,如果为TRUE,我只返回函数。到目前为止似乎还有效!!另外,如果你有时间,我真的很想知道如何以更好的方式完成。