Как повторно выполнить действие, когда кнопка постоянно нажата в объекте - PullRequest
0 голосов
/ 24 ноября 2011

У меня есть четыре простых метода, четыре кнопки и один объект.

- (IBAction)left:(id)sender{
    object.center = CGPointMake(object.center.x - 5, object.center.y);
}

- (IBAction)right:(id)sender{
    object.center = CGPointMake(object.center.x + 5, object.center.y);
}
- (IBAction)down:(id)sender{
    object.center = CGPointMake(object.center.x, object.center.y + 5);
}
- (IBAction)up:(id)sender{
    object.center = CGPointMake(object.center.x, object.center.y - 5);
}

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

Ответы [ 3 ]

1 голос
/ 24 ноября 2011

Как сказал @Maudicus, вам, вероятно, нужно что-то сделать с NSTimer s, чтобы получить непрерывное нажатие кнопки.Пример, который я собираюсь использовать, - это перемещение объекта на экране (поскольку вы все равно хотите это сделать).Я использовал постепенное перемещение, потому что понятия не имею, пишете ли вы игру на основе сетки, и вам нужно ровно 5 пикселей движения.Просто вырежьте весь код stepSize и установите его на 5, если это то, что вы делаете.

  1. Напишите функцию обратного вызова таймера, которая проверяет, установлена ​​ли BOOL и, если это так, продолжает запусксамо по себе:

    - (void)moveObjectLeft:(NSTimer *)timer
    {
        // check the total move offset and/or the X location of the object here
        // if the object can't be moved further left then invalidate the timer
        // you don't need to check whether the button is still being pressed
        //[timer invalidate];
        //return;
    
        // the object moves gradually faster as you hold the button down for longer
        NSNumber *moveOffset = (NSNumber *)[timer userInfo];
        NSUInteger stepSize = 1;
        if(moveOffset >= 40)
            stepSize = 10;
        else if(moveOffset >= 15)
            stepSize = 5;
        else if(moveOffset >= 5)
            stepSize = 2;
    
        // move the object
        object.center = CGPointMake(object.center.x - stepSize, object.center.y);
    
        // store the new total move offset for this press
        moveOffset += stepSize;
        [timer setUserInfo:moveOffset];
    }
    
  2. Создать свойство таймера в текущих классах .h:

    @property (nonatomic, retain) NSTimer *moveTimer;
    
  3. Синтезировать его в .m:

    @synthesize moveTimer;
    
  4. Создайте объект таймера при нажатии кнопки.Либо сделайте это в touchesBegan:withEvent: и проверьте, что это событие Touch Down, либо подключите событие Touch Down в Интерфейсном Разработчике к методу IBAction.

    NSNumber *moveOffset = [NSNumber numberWithUnsignedInt:0];
    self.moveTimer =
        [NSTimer
         scheduledTimerWithTimeInterval:0.2
         target:self
         selector:@selector(moveObject:)
         userInfo:moveOffset
         repeats:YES];
    
  5. Когда кнопкаОтпустив (снова используя один из описанных выше способов, touchesEnded:withEvent: для Touch Up Inside или, возможно, даже Touch Up Outside, или другой IBAction для обоих этих событий), внешне отключить таймер:

    [self.moveTimer invalidate];
    self.moveTimer = nil;
    
0 голосов
/ 24 ноября 2011

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

// предположим, что таймер настроен на тестирование состояний кнопок, запускающих controlLoop каждые x секунд

-(void)controlsLoop
{
    if (leftButton.state == UIControlStateSelected || leftButton.state == UIControlStateHighlighted)  {

    }
}

Я никогда не делал этого раньше, так что играйте с этим весело. Я обычно добиваюсь контроля, как вы хотите в Cocos2d,

Может быть, лучше реализовать эти методы

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

, чтобы установить, в каком направлении вы хотите переместить объект, и при этом все еще есть таймер, запускающий фактическое движение.

0 голосов
/ 24 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...