无法将孩子附加到场景

时间:2013-03-19 17:53:55

标签: android andengine

我正在尝试将Text对象附加到标题处理玩家死亡事件 http://www.matim-dev.com/full-game-tutorial---part-13.html

标题下的场景中

我有一个AnimatedSprite,它扩展了Player类。我创建了一个播放器,

mPlayer = new Player(x, y, resourceManager.getVertexBufferObjectManager(), resourceManager.getCamera(), mPhysicsWorld)
{
    @Override
    public void onDie() {
        if (!gameOverDisplayed)
        {
            displayGameOverText();
        }
    }
};

displayGameOverText()方法为,

private void displayGameOverText()
{
    mCamera.setChaseEntity(null);
    gameOverText.setPosition(mCamera.getCenterX(), mCamera.getCenterY());
    attachChild(gameOverText);
    gameOverDisplayed = true;
}

我还在createScene()方法中初始化了gameOverText,

gameOverText = new Text(0, 0, resourceManager.getFontArial(), "Game Over!", mVBOM);

在此阶段,代码正常运行,并且在调用onDie()时会显示文字 Game Over!

但是当我重新设计下面给出的onDie()方法时,调用onDie()时不会显示文字游戏结束!

@Override
public void onDie() {
    if (!gameOverDisplayed)
    {
        mCamera.setChaseEntity(null);
        gameOverText.setPosition(mCamera.getCenterX(), mCamera.getCenterY());
        attachChild(gameOverText);
        gameOverDisplayed = true;
    }
}

这种行为对我来说很奇怪,因为代码是一样的。唯一的区别是我在后一种onDie()方法中内联了代码。

有人可以帮助我了解导致此行为的原因。 logcat中没有关于此的日志。

1 个答案:

答案 0 :(得分:1)

在第一个版本中,您可以在displayGameOverText()类中调用Player方法。但我想方法displayGameOverText()位于Player类之外的某个地方。这就是为什么第二个版本不起作用的原因,因为行attachChild(gameOverText);实际上将gameOverText附加到Player而不是Scene

Player似乎扩展了Sprite类,因此您可以将所需内容附加到播放器上。每个Entity(精灵,文本,矩形......)都可以附加到另一个EntityScene(场景也是一个实体)。但它并不总是具有相同的效果(甚至可能根本不可见)!所以我想这就是第二版中发生的事情。文本附加到播放器,但播放器未附加到场景,或文本不在屏幕上。

当您向实体附加某些内容(例如您的文本到播放器)时,该内容的位置始终与其父实体相关。因此,如果Player位于场景附近的位置(100,100)并且文本附加在位置(50,50)给玩家 - 则文本实际上位于场景中的位置(150,150)。 / p>

长话短说,行attachChild(gameOverText);需要从场景内调用,而不是从播放器内调用。

希望这有帮助!