我正在开发一款将 ipad 屏幕分为下半部分和上半部分的小游戏。每个玩家都有自己的部分可以玩(一个手指游戏)。我必须在视图上启用多点触控,因为当两个玩家同时点击屏幕时,只有一个玩家的方法会被执行或根本不执行。
然而,当 2 个玩家执行完全相同的动作时,这会导致方法触发两次的奇怪行为。这就是它现在的工作方式:它检查玩家是否触摸了视图中的对象。如果有,就会触发一个方法。如果玩家没有触摸对象而是视图本身,则会触发另一个方法。它检查视图是否在上半部分或下半部分被触摸,以区分玩家一或玩家二的触摸。
我一直在考虑一个解决方案,但我不确定什么是解决这个问题的好方法。也许我应该为每个玩家分开视图(透明),以便我可以更轻松地区分触摸?这是我的 touchesBegan 方法。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSMutableSet *touchedCirclesPlayerOne = [NSMutableSet set];
NSMutableSet *touchedCirclesPlayerTwo = [NSMutableSet set];
for (UITouch *touch in touches) {
CGPoint touchLocation = [touch locationInView:self.view];
for (Circle *circle in playerOneCircles) {
if ([circle.layer.presentationLayer hitTest:touchLocation]) {
[touchedCirclesPlayerOne addObject:circle];
}
}
for (UITouch *touch in touches) {
CGPoint touchLocation = [touch locationInView:self.view];
for (Circle *circle in playerTwoCircles) {
if ([circle.layer.presentationLayer hitTest:touchLocation]) {
[touchedCirclesPlayerTwo addObject:circle];
}
}
}
if (touchedCirclesPlayerOne.count) {
NSLog(@"test");
for (Circle *circle in touchedCirclesPlayerOne) {
[circle playerTap:nil];
}
} else if (touchedCirclesPlayerTwo.count) {
NSLog(@"test2");
for (Circle *circle in touchedCirclesPlayerTwo) {
[circle SecondPlayerTap:nil];
}
} else {
for (UITouch *touch in touches) {
CGPoint touchLocation = [touch locationInView:self.view];
if (CGRectContainsPoint(CGRectMake(0, self.view.frame.size.height/2, self.view.frame.size.width, self.view.frame.size.height/2), touchLocation)) {
NSLog(@"wrong player 1");
[[NSNotificationCenter defaultCenter] postNotificationName:@"wrong player 1" object:self];
} else {
NSLog(@"wrong player 2");
[[NSNotificationCenter defaultCenter] postNotificationName:@"wrong player 2" object:self];
}
}
}
}
}
这是一个小示意图。这一切都有效,除非两个玩家做同样的事情。它为每个玩家触发两次相同的动作。