TouchesMoved возвращает только те касания, которые были изменены, игнорируя касания, которые не изменились - PullRequest
2 голосов
/ 03 июля 2011

Я работаю над простой игрой, где «частицы» привлекают прикосновения пользователя.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSArray *touch = [touches allObjects];
    for (numberOfTouches = 0; numberOfTouches < [touch count]; numberOfTouches++) {
        lastTouches[numberOfTouches] = [((UITouch *)[touch objectAtIndex:numberOfTouches]) locationInView:self];
    }
    isTouching = YES;
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    NSArray *touch = [touches allObjects];
    for (numberOfTouches = 0; numberOfTouches < [touch count]; numberOfTouches++) {
        lastTouches[numberOfTouches] = [((UITouch *)[touch objectAtIndex:numberOfTouches]) locationInView:self];
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    NSArray *touch = [touches allObjects];
    for (numberOfTouches = 0; numberOfTouches < [touch count]; numberOfTouches++) {
        lastTouches[numberOfTouches] = [((UITouch *)[touch objectAtIndex:numberOfTouches]) locationInView:self];
    }
    if (!stickyFingers) {
        isTouching = NO;
    }
}

lastTouches - это массив CGPoint с, который используется другой частью программы для перемещения частиц.

Проблема, с которой я сталкиваюсь, заключается в том, что, как я сейчас ее настроил, всякий раз, когда вызывается любая из 3 функций, они перезаписывают массив CGPoints и numberOfTouches.Я не думал, что это будет проблемой, но оказывается, что TouchesMoved получает только те касания, которые изменились, и не получает те, которые остались прежними.В результате, если вы двигаете одним пальцем, а не другим, программа забывает о пальце, который не движется, и все частицы движутся в направлении движущегося пальца.Если вы перемещаете оба пальца, частицы перемещаются между двумя пальцами, как они должны.

Мне нужно как-то удержать прикосновения, которые не двигались, при обновлении тех, которые были.

Есть предложения?

1 Ответ

1 голос
/ 03 июля 2011

Установите теорию на помощь!

//Instance variables
NSMutableSet *allTheTouches;
NSMutableSet *touchesThatHaveNotMoved;
NSMutableSet *touchesThatHaveNeverMoved;

//In touchesBegan:withEvent:
if (!allTheTouches) {
    allTheTouches = [[NSMutableSet alloc] init];
    touchesThatHaveNotMoved = [[NSMutableSet alloc] init];
    touchesThatHaveNeverMoved = [[NSMutableSet alloc] init];
}
[allTheTouches unionSet:touches];
[touchesThatHaveNotMoved unionSet:touches];
[touchesThatHaveNeverMoved unionSet:touches];

//In touchesMoved:withEvent:
[touchesThatHaveNeverMoved minusSet:touches];
[touchesThatHaveNotMoved setSet:allTheTouches];
[touchesThatHaveNotMoved minusSet:touches];

//In touchesEnded:withEvent:
[allTheTouches minusSet:touches];
if ([allTheTouches count] == 0) {
    [allTheTouches release]; //Omit if using ARC
    allTheTouches = nil;
    [touchesThatHaveNotMoved release]; //Omit if using ARC
    touchesThatHaveNotMoved = nil;
}
[touchesThatHaveNotMoved minusSet:touches];
[touchesThatHaveNeverMoved minusSet:touches];

В приведенном выше примере touchesThatHaveNotMoved будет удерживать касания, которые не двигались в последние touchesMoved:, и touchesThatHaveNeverMoved будет удерживать прикосновения, которые не двигались ни разу с момента их начала.Вы можете не указывать ни одну, ни обе переменные, а также все операторы, которые их содержат, которые вас не интересуют.

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