2009-10-17 2 views
1

Écriture d'une application de jeu iPhone à 4 joueurs avec un mélange programmable de lecteurs humains/auto-ordinateurs. Après chaque tour de joueur, la "vue du jeu" devrait être mise à jour. J'ai utilisé "setNeedsDisplay" pour mettre à jour cette vue. Cependant, cette vue ne se met à jour que lorsque mon code de "traitement de virage" est "terminé" ET il attend le contact d'un joueur humain pour déclencher à nouveau ce code.Mise à jour de l'affichage de l'iPhone sans saisie de l'utilisateur

Pour les lecteurs AutoComputer, l'affichage ne se met à jour que lorsqu'il attend à nouveau le tour du joueur suivant. Par conséquent, pour un jeu entièrement automatique, l'ensemble du jeu est joué en premier (l'application se termine) avant que le setNeedsDisplay ne dessine une fois - montrant les positions finales de la vue du jeu.

Y a-t-il un bon moyen pour que les tours des lecteurs de l'auto-ordinateur mettent à jour la vue une fois par tour à un débit tel que les joueurs peuvent voir (par exemple une fois par seconde)?

Merci à l'avance,

Steve

Répondre

1

En général, il serait préférable d'exécuter votre code de jeu sur un thread séparé et laisser les mises à jour d'affichage ont lieu sur la fil principal.

Dans une pincée, cependant, vous pouvez le faire mettre à jour l'affichage immédiatement après l'appel setNeedsDisplay:

[[NSRunLoop currentRunLoop] acceptInputForMode: NSDefaultRunLoopMode beforeDate: nil];

Vous devez être un peu prudent car d'autres messages en attente peuvent également être déclenchés par l'appel. (Sur un Mac, les messages d'objets distribués se déclencheront par exemple)

+0

Merci beaucoup! Cela a fonctionné parfaitement. Je vais aussi m'intéresser à la mise en œuvre du multi-threading. Je suis juste un type d'algorithme après tout :-) –

-3

que diriez-vous

[myView.layer display]; 
+0

En général, vous ne devriez jamais appeler 'display' directement, mais plutôt' setNeedsDisplay' (pour planifier le dessin par le système d'exploitation). –