Когда у пользователя есть два пальца на экране и поднимает один, я хочу, чтобы ничего не случилось - PullRequest
0 голосов
/ 04 октября 2010

достаточно, достаточно.

, как говорится в названии, я немного рассола.

, так вот в общих чертах моя проблема.У меня есть этот корабль правильно.Он лежит в центре нижней части экрана (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;
}

Я пытаюсь полностью скопировать элементы управления для игры "Радиант", если это поможет.Я буду серьезно любить тебя всегда, если ты поможешь.

Просто чтобы прояснить, я хочу, чтобы это произошло:

  1. пользователь касается правой стороны экрана
  2. ход кораблявправо
  3. пользователь касается левой стороны экрана вторым пальцем
  4. , пока корабль все еще движется вправо, поскольку пользователь не снял свое первое касание, затем пользователь поднимает первое касание
  5. ТОГДА корабль мгновенно меняет курс, чтобы двигаться влево ко второму касанию.

. Сейчас у меня включено мультитач, так что теперь он работает так:

  1. пользователькасается правой стороны экрана
  2. корабль движется вправо
  3. пользователь касается левой стороны экрана вторым пальцем
  4. корабль движется влево, затем пользователь поднимает первое касание
  5. Корабль остановлен на своем пути, хотя пользователь не поднял второе касание

Ответы [ 3 ]

0 голосов
/ 04 октября 2010

Прежде всего, о том, чтобы не активировать leftTimer, если rightTouch не отпущен.

Вы можете установить два глобальных касания.Итак, если позиция [touch locationInView: self.view] бла> 250 globalRightTouch = touch.То же самое для левого.

Затем, когда вы нажмете правую сторону - вы назначите касание глобальному правому, и корабль начнет двигаться вправо - тогда вы одновременно дотронетесь до левой стороны - так что началось другое касаниезапускается - поэтому вы назначаете его для globalLeftTouch.Затем вы можете сделать что-то вроде: if (! GlobalRightTouch) {start leftTimer) и наоборот.

В вашей функции touhcesEnded - вы указываете leftTimer уничтожить, если он не равен нулю при касаниях, - так что даже еслиу вас все еще левый касание - вы говорите обоим таймерам убивать при любом касании.Вам просто нужно быть немного более конкретным с окончанием касаний.

Затем в коде окончаний касаний вам нужно выполнить следующее:

  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
   }
 }
}

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

Надеюсь, это поможет,

Приветствия,

Майкл

0 голосов
/ 05 октября 2010

Вот реальная / псевдокодовая версия - надеюсь, это поможет ...

-(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;
        }
    }
}

ура

Майкл О'Брайен

0 голосов
/ 04 октября 2010

Каждый UITouch уникален с момента, когда пользователь начинает касаться, пока он не остановится. Итак, ваша проблема на самом деле в этой строке:

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

Вы не хотите просто любое прикосновение. Вы хотите прикосновение, которое является тем же, к которому вы двигались, если оно существует. Ищите это касание в наборе, и если его там нет, начните двигаться к другому касанию.

...