2016-03-08 4 views
1

Я делаю простую игру для двух игроков на Ipad, точно так же, как пинг-понг, когда один из пальцев на экране игрок может реагировать со своим веслом, но когда второй палец на его весло, он не может двигаться весло, но двигаться первый веслом вместо этого, я создал некоторые NSLog, и он говорит, что оба из них движется, но это не так, вот пример моего кода:Различные касания, которые не реагируют друг на друга. C

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { 
/* Called when a touch begins */ 
    for (UITouch *touch in touches) { 
//First player 
CGPoint touchLocation = [touch locationInNode:self]; 
SKPhysicsBody* body = [self.physicsWorld bodyAtPoint:touchLocation]; 

if (body && [body.node.name isEqualToString: paddleCategoryName]) { 
    NSLog(@"Began touch on first paddle"); 
    self.isFingerOnPaddle = YES; 
} 
//Second player 
CGPoint secondTouchLocation = [touch locationInNode:self]; 
SKPhysicsBody* secondbody = [self.physicsWorld bodyAtPoint:secondTouchLocation]; 
if (secondbody && [secondbody.node.name isEqualToString: secondPaddleCategoryName]) { 
    NSLog(@"Began touch on second paddle"); 
    self.isSecondFingerOnPaddle = YES; 
} 
    } 
} 

-(void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event { 
for (UITouch *touch in touches) { 
    //for first player 
    if (self.isFingerOnPaddle) { 
     CGPoint touchLocation = [touch locationInNode:self]; 
     CGPoint previousLocation = [touch previousLocationInNode:self]; 
     SKSpriteNode* paddle = (SKSpriteNode*)[self childNodeWithName: paddleCategoryName]; 
     int paddleY = paddle.position.y + (touchLocation.y - previousLocation.y); 
     paddleY = MAX(paddleY, paddle.size.height/2); 
     paddleY = MIN(paddleY, self.size.height - paddle.size.height/2); 
     paddle.position = CGPointMake(paddle.position.x, paddleY); 
     NSLog(@"First paddle moving"); 

    } 
    //for second player 
    if (self.isSecondFingerOnPaddle) { 
     CGPoint touchLocation = [touch locationInNode:self]; 
     CGPoint previousLocation = [touch previousLocationInNode:self]; 
     SKSpriteNode* secondPaddle = (SKSpriteNode*)[self childNodeWithName: secondPaddleCategoryName]; 
     int secondPaddleY = secondPaddle.position.y + (touchLocation.y - previousLocation.y); 
     secondPaddleY = MAX(secondPaddleY, secondPaddle.size.height/2); 
     secondPaddleY = MIN(secondPaddleY, self.size.height - secondPaddle.size.height/2); 
     secondPaddle.position = CGPointMake(secondPaddle.position.x, secondPaddleY); 
     NSLog(@"Second paddle moving"); 
    } 
} 
} 
-(void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event { 
self.isFingerOnPaddle = NO; 
self.isSecondFingerOnPaddle = NO; 
} 

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

ответ

1

Лучший подход к подклассу подкласса и сделать код касания внутри подкласса paddle. Это устраняет необходимость в цикле с помощью сенсорных массивов, чтобы увидеть, касается ли ваше весло, а также делает код намного опрятным и более легким для чтения. Единственное, что вам нужно, - это настроить свой узел немного по-другому, потому что касание не будет работать за пределами весла.

Вот как вы стиль это

1) Подкласс Paddle для SKNode
2) Создание ребенка SKSpriteNode для фактического лопастной GFX
3) Paddle рама должна быть установлена ​​на ширине вашего сцены, с высотой, которая разрешена для игрока касаться (вероятно, высота весла gfx)
4) переопределить сенсорный код внутри Paddle, весь код касания в наборе должен касаться только того, что касается тростника
5) Выполняйте всю свою логику скольжения внутри этих переопределений

Теперь у вас есть Paddle для поведения, которое вы ищете, вы можете добавить его в сцену, где захотите.

