2013-08-08 1 views
1

У меня возникли проблемы с алгоритмом для контроллера плеера, который я пишу. Я использую Cocos2D для создания игры в стиле платформера (думаю, Super Mario Bros.). Мой контроллер имеет левую и правую кнопку, и вы касаетесь правой половины экрана, чтобы прыгать.Cocos2D: алгоритм алгоритма контроллера игрока при прыжках

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

Другая проблема заключается в том, что пользователь держит экран, чтобы прыгать, нажимает направленную кнопку, затем позволяет перейти от направленного движения, продолжая удерживать экран, и игрок продолжит движение в этом направлении. Половина времени, когда игрок останавливается при выпуске экрана, другая половина проигрывателя продолжит выпуск до тех пор, пока экран не будет снова задействован.

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

- (void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    for (UITouch* touch in touches) 
    { 
     CGPoint point = [self convertTouchToNodeSpace: touch]; 

     // Create a rect around right half of the window 
     CGSize winSize = [CCDirector sharedDirector].winSize; 
     CGRect jumpBox = CGRectMake(winSize.width/2, 
            0, 
            winSize.width/2, 
            winSize.height); 


     // left button 
     if (CGRectContainsPoint(leftButtonSprite.boundingBox, point)) 
     { 
      self.isPressingLeftButton = YES; 
      self.isPressingRightButton = NO; 
     } 

     // right button 
     else if (CGRectContainsPoint(rightButtonSprite.boundingBox, point)) 
     { 
      self.isPressingRightButton = YES; 
      self.isPressingLeftButton = NO; 
     } 

     // player's trying to jump 
     if (CGRectContainsPoint(jumpBox, point)) 
     { 
      self.isTouchingScreen = YES; 
     } 
    } 
} 

- (void) ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    for (UITouch* touch in touches) 
    { 
     CGPoint point = [self convertTouchToNodeSpace: touch]; 

     // Create a rect around right half of the window 
     CGSize winSize = [CCDirector sharedDirector].winSize; 
     CGRect jumpBox = CGRectMake(winSize.width/2, 
            0, 
            winSize.width/2, 
            winSize.height); 


     // left button 
     if (CGRectContainsPoint(leftButtonSprite.boundingBox, point)) 
     { 
//   CCLOG(@"Pressing left"); 
      self.isPressingLeftButton = YES; 
      self.isPressingRightButton = NO; 
     } 

     // right button 
     else if (CGRectContainsPoint(rightButtonSprite.boundingBox, point)) 
     { 
//   CCLOG(@"Pressing right"); 
      self.isPressingRightButton = YES; 
      self.isPressingLeftButton = NO; 
     } 

     // player's trying to jump 
     if (CGRectContainsPoint(jumpBox, point)) 
     { 
//   CCLOG(@"Jumping"); 
      self.isTouchingScreen = YES; 
     } 

    } 
} 

- (void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if (self.isTouchingScreen) 
    { 
     CCLOG(@"Stop jumping"); 
     self.isTouchingScreen = NO; 
    } 
    else 
    { 
     CCLOG(@"Stop moving"); 
     self.isPressingLeftButton = NO; 
     self.isPressingRightButton = NO; 
    } 
} 

Этот код находится в моем HUDLayer.m, который является ребенком в GameplayLayer.m. GameplayLayer использует update:, чтобы выяснить, какой из флагов от HUDLayer установлен и соответственно перемещает игрока.

ответ

0

Выяснил это. Вид ошибки n00b. В ccTouchesEnded:withEvent:, я должен был convertTouchToNodeSpace и проверить, если она пересекает прямоугольники кнопок направления или прыгать половину экрана, как это сделано в ccTouchesBegan:withEvent:

Надеются, что это поможет кому-нибудь. Счастливое кодирование :)

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