Проблема с изображениями столкновений, столкновение перед касанием - PullRequest
3 голосов
/ 15 мая 2011

Привет всем, я француз, так что используйте меня для моего английского. Моя проблема заключается в следующем: у меня есть изображение в центре экрана, которое называется viewToRotate, затем у меня есть изображение с именем flakeView, которое создается вне экрана изатем он перемещается в центр, и каждую секунду это делает таймер (создайте flakeView вне экрана, а затем переместите его в центр экрана).

Я хотел сделать следующее: если flakeView иСтолкновение viewToRotate уменьшает альфу viewToRotate до 0.5.Но когда на экране появляется flakeView, действие уменьшения альфа вызывается без столкновения viewToRotate и flakeView, поэтому они сталкиваются до того, как коснутся.Я не знаю почему.Как я могу решить это, пожалуйста.Вот код:

UIImageView* flakeView = [[[UIImageView alloc] initWithImage:flakeImage] autorelease];

// use the random() function to randomize up our flake attributes
int startY = round(random() % 320);

// set the flake start position
flakeView.center = CGPointMake(490, startY);
flakeView.alpha = 1;

// put the flake in our main view
[self.view addSubview:flakeView];

[UIView animateWithDuration:7
                 animations:^{
                     // set the postion where flake will move to
                     flakeView.center = viewToRotate.center;
                 }];
}


-(void)checkCollision{

if(CGRectIntersectsRect(flakeView.frame, viewToRotate.frame) == 1)  
{
    viewToRotate.alpha=0.5;
}
}

Ответы [ 3 ]

0 голосов
/ 02 июля 2011

Прежде чем углубляться в эту проблему, убедитесь, что ваш viewToRotate.frame действительно соответствует вашим ожиданиям (см. Мой комментарий).

Как только вы определитесь с этими атрибутами, вы можете проверить столкновение на текущих presentationLayer ваших анимированных объектов, а не на их исходном состоянии.

UIView.layer.presentationLayer
Возвращает копию слой, содержащий все свойства как они были в начале текущего транзакция, с любым активным анимация применяется.

Таким образом, вы можете адаптировать обнаружение столкновений следующим образом:

-(void)checkCollision
{
    if(CGRectIntersectsRect(flakeView.layer.presentationLayer.frame, viewToRotate.layer.presentationLayer.frame) == 1)  
    {
        viewToRotate.alpha=0.5;
    }
}

Также рассмотрите возможность использования метода CoreAnimation Layer hitTest: вместо обнаружения столкновений вручную.

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

0 голосов
/ 06 сентября 2011

Это следующие вещи, которые вы хотели бы проверить.

  1. Не инициализируйте с изображением, используйте init с рамкой, а затем выполните flakeView.image = ----; Потому что ваше изображение может быть достаточно широким изначально и, следовательно, сталкиваются с момента инициализации.
  2. Попробуйте альтернативы .center, например .frame.size.x, потому что у меня был проблемы с .center, а также
  3. Вы могли бы, вероятно, NSLog границы обоих ваших изображений ранее и после уменьшения альфа
0 голосов
/ 26 июня 2011

Я бы не советовал использовать таймер для viewDidLoad.Я считаю, что вы должны установить таймер на какую-то другую функцию.Даже если вы не используете viewDidLoad для чего-либо еще.

Другая вещь - это анимация UIView.Даже если у вас есть таймер на каждые 60 кадров в секунду, атрибуты анимированных объектов не изменяются анимацией.Поэтому перед созданием анимации вы устанавливаете эти свойства один раз.И когда вы создаете анимацию, вы устанавливаете те же свойства во второй раз.И это все.Отныне, пока анимация запущена, если вы проверяете свойства, вы всегда будете получать вторые значения.

Чтобы иметь рабочий код, можно создать анимацию UIView (и выполнить проверки свойств) длякаждый шаг в определенный промежуток времени.Или используйте OpenGL.

...