проблема со столкновением двух изображений - PullRequest
0 голосов
/ 08 мая 2011

Ну, вот моя проблема: у меня есть два изображения: flakeImage и ViewToRotate.Я хочу, чтобы, если flakeImage коснулся ViewToRotate, ViewToRotate.alpha = 0.5;но когда FlakeImage появляется на экране ViewToRotate.alpha = 0.5;не касаясь этого.Я думаю, что это проблема с моим взглядом, потому что у меня есть:

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

вот код:

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

// 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 beginAnimations:nil context:flakeView];
// set up how fast the flake will fall
[UIView setAnimationDuration:7 ];

// set the postion where flake will move to
flakeView.center = viewToRotate.center;

// set a stop callback so we can cleanup the flake when it reaches the
// end of its animation
[UIView setAnimationDelegate:self];
[UIView commitAnimations];

Как я могу решить это, пожалуйста?если бы кто-то мог мне помочь, это было бы очень круто.

Ответы [ 2 ]

0 голосов
/ 10 мая 2011

У меня есть немного второкурсного опыта с этим, написав http://itunes.apple.com/us/app/balls/id372269039?mt=8. Если вы проверите это приложение, вы увидите немного той же проблемы.Эта тема довольно глубокая кроличья нора.Когда я запустил это приложение, я даже не знал, как написать достойный игровой цикл.Сначала вам это понадобится, потому что вам нужно делать точные временные вычисления.AFA при столкновениях, вы обновляете свою модель и вид отдельно, поэтому, если вы обновляете модель и объекты перекрываются, вам нужно создавать резервные копии, пока они не столкнутся, а затем обновить ваш вид с результатом.Если вы планируете иметь много сталкивающихся объектов, вы можете ударить стену, используя UIViews.Чтобы усложнить ситуацию, если ваши объекты круглые, CGRectIntersectsRect не будет работать точно.Это немного усложняет математику, но это не так уж плохо.С моим приложением мне было трудно заставить физику выглядеть реалистично.Проблема заключалась в том, что шары A и B пересекаются, поэтому вы создаете их резервные копии, затем они пересекают другие шары и т. Д. И т. Д. Эта ссылка является хорошей отправной точкой, но примеров кода довольно много.там, где "почти" работа.

0 голосов
/ 09 мая 2011

CGRect имеет функцию пересечения.Кадры UIViews - это CGRects.

if (CGRectIntersectsRect(view1.frame, view2.frame) == 1)
  NSLog(@"The views intersect");
else
  NSLog(@"The views do not intersect");

Проблема, которую я предвижу, заключается в том, что если у rects много пробелов, они будут пересекаться до того, как они фактически коснутся

Во-вторых, вам следует переключитьсядо блокировки анимации.Настоятельно рекомендуется

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

Сделано все это из памяти, не знаю, есть ли ошибки.

Круговое столкновение:

a ^ 2 + b ^ 2

if(pow(view2.frame.origin.x - view1.frame.origin.x, 2) + 
    pow(view2.frame.origin.y - view1.frame.origin.y, 2) < 
    pow(view1.frame.size.width/2, 2))
{
     //collision
}
else
{
     //no collision
}

Опять все по памяти, проверьте на ошибки самостоятельно

...