用户握持触摸时移动对象

时间:2014-05-12 23:36:11

标签: ios objective-c 2d-games

我想创建一个简单的应用程序(道路战斗机的实际克隆http://youtu.be/CDMcY3wLd1Q),其中:矩形UIView(汽车)向左移动,如果用户按屏幕左侧,如果用户按下右侧则向右移动。

我已经想出如何识别触摸(两种方式:使用“UILongPressGestureRecognizer”和“touchesBegan:”功能),但我不明白如何创建动画。

伪代码看起来应该是这样(或者我错了):

if user touch
    if touch.coordinate.x>160 then
        while holding
            UIView.coordinate.x += 0.01;
    if touch.coordinate.x<160 then
        while holding
            UIView.coordinate.x -= 0.01;

2 个答案:

答案 0 :(得分:1)

还有一个名为-(void)touchesEnded的功能,所以当touchbegan时,你会继续将汽车向一个方向移动,并在调用touchesended时停止移动。 简单的解决方案是使用像bool carismovingleft这样的标志来调用touchbegin中的循环移动函数:

- (void)touchesBegan... {
    //mark the flag
    self.carismovingleft = true;
    //start moving the car  
    [self movingcar];
}

- (void)movingcar {
    if (self.carismovingleft) {
        //move the car subview to left a little bit
        .......
        //now we keep moving a little bit till someone  stop it
        //call moving again after a delay 
        //otherwise the car will move all the way in one frame
        [self performSelector: @selector(movingcar) withObject:nil afterDelay:1];
    }
}

- (void)touchesEnded... {
    //stop flag
    self.carismovingleft = false;
}

它只是一个如何实现它的基本概念,你需要自己编码。

答案 1 :(得分:1)

所以你希望你的对象在用户触摸并按住按钮时开始移动,并继续移动直到用户放开?

长按手势识别器会在您发出单次按键事件之前给您一个延迟。那不会起作用。

您需要实现touchesBegan / touchesEnded。 @ highwing方法的一些变体应该有用。您需要微调延迟间隔和每个间隔移动汽车的数量。

由于你想要左右移动,我可能会使用枚举来指定移动方向,然后在movingCar方法中使用switch语句来处理从一个方向移动的所有方向。

在此处高端领导之后,代码可能如下所示:

typedef enum 
{
  notMoving,
  movingLeft,
  movingRight
} movementDirections;

movementDirections currentDirection;

- (void)touchesBegan... 
{
  //mark the flag
  if (touchPoint.x > 160) 
  {
    currentDirection = movingRight;
  }
  else if (touchPoint.x < 160) 
  {
    currentDirection = movingLeft;
  }
  //start moving the car  
  [self movingCar];
}

- (void)movingCar 
{
  switch self.currentDirection 
  {
    case movingLeft:
      //move the car subview to left a little bit
      .......
      //now we keep moving a little bit till someone stop it
      //call moving again after a delay 
      //otherwise the car will move all the way in one frame
      [self performSelector: @selector(movingCar) withObject:nil afterDelay:.1];
      break;
    case movingRight:
      //move the car subview to right a little bit
      .......
      //now we keep moving a little bit till someone stop it
      //call moving again after a delay 
      //otherwise the car will move all the way in one frame
      [self performSelector: @selector(movingCar) withObject:nil afterDelay:.1];
      break;
    default:
      break;  //Do nothing (we're not moving.)
  }
}

- (void)touchesEnded... 
{
  //stop flag
  self.currentDirection = notMoving;
}

编辑:我是Allman style缩进(链接)的支持者。这是K&amp; R风格缩进的有效替代品,我鄙视。 @evlogii,请不要更改我的代码以使用K&amp; R样式。这是个人品味的问题。我不会将您的代码从K&amp; R风格转换为Allman风格,所以您不能将我的代码转换为K&amp; R风格,好吗?