我正在尝试将文本对象附加到场景,如标题“处理播放器死事件” 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()时显示。

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

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


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

有人可以帮助我了解造成此问题的原因。在logcat中没有与此相关的日志。

最佳答案

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

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

当您将某物附加到实体(例如将文本附加到播放器)时,该物的位置始终相对于其父实体。因此,如果Player位于场景所在的位置(100,100)处,并且文本位于播放器的位置(50,50)处,则文本实际上位于场景上的位置(150,150)。

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

希望这可以帮助!

关于android - 无法将 child 附加到场景,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15506906/

10-12 01:38