我无法访问已添加到另一个孩子的孩子(它的父母)

时间:2014-04-19 01:06:04

标签: actionscript-3 flash game-engine flash-cs5

我正在尝试访问一个孩子,所以我可以和那个孩子做一些hitTest,但是我得到了这个错误,你可能已经看过一百万次了,而且有足够的时间来理解它意味着什么,不像我(As3的新手)

1119: Access of possibly undefined property ground through a reference with static type flash.display:Sprite.

Saything,这是一些代码。

我在主构造函数中启动所有内容,然后将其添加到舞台

        addChild(_scrollLayer);
        //player
        _scrollLayer.addChild(character);
        //character.reset();
        //character.x = 640;
        character.y = 0;

        //level
        _scrollLayer.addChild(ground);
        ground.x = 640;
        ground.y = 680;


        //greenGoblin
        _scrollLayer.addChild(goblin1);
        goblin1.x = 500;
        goblin1.y = 0;

        _scrollLayer.addChild(goblin2);
        goblin2.x = 800;
        goblin2.y = 0;

        _scrollLayer.addChild(goblin3);
        goblin3.x = 100;
        goblin3.y = 0;

        //red Goblin
        _scrollLayer.addChild(redGoblin1);
        redGoblin1.x = 1100;
        redGoblin1.y = 400;



        while (_scrollLayer.ground.hitTestPoint(getChildAt(c).x, getChildAt(c).y, true))

这是我收到您在上面看到的错误消息。

我也尝试过这样做

        while (ground.hitTestPoint(getChildAt(c).x, getChildAt(c).y, true))

没有错误消息,hitTest如何不起作用,这是因为所有内容都在容器中。

这是完整的测试代码

        for (var c:int = 0; c < childrenOnStage; c++)
        {
            if (getChildAt(c).name == "player")
            {       
                if (ground.hitTestPoint(getChildAt(c).x, getChildAt(c).y, true))
                {
                    touchingGround = true;
                    while (ground.hitTestPoint(getChildAt(c).x, getChildAt(c).y, true))
                    {

                        OnGround(getChildAt(c)).incrementUp();

                        if (ground.hitTestPoint(getChildAt(c).x, getChildAt(c).y, true))
                        {

                        }
                        else
                        {
                            OnGround(getChildAt(c)).keepOnGround();
                        }
                    }
                }
                else
                {
                    touchingGround = false;
                    //trace("not touch");
                    //character.gotoAndStop("jump");
                }
            }

//childrenOnStage is a variable. childrenOnStage = this.numChildren;

我不明白为什么命中测试不起作用。我希望得到答复,建议或提示。

谢谢。

1 个答案:

答案 0 :(得分:2)

我可能会以这种方式对命中测试有点生疏(我比大多数人使用可视IDE更多),但我想我记得这个问题。

如果我没记错,DisplayObject对象的声明与编程对象不同,因为你不能简单地调用它们的名称来访问它们。 AS3认为你在Sprite上调用了一个属性。 (也就是说,如果你是从时间轴开始工作,那就是另一个故事。)

以下代码应该可以使用,但是未经测试。您的代码没有将“地面”视为DisplayObject,因此无法在其上调用“hitTestPoint”。因此,你必须解决这个问题。

var mcGround:MovieClip = MovieClip(_scrollLayer.getChildByName("ground"));
mcGround.hitTestPoint(getChildAt(c).x, getChildAt(c).y, true);

(感谢Amarghosh的回答here - 我用它交叉检查了我的代码。)