Pergunta

Estou desenvolvendo uma versão do iPhone deste jogo. http://www.students.uni-mainz.de/rathb000/ fillit / Game.html

Eu estou usando um NSTimer para alterar a posição do navio por 1 pixel e o intervalo de tempo para o temporizador é 0,002.

No entanto, tenho notado que o movimento navio does not mais rápido se eu reduzir o furthur intervalo de tempo. De facto, não existe qualquer diferença entre 0,05 e 0,002. É que há uma restrição sobre o tempo mínimo que você tem que dar como NSTimeInterval?

O navio atualmente se move muito lento para que o jogo seja emocionante.

Além disso, o movimento de aves (que também é conseguido através NSTimer) torna-se lento quando eu pressionar qualquer botão para mover o navio.

Qualquer ideia sobre como isso pode ser resolvido?

Foi útil?

Solução 6

descobriram isso.

teve que usar Core Animation para mover o navio e fez os pássaros se mover por NSTimer. Funciona bem desta maneira, mas apenas até um certo limite. Aves novamente abrandar quando a velocidade do navio aumenta mais do que um certo limite.

Outras dicas

NSTimer não é um mecanismo em tempo real; ele dispara como parte do circuito de corrida e não é ideal para a criação de liso, animações de fluido. No entanto, há um SDK que faz parte do sistema operacional do iPhone chamado Core Animation - ele fornece uma biblioteca de funções para executar suave animação de camadas e pontos de vista. Aqui é um razoavelmente boa série de vídeo tutoriais que você pode achar útil. Há também um excelente livro chamado Core Animation para Mac OS X e iPhone que você pode achar útil.

Há também o documentação animação núcleo da Apple que descreve como usar a classe CABasicAnimation às propriedades animados de qualquer camada ou vista. Aqui está um exemplo de uma animação camada explícita dos docs:

CABasicAnimation *theAnimation; 

theAnimation=[CABasicAnimation animationWithKeyPath:@"opacity"];
theAnimation.duration=3.0;
theAnimation.repeatCount=1;
theAnimation.autoreverses=NO;
theAnimation.fromValue=CATransform3DTranslate(0,0,0);
theAnimation.toValue=CATransform3DTranslate(20,20,0);

[theLayer addAnimation:theAnimation forKey:@"animateTransform"];

De docs NSTimer:

Um temporizador não é um mecanismo em tempo real; ele é acionado somente quando um dos modos de loop de execução à qual foi adicionado o temporizador está em execução e capaz de verificar se o tempo de disparo do temporizador já passou. Por causa das várias fontes de entrada de um circuito de corrida típica administra, a resolução efetiva do intervalo de tempo para um temporizador é limitado a na ordem de 50-100 milissegundos. Se ocorrer tempo de disparo de um temporizador enquanto o loop corrida é em um modo que não está monitorando o temporizador ou durante um longo texto explicativo, o temporizador não dispara até a próxima vez as verificações de loop de execução do timer. Portanto, o tempo real em que os fogos temporizador potencialmente pode ser um período significativo de tempo após o tempo de disparo programado.

Talvez você pode tentar mover o UIView usando animações UIView em vez de um timer.

Você poderia considerar aumentar o tamanho distância:. Mover o navio 3 ou 4 pixels a cada 0,5 segundos, em vez de 1 pixel a cada .002 segundos

Na minha opinião, você deve estar usando o mesmo timestep globalmente em todas as entidades em seu jogo, não um instante temporal exclusivamente para a nave do jogador. Se o navio está se movendo muito lentamente com seu timestep, aumentar a quantidade de distância que ele está se movendo por quadro.

Realmente, você deve estar pensando em mudar o navio de seu jogador em termos de pixels / segundo. Quando o evento é acionado NSTimer, obter o tempo decorrido desde a última atualização. Use esse tempo decorrido para mover suas entidades do jogo. Por exemplo, se a sua actualização timestep é de 0,05 segundos e você deseja mover o jogador navio 100 pixels por segundo, então você deve movê-lo 100 * 0,05 = 5 pixels nesta atualização. Este método será responsável por variando Timesteps size e suas entidades do jogo será sempre parecem se mover a uma velocidade constante, mesmo se o seu mecanismo temporizador que não é consistente.

Não é só NSTimer não a ferramenta certa para este tipo de animação seu projeto está errado.

Um cronômetro com um inteval de 0002 fogos 500 vezes por segundo. Isso é uma maneira louca para animar este jogo.

Eu sugiro que você ler sobre design de jogos 2D e descobrir a melhor maneira de fazer a detecção de colisão -. Como anónimo sugere que você deve ter um retângulo de colisão rodada do navio em vez de confiar nos pixels reais

Você também deve verificar se Cocos -2D para iPhone

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top