Приятная часть этого метода заключается в том, что вы удаляете много дублирующегося кода (поскольку весла с обеих сторон ведут себя по-разному), и если вы хотите добавить немного удовольствия, вы можете добавить еще больше весла в обе стороны, чтобы обеспечить больше изменение. (У каждого игрока есть весло в середине игрового поля, а нижнее, которое можно перемещать независимо)

+0

Спасибо за ваше предложение, я определенно буду использовать ваше предложение о добавлении весла, это звучит потрясающе. – artG

+0

Ну, главное, написать код, который можно использовать повторно, и избегать дублирования – Knight0fDragon

1

Ваша логика неправильная, просто добавьте свойство touchArray для сохранения первого касания и второго uch, установите его, когда начнется касание, затем определите, когда тронут движется.

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { 
    /* Called when a touch begins */ 
    for (UITouch *touch in touches) { 

     CGPoint touchLocation = [touch locationInNode:self]; 
     SKSpriteNode *node = (SKSpriteNode *)[self nodeAtPoint:touchLocation]; 

     if (node && [node.name isEqualToString: paddleCategoryName]) { 
      NSLog(@"Began touch on first paddle"); 

      [self.touchArray replaceObjectAtIndex:0 withObject:touch]; 

     }else if (node && [node.name isEqualToString: secondPaddleCategoryName]) { 
      NSLog(@"Began touch on second paddle"); 

      [self.touchArray replaceObjectAtIndex:1 withObject:touch]; 

     } 

    } 
} 

-(void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event { 
    for (UITouch *touch in touches) { 
     CGPoint touchLocation = [touch locationInNode:self]; 

     UITouch *firstTouch = self.touchArray[0]; 
     UITouch *secondTouch = self.touchArray[1]; 

     SKSpriteNode *paddle = [[SKSpriteNode alloc] init]; 

     if (touch == firstTouch) { 
      CGPoint previousLocation = [touch previousLocationInNode:self]; 
      SKSpriteNode* paddle = (SKSpriteNode*)[self childNodeWithName: paddleCategoryName]; 
      int paddleY = paddle.position.y + (touchLocation.y - previousLocation.y); 
      paddleY = MAX(paddleY, paddle.size.height/2); 
      paddleY = MIN(paddleY, self.size.height - paddle.size.height/2); 
      paddle.position = CGPointMake(paddle.position.x, paddleY); 
      NSLog(@"First paddle moving"); 

     }else if (touch == secondTouch) { 
      CGPoint touchLocation = [touch locationInNode:self]; 
      CGPoint previousLocation = [touch previousLocationInNode:self]; 
      SKSpriteNode* secondPaddle = (SKSpriteNode*)[self childNodeWithName: secondPaddleCategoryName]; 
      int secondPaddleY = secondPaddle.position.y + (touchLocation.y - previousLocation.y); 
      secondPaddleY = MAX(secondPaddleY, secondPaddle.size.height/2); 
      secondPaddleY = MIN(secondPaddleY, self.size.height - secondPaddle.size.height/2); 
      secondPaddle.position = CGPointMake(secondPaddle.position.x, secondPaddleY); 
      NSLog(@"Second paddle moving"); 
     } 


    } 
} 
-(void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event { 
    for (UITouch *touch in touches) { 
     if (touch == self.touchArray[0]) { 
      [self.touchArray replaceObjectAtIndex:0 withObject:@""]; 
     }else if (touch == self.touchArray[1]) { 
      [self.touchArray replaceObjectAtIndex:1 withObject:@""]; 

     } 
    } 

    self.isFingerOnPaddle = NO; 
    self.isSecondFingerOnPaddle = NO; 
} 
+0

Извините, я не понимаю, как настроить массив, вы можете мне показать? – artG

+0

self.touchArray = [NSMutableArray arrayWithObjects: @ "", @ "", nil]; – ibirdbluer

+0

Ввод строки в массив касаний (и кастинг, т. Е. Лежащий) позже в касания - это острая идея. – Eiko

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