AndEngine - Tendo problemas com anexando uma nova Entidade Sprite
-
27-10-2019 - |
Pergunta
Eu venho fazendo tentativa e erro por horas agora e eu ainda não vieram acima com uma solução para algo que parece simples .... Eu estou usando o
public void onConfigurationChanged(Configuration newConfig)
método para detectar se um usuário mudou sua orientação da tela. Eventualmente, ele é enviado a este método onde os entitys estão ligados à cena:
public void BuildScene(final Scene scene){
// Destroys current scene.
scene.detachChildren();
this.SpriteDayPortrait = new Sprite(-200, 0, 2000, 500, this.mParallaxLayerDayPortrait);
this.SpriteDayLandscape = new Sprite(0, 0, 750, 500, this.mParallaxLayerDayLandscape);
if (prefs.getString("frontImage", "1").equals("3"))
{
//Day
if (orientationValue.equals("PORTRAIT"))
{
Log.d("Orientation", "Portrait");
scene.detachChild(SpriteDayLandscape);
scene.attachChild(SpriteDayPortrait);
}
else if (orientationValue.equals("LANDSCAPE"))
{
Log.d("Orientation", "Landscape");
scene.detachChild(SpriteDayPortrait);
scene.attachChild(SpriteDayLandscape);
}
}
}
Este método é chamado para quando o papel de parede é criada pela primeira vez, e também quando um usuário muda a orientação da tela.
Eu testei isso no meu telefone e ele exibe com êxito as mensagens de log quando eu mudar orientações, o que significa que ele está fazendo isso o que eu quero que ele faça.
O Problema -
A criança Sprite não separar quando este método é chamado para. Se eu estiver no modo retrato, e mudar para paisagem, os restos do sprite retrato e eu gostaria que ele desapareça, e vice-versa.
Eu ficaria muito feliz se alguém poderia responder a esta Eu tenho tido uma dor de cabeça sobre isso por provavelmente 20 horas.
Solução
Parece que o problema pode ser lógica:. Você transferir o SpriteDayPortrait e SpriteDayLanscape antes de chamar o ramo sobre destacando-los ou anexá-los
Assim, cada vez que o script detach é chamado ele está se referindo a um new instância do sprite, em vez do antigo instância que você deseja desanexar.
tente mover a atribuição dos sprites em outra função que só é chamado quando a cena é criado:
// Move this
this.SpriteDayPortrait = new Sprite(-200, 0, 2000, 500, this.mParallaxLayerDayPortrait);
this.SpriteDayLandscape = new Sprite(0, 0, 750, 500, this.mParallaxLayerDayLandscape);
Outras dicas
Tenha em mente que desde a mudança de orientação em AndEngine não existe (Você não está autorizado a orientação motor de mudança), você should't fazer o seu jogo estar usando mudanças de orientação (Isso seria estranho para o usuário).
De qualquer forma, onConfigurationChanged
é chamado a partir do segmento interface do usuário, e você não deve manipular objetos de AndEngine mas no UpdateThread. Ele pode causar alguns problemas (No entanto, se fosse, o jogo iria falhar) para alterá-lo.
Eu acho que isso acontece porque você não limpar a sua ParallaxBackground
antes de definir o novo fundo (talvez o fundo velho esconde o novo?)
Manter uma referência a sua última ParallaxEntity
em seguida, removê-lo do fundo antes de adicionar um novo.