当用户在屏幕上有两个手指并抬起一个手指时,我不希望发生任何事情

时间:2010-10-04 04:42:24

标签: iphone timer multi-touch touchesbegan touches

足够了。

像标题所说的那样,我有点腌渍。

所以这是我的问题的大纲。我有这艘船的权利。它位于屏幕的中央底部(240,0)。当用户在大于240的点向右触摸时,船向右移动。如果用户触摸的点小于240,则离开。但是,当屏幕上一次只有一个手指时,这很好。我需要它到用户触摸的地方,不抬起他们的手指,然后向左触摸(在屏幕上有两个手指),船一直向右移动直到他们抬起右手指,然后突然船向左移动第二次接触。

我正在使用计时器从当前x坐标中添加/减去一个数字以使其移动。

这就是我的简要说法:(不要笑或恨我是菜鸟)

-(void)moveShipLeft:(id)sender {

 shipView.center = CGPointMake(shipView.center.x - 2, 320 - (shipView.image.size.height / 2));

}
-(void)moveShipRight:(id)sender { 

 shipView.center = CGPointMake(shipView.center.x + 2, 320 - (shipView.image.size.height / 2));

}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

 UITouch *touch = [[event allTouches] anyObject];
 CGPoint location = [touch locationInView:touch.view];

 if (240 < location.x){rightTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(moveShipRight:) userInfo:nil repeats:YES];}
 if (240 > location.x){leftTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(moveShipLeft:) userInfo:nil repeats:YES];}

 [shipView setCenter:shipView.center];
 }
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {


  if (rightTimer != nil)               //Kill the timer that goes right upon touch removal
   [rightTimer invalidate];
  rightTimer = nil;

  if (leftTimer != nil)                //Kill the timer that goes left on touch removal
   [leftTimer invalidate];
  leftTimer = nil;
}

如果有任何帮助,我正在尝试完全复制游戏“Radiant”的控件。 如果你帮忙,我会永远爱你。

为了澄清,我希望这种情况发生:

  1. 用户触摸屏幕右侧
  2. 船向右移动
  3. 用户用第二根手指触摸屏幕的左侧
  4. 当船仍然向右移动,因为用户没有抬起他们的第一次触摸,然后用户提起第一次触摸
  5. 然后船舶立即改变路线向左移动第二次触摸
  6. 现在我启用了多点触控,所以现在它的工作原理如下:

    1. 用户触摸屏幕右侧
    2. 船向右移动
    3. 用户用第二根手指触摸屏幕的左侧
    4. 船向左移动然后用户抬起第一次触摸
    5. 即使用户没有提起第二次触摸,
    6. 船也会停在其轨道上

3 个答案:

答案 0 :(得分:0)

每个UITouch从用户开始触摸到停止时都是唯一的。所以你的问题就是这一行:

 UITouch *touch = [[event allTouches] anyObject];

您不希望只是任何触摸。如果存在触摸,您希望触摸的触摸方式与您一直相同。在集合中寻找触摸,如果不是,则开始朝着另一个触摸方向移动。

答案 1 :(得分:0)

首先,如果未释放rightTouch,则表示未激活leftTimer。

您可以设置两个全局触摸。因此,如果[触摸locationInView:self.view]位置blah是&gt; 250 globalRightTouch = touch。左边相同。

当你击中右侧时 - 你将触摸分配给全局右侧,并且船开始向右移动 - 然后你同时触摸左侧 - 所以另一个触摸开始事情开始 - 所以你将它分配给globalLeftTouch。然后你可以这样:if(!globalRightTouch){start leftTimer},反之亦然。

在你的touhcesEnded函数中 - 你告诉leftTimer如果它在触摸结束时不是null就会被杀死 - 所以即使你的左手触摸仍然没有 - 你告诉两个计时器在任何触摸释放时都会被杀死。你需要更加具体一点,结束你的接触。

然后在接触结束的代码中,您需要执行以下操作:

  UITouch *touch = [[event allTouches] anyObject];

  if (rightTimer != nil && touch == globalRightTouch){               //Kill the timer that goes right upon touch removal
   [rightTimer invalidate];
  rightTimer = nil;
   if(globalLeftTouch)
     leftTimerStartFunction //I dont know what your variables are sorry
  }

  if (leftTimer != nil && touch == globalLeftTouch){                //Kill the timer that goes left on touch removal
   [leftTimer invalidate];
  leftTimer = nil;
   if(globalRightTouch){
      rightTimerStartFunction //I dont know what you variables are sorry
   }
 }
}

所以基本上你想说 - 如果我放开触摸 - 检查它是哪一个并杀死该触摸的计时器如果它不为空并且如果当前屏幕上还有另一个触摸 - 启动计时器那边。

希望这有帮助,

干杯,

迈克尔

答案 2 :(得分:0)

这是一个真实/伪代码版本 - 希望它有帮助...

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)even{
UITouch *touch = [touches anyObject];

if(touch.x < 240){
    globalTouchLeft = touch;
    if(!globalTouchRight){
        startLeftTimer; //again I don't know what your timere/variable is
    }
}else if(touch.x  >= 240){

    globalTouchRight = touch;
    if(!globalTouchLeft){
        startRightTimer; //again I don't know what your timere/variable is
    }

    }
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{

    UITouch *touch = [touches anyObject];

    if(touch == globalLeftTouch){
        stopLeftTimer
        globalLeftTouch = nil;

        if(globalRightTouch){
            startRightTimer;
        }

    }

    if(touch == globalTouchRight){
        stopRightTimer
        globalRightTouch = nil;

        if(globalLeftTouch){
            startLeftTimer;
        }
    }
}

欢呼声,

迈克尔奥布莱恩