Atrasando num loop de jogo e removendo sprites naturalmente
-
06-07-2019 - |
Pergunta
Eu estou fazendo um jogo com cocos2d e eu tenho um monte de sprites que eu gostaria de apagar. Por exemplo, eu poderia ter um monte de personagens na tela, mas quando meu jogo acabou eu gostaria de limpá-los. Agora eu criei um efeito especial (sistema de partículas) como uma distração, mas porque é transparente e não cobre toda a tela, você pode ver através e observar os sprites desaparecer como eu removê-los da camada.
Também porque as instruções executar tão rápido ao usuário, ele aparece como se os sprites desaparecer antes que o efeito das partículas começa!
Todas as sugestões sobre os meus 2 problemas? Obrigado.
NSMutableArray *toRemove = [[NSMutableArray alloc] init]; // array of sprites that I collect to remove
spriteCount = 0;
if([self findAllSprites:parent forRemoval:toRemove] > 0){ // is there is at least one sprite to delete. If not then don't do anything
[self specialEffect]; // runs for maybe 3 seconds.
// how can I stall here so that the sprites aren't removed "instantaneously"?
for (Character* aCharacter in toRemove) {
[aCharacter.parent remove:aCharacter];
}
}
Solução
Você pode atrasar a ação de remoção usando performSelector: withObject: afterDelay :. Por exemplo:
NSMutableArray *toRemove = [[NSMutableArray alloc] init]; // array of sprites that I collect to remove
spriteCount = 0;
if([self findAllSprites:parent forRemoval:toRemove] > 0){ // is there is at least one sprite to delete. If not then don't do anything
[self specialEffect]; // runs for maybe 3 seconds.
[self performSelector:@selector(removeSprites:) withObject: toRemove afterDelay:1.0];
}
[toRemove release];
- (void) removeSprites: (NSArray*) toRemove
{
for (Character* aCharacter in toRemove) {
[aCharacter.parent remove:aCharacter];
}
}
Note que performSelector: withObject: afterDelay: vai manter o objeto toremove e mantê-lo vivo até depois que ele chama removeSprites, assim você não precisa fazer nada especial com toremove (exceto que você ainda precisa liberá-lo como mostrado desde que ele próprio também).
Outras dicas
Você precisa fazer o seu 'efeito especial' em um segmento, para que seja executada ao lado seu sprite remove. Lookup NSThread para mais informações, mas isso vai permitir que você sincronize os dois processos.