2009-04-21 4 views
2

J'ai une simple application OpenGL: ES en cours d'exécution (c'est un jeu). Le jeu charge et présente à l'utilisateur un "nouveau bouton de jeu" et vous êtes dans le jeu. J'utilise touchesBegan/touchEnded pour gérer les touches. Ensuite, je prends les coordonnées et les traite en conséquence.touchesEnded

J'ai également un NSTimer tournant à 30Hz qui appelle renderScene qui dessine les graphiques à l'écran.

De temps en temps sur l'appareil (je ne l'ai pas encore fait sur le simulateur), je ne reçois plus d'événements tactiles après le premier. J'ai essayé de déboguer ceci sur l'appareil et il apparaît qu'après avoir reçu le premier événement touchSnded, l'appareil est bombardé par des appels touchEnded. Je ne reçois JAMAIS un autre contactBegan appelle quand cela arrive. Si j'appuie sur la maison et que je reviens dans le jeu, tout ira généralement bien.

Voici le code pour mon entrée, tel qu'il existe dans mon code EAGLView.m

#pragma mark  
#pragma mark UserInputStuff 
#pragma mark  

#pragma mark 
#pragma mark touchesBegan 
#pragma mark  

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
firstTouch = [touch locationInView:self]; 
lastTouch = [touch locationInView:self]; 
[(MyGameAppDelegate*)[[UIApplication sharedApplication] delegate] HandleTouchEvent:firstTouch]; 

} 

#pragma mark  
#pragma mark touchesEnded 
#pragma mark  

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent*)event 
{ 
UITouch *touch = [touches anyObject]; 
lastTouch = [touch locationInView:self]; 
[(MyGameAppDelegate*)[[UIApplication sharedApplication] delegate] HandleTouchEnded:lastTouch]; 
} 

Et voici le code tel qu'il existe dans mon délégué app

#pragma mark 
#pragma mark HandleTouchEnded 
#pragma mark A function to react to the touch that is no longer present on the screen 
#pragma mark 

- (void)HandleTouchEnded:(CGPoint)coordinate 
{ 
if(_state == kState_Title) 
{ 
    [self TitleCollisionDetection:coordinate]; 
    if(_buttonHighlighted) 
    { 
     _textures[kTexture_Background] = [[Texture2D alloc] initWithImage:[UIImage imageNamed:@"T4Background.png"]]; 
     glBindTexture(GL_TEXTURE_2D, [_textures[kTexture_Background] name]); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);   
     [self resetGame]; 
    } 
} 
} 

Et voici le code qui configure le minuteur qui se déclenche pour gérer le rendu.

//Start rendering timer 
_timer = [NSTimer scheduledTimerWithTimeInterval:(1.0/kRenderingFPS) target:self selector:@selector(renderScene) userInfo:nil repeats:YES]; 
[UIApplication sharedApplication].idleTimerDisabled = YES; 

Je fais évidemment quelque chose de stupide. Qu'est-ce que je rate? Pourquoi touche-t-on le feu si souvent?

Répondre

3

En fait, il est avéré qu'il y avait un deuxième appel errant pour démarrer le NSTimer

_timer = [NSTimer scheduledTimerWithTimeInterval: (1,0/kRenderingFPS) cible: self sélecteur: @selector (renderScene) userInfo: néant répétitions: OUI ] Cela a provoqué l'arrêt de l'exécution du programme pour la durée d'exécution de la ligne principale, car il était en permanence en charge des routines de minuterie.

L'ANALYSEUR DE PERFORMANCE EST VOTRE AMI !!! Je l'ai trouvé parce que même si je pensais que mon application était censée tourner à 30 images par seconde, je voyais des résultats au nord de 50 images par seconde. Au début, je pensais que l'analyseur de performance était cassé. En fin de compte, c'était mon code.

0

[(MyGameAppDelegate *) [[UIApplication sharedApplication] délégué] HandleTouchEnded: FirstTouch];

est exactement le même que

[(MyGameAppDelegate *) [[UIApplication sharedApplication] délégué] HandleTouchEnded: lastTouch];

Vous n'êtes pas bombardé par TouchsEnded. Vous êtes bombardé par le fait que votre FirstTouch et vos objets LastTouch sont le même objet!

Vous devez mettre les fonctions NSLog dans touchesBegan: et touchesEnded: la prochaine fois pour confirmer le comportement.

+0

Je pense que vous avez manqué quelque chose ici.L'appel firstTouch est [(MyGameAppDelegate *) [[délégué UIApplication sharedApplication]] HandleTouchEvent: firstTouch]; et la seconde est [(MyGameAppDelegate *) [[UIApplication sharedApplication] delegate] HandleTouchEnded: lastTouch]; – K2Digital

Questions connexes