Pregunta

Estoy desarrollando una versión para iPhone de este juego. http://www.students.uni-mainz.de/rathb000/ Fillit / Game.html

Estoy usando un NSTimer para cambiar la posición de la nave en 1 píxel y el intervalo de tiempo para el temporizador es 0.002.

Sin embargo, he notado que la nave no se mueve más rápido si reduzco el intervalo de tiempo más adelante. De hecho, no hay diferencia entre 0.05 y 0.002. ¿Existe una restricción en el tiempo mínimo que tiene que dar como NSTimeInterval?

El barco actualmente se mueve demasiado lento para que el juego sea emocionante.

Además, el movimiento de las aves (que también es logrado por NSTimer) se vuelve lento cuando presiono cualquier botón para mover la nave.

¿Alguna idea de cómo se puede resolver esto?

¿Fue útil?

Solución 6

Descubrí esto.

Tuve que usar Core Animation para mover el barco e hizo que los pájaros se movieran por NSTimer. Funciona bien de esta manera, pero solo hasta cierto límite. Las aves vuelven a disminuir cuando la velocidad del barco aumenta más de un cierto límite.

Otros consejos

NSTimer no es un mecanismo en tiempo real; se dispara como parte del ciclo de ejecución y no es ideal para crear animaciones fluidas y fluidas. Sin embargo, hay un SDK que forma parte del sistema operativo iPhone llamado Core Animation: proporciona una biblioteca de funciones para realizar animaciones suaves de capas y vistas. Aquí hay una serie razonablemente buena de video tutoriales que pueden resultarle útiles. También hay un excelente libro llamado Core Animation para Mac OS X y iPhone puede resultarle útil.

También existe documentación de animación principal de Apple que describe cómo usar la clase CABasicAnimation para animar las propiedades de cualquier capa o vista. Aquí hay un ejemplo de una animación de capa explícita de los documentos:

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 NSTimer documentos:

  

Un temporizador no es un mecanismo en tiempo real; se dispara solo cuando uno de los modos de ciclo de ejecución al que se ha agregado el temporizador se está ejecutando y puede verificar si ha pasado el tiempo de activación del temporizador. Debido a las diversas fuentes de entrada que maneja un ciclo de ejecución típico, la resolución efectiva del intervalo de tiempo para un temporizador se limita al orden de 50-100 milisegundos. Si el tiempo de activación de un temporizador ocurre mientras el ciclo de ejecución está en un modo que no está monitoreando el temporizador o durante una llamada larga, el temporizador no se dispara hasta la próxima vez que el ciclo de ejecución verifique el temporizador. Por lo tanto, el tiempo real en el que se dispara el temporizador puede ser un período de tiempo significativo después del tiempo de disparo programado.

Quizás pueda intentar mover las UIView utilizando las animaciones UIView en lugar de un temporizador.

Podría considerar aumentar el tamaño de la distancia: mueva la nave 3 o 4 píxeles cada 0,05 segundos en lugar de 1 píxel cada 0,002 segundos.

En mi opinión, deberías usar el mismo paso de tiempo globalmente en todas las entidades de tu juego, no un paso de tiempo exclusivo para la nave del jugador. Si el barco se mueve demasiado lento con su paso de tiempo, aumente la cantidad de distancia que se mueve por cuadro.

Realmente, deberías pensar en mover la nave de tu jugador en términos de píxeles / segundo. Cuando se active el evento NSTimer, obtenga el tiempo transcurrido desde la última actualización. Use este tiempo transcurrido para mover sus entidades de juego. Por ejemplo, si su paso de tiempo de actualización es 0.05 segundos y desea mover el barco del jugador 100 píxeles por segundo, entonces debe moverlo 100 * 0.05 = 5 píxeles en esta actualización. Este método tendrá en cuenta los pasos de tiempo de diferentes tamaños y sus entidades de juego siempre parecerán moverse a una velocidad constante, incluso si su mecanismo de temporizador no es tan consistente.

No solo NSTimer no es la herramienta adecuada para este tipo de animación, su diseño es incorrecto.

Un temporizador con un intervalo de 0002 dispara 500 veces por segundo. Esa es una forma loca de animar este juego.

Te sugiero que leas sobre el diseño de juegos en 2D y descubras una mejor manera de hacer una detección de colisión, como anónimo sugiere que debes tener un rectángulo de colisión alrededor de la nave en lugar de depender de los píxeles reales.

También debe consultar Cocos -2D para iPhone

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top