Создание Swingometer на iPhone с использованием Core-Animation - PullRequest
1 голос
/ 10 августа 2010

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

Вместо того, чтобы заполнять планку, я бы хотел использовать маятник, который качается слева направо. Маятник оставляет отметку там, где он впервые постучал (сила), и другую отметку, где он постучал во второй раз (точность).

Моя первая проблема - вращение маятника. Я читал эти посты о вращении UIImageView - здесь , здесь и здесь , но я надеялся, что смогу получить небольшой дополнительный совет: )

Прежде всего, вращение UIImageView - лучший способ приблизиться к этому? Я думал о том, чтобы определить, насколько близко маятник к правильному месту, сравнивая его координаты с координатами правильного места. Но чтобы это работало, UIImageView должен был бы физически двигаться, что я не уверен, что делает? Кроме того, как заставить UIImageView вращаться вокруг определенной точки, а не центральной точки. Или я должен просто увеличить ограничивающую рамку маятника, чтобы центральная точка была в правильном положении. И как я могу оставить «штамп», когда пользователь нажимает (или отпускает) кнопку?

Буду очень признателен за любую общую помощь относительно наилучшего подхода к этому вопросу :) Возможно, мой вопрос немного расплывчатый и обобщенный, но я надеюсь, что кому-то может понравиться этот вызов :)

Спасибо !!

Майкл

UPDATE:

Хорошо, я попробовал следующие два подхода, оба из которых теперь работают.

    - (void)viewDidLoad {
        pendulum.image = [UIImage imageNamed:@"winkOpen.png"];
        [self swingPendulum];
    }

    - (void)swingPendulum {
    CABasicAnimation *rotationAnimation;
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadian(180)]; 
    rotationAnimation.duration = 0.75;
    rotationAnimation.repeatCount = 1.0; 
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];

    [pendulum.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
}


    /*
    - (void)swingPendulum {
        [UIView setAnimationBeginsFromCurrentState:YES];
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:1];
        pendulum.transform = CGAffineTransformMakeRotation(degreesToRadian(180));
        [UIView setAnimationDelegate:self];
        [UIView commitAnimations];
    }
    */

Теперь я не уверен, какой подход лучше, но с первым маятник качается выше 0 градусов, а не ниже, так что я собираюсь с этим.

Теперь мне нужно определить, где останавливается маятник, и повернуть вспять ... Но, возможно, я опубликую их как отдельные вопросы, поскольку это становится немного загроможденным! Я позабочусь, чтобы мои вопросы были более конкретными в будущем :)

1 Ответ

1 голос
/ 10 августа 2010

Для анимации вы захотите посмотреть на трансформации. См. Руководство по программированию Quartz 2D: Преобразования.

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

Отображение imageView там, где вам нужно, относительно тривиально по сравнению с вычислением, где оно должно быть в первую очередь Вы должны правильно понять движение. Помните: «это ничего не значит, если у вас нет этого удара!»

...