Domanda

Sto sviluppando una versione per iPhone di questo gioco. http://www.students.uni-mainz.de/rathb000/ Fillit / Game.html

Sto usando un NSTimer per cambiare la posizione della nave di 1 pixel e l'intervallo di tempo per il timer è 0,002.

Tuttavia, ho notato che la nave non si muove più velocemente se riduco l'intervallo di tempo. Infatti, non c'è alcuna differenza tra 0,05 e 0,002. C'è una limitazione sul tempo minimo che devi dedicare come NSTimeInterval?

La nave attualmente si muove troppo lentamente per rendere il gioco emozionante.

Inoltre, il movimento degli uccelli (che è ottenuto anche da NSTimer) diventa lento quando premo un pulsante qualsiasi per muovere la nave.

Qualche idea su come risolvere questo problema?

È stato utile?

Soluzione 6

Capito questo.

Ho dovuto usare Core Animation per muovere la nave e far muovere gli uccelli da NSTimer. Funziona bene in questo modo ma solo fino a un certo limite. Gli uccelli rallentano nuovamente quando la velocità della nave aumenta oltre un certo limite.

Altri suggerimenti

NSTimer non è un meccanismo in tempo reale; si attiva come parte del ciclo di esecuzione e non è l'ideale per creare animazioni fluide e fluide. Tuttavia, esiste un SDK che fa parte del sistema operativo iPhone chiamato Core Animation: fornisce una libreria di funzioni per eseguire animazioni fluide di livelli e viste. Ecco una serie ragionevolmente buona di video tutorial che potresti trovare utili. Esiste anche un eccellente libro chiamato Core Animation per Mac OS X e iPhone che potresti trovare utile.

Esiste anche documentazione di animazione principale di Apple che descrive come utilizzare la classe CABasicAnimation per animare le proprietà di qualsiasi livello o vista. Ecco un esempio di animazione esplicita del livello dai documenti:

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"];

Da NSTimer documenti:

  

Un timer non è un meccanismo in tempo reale; si attiva solo quando è in esecuzione una delle modalità di esecuzione del loop a cui è stato aggiunto il timer e in grado di verificare se è trascorso il tempo di accensione del timer. A causa delle varie fonti di input gestite da un tipico ciclo di esecuzione, la risoluzione effettiva dell'intervallo di tempo per un timer è limitata all'ordine di 50-100 millisecondi. Se il tempo di attivazione di un timer si verifica mentre il ciclo di esecuzione è in una modalità che non sta monitorando il timer o durante un callout lungo, il timer non si attiva fino alla successiva volta che il ciclo di esecuzione controlla il timer. Pertanto, l'ora effettiva in cui il timer scatta potenzialmente può essere un periodo di tempo significativo dopo l'orario di attivazione programmato.

Forse puoi provare a spostare le UIView usando le animazioni UIView anziché un timer.

Potresti considerare di aumentare le dimensioni della distanza: sposta la nave di 3 o 4 pixel ogni 0,05 secondi anziché 1 pixel ogni 0,002 secondi.

A mio avviso, dovresti usare lo stesso timestep a livello globale su tutte le entità del gioco, non un timestep esclusivamente per la nave del giocatore. Se la nave si muove troppo lentamente con il tuo timestep, aumenta la distanza che si sta muovendo per frame.

Davvero, dovresti pensare di muovere la nave del tuo giocatore in termini di pixel / secondo. Quando viene generato l'evento NSTimer, ottieni il tempo trascorso dall'ultimo aggiornamento. Usa questo tempo trascorso per spostare le tue entità di gioco. Ad esempio, se il timestep di aggiornamento è 0,05 secondi e si desidera spostare la nave del giocatore di 100 pixel al secondo, è necessario spostarlo di 100 * 0,05 = 5 pixel in questo aggiornamento. Questo metodo terrà conto di timestep di varie dimensioni e le tue entità di gioco sembreranno sempre muoversi a una velocità costante, anche se il meccanismo del tuo timer non è così coerente.

Non solo NSTimer non è lo strumento giusto per questo tipo di animazione il tuo design è sbagliato.

Un timer con un numero intero di 0002 si attiva 500 volte al secondo. È un modo folle per animare questo gioco.

Ti suggerisco di leggere il design del gioco 2D e scoprire un modo migliore per eseguire il rilevamento delle collisioni - come l'anonimo suggerisce che dovresti avere un rettangolo di collisione attorno alla nave piuttosto che fare affidamento sui pixel reali.

Dovresti anche dare un'occhiata a Cocos -2D per iPhone

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top