2

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

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

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()调用时显示。

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

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

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

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

4

1 回答 1

1

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

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

当您将某些东西附加到实体(例如将文本附加到播放器)时,该东西的位置总是相对于它的父实体。因此,如果它Player位于附加到场景的位置 (100,100) 处,并且文本附加到位置 (50,50) 到播放器 - 文本实际上位于场景中的位置 (150,150)。

长话短说,这条线attachChild(gameOverText);需要从场景中调用,而不是从玩家内部调用。

希望这可以帮助!

于 2013-03-19T22:11:16.513 回答