2009-04-21 3 views
2

У меня есть простое приложение OpenGL: ES, работающее (это игра). Игра загружается и представляет пользователю «новую кнопку игры», а затем вы находитесь в игре. Я использую touchhesBegan/touchesEnded для обработки касаний. Затем я беру координаты и обрабатываю их соответственно.touchesEnded

У меня также есть NSTimer, работающий на 30 Гц, который вызывает renderScene, который рисует экранную графику.

Время от времени на устройстве (я еще не знаю, как это произошло на симуляторе), я не получаю больше сенсорных событий после первого. Я попытался отладить это на устройстве, и кажется, что после того, как я получу первое касание события, входящего в систему, устройство подвергается бомбардировке с помощью touchEnded вызовов. Я НИКОГДА не получаю еще один звонок, когда это происходит. Если я приду домой и вернусь в игру, все будет нормально работать.

Вот код для моего входа, как она существует в моем коде 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]; 
} 

А вот код, как это есть в моем приложении делегат

#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]; 
    } 
} 
} 

И вот код, который настраивает таймер, который запускает обработчик рендеринга.

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

Я, очевидно, делаю что-то немое. Что мне не хватает? Почему прикосновения так часто срабатывают?

ответ

3

В действительности оказалось, что существует странствующих второй вызов, чтобы начать NSTimer

_timer = [NSTimer scheduledTimerWithTimeInterval: (1.0/kRenderingFPS) Цель: селектор самостоятельно: @selector (renderScene) UserInfo: ноль повторов: ДА ];

Это привело к тому, что программа вышла из строя для выполнения основного времени, поскольку она постоянно обслуживала процедуры таймера.

АНАЛИЗАТОР ПРОИЗВОДИТЕЛЬ - ВАШ ДРУГ !!! Я нашел это, потому что, хотя я думал, что мое приложение должно работать со скоростью 30 кадров в секунду, я видел результаты к северу от 50 кадров в секунду. Сначала я подумал, что анализатор производительности был сломан. Как оказалось, это был мой код.

0

[(MyGameAppDelegate *) [[UAppication sharedApplication] delegate] HandleTouchEnded: firstTouch];

точно такой же, как

[(MyGameAppDelegate *) [[UIApplication sharedApplication] делегат] HandleTouchEnded: lastTouch];

Вы не подвергаетесь бомбардировке TouchsEnded. Вы подвергаетесь бомбардировке тем фактом, что ваши firstTouch и ваши объекты lastTouch являются одним и тем же объектом!

Вы должны поместить функции NSLog в вас touchesBegan: и touchesEnded: в следующий раз, чтобы подтвердить свое поведение.

+0

Я думаю, вы что-то пропустили. Первый вызов: [(MyGameAppDelegate *) [[UAppication sharedApplication] delegate] HandleTouchEvent: firstTouch]; , а второй - [(MyGameAppDelegate *) [[UAppication sharedApplication] delegate] HandleTouchEnded: lastTouch]; – K2Digital

Смежные вопросы