两个图像碰撞的问题

时间:2011-05-08 08:14:25

标签: iphone cocoa-touch animation uiimageview collision-detection

这是我的问题: 我有两个图像: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 :(得分:0)

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< c ^ 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
}

同样,所有内存,请检查您自己的错误

答案 1 :(得分:0)

我写了http://itunes.apple.com/us/app/balls/id372269039?mt=8,有一点二年级的经验。如果您检查该应用程序,您将看到一些相同的问题。这个话题是一个非常深的兔子洞。当我启动该应用程序时,我甚至不知道如何编写一个像样的游戏循环。您首先需要这样做,因为您需要进行精确的时间步长计算。 AFA碰撞,您需要单独更新模型和视图,因此如果更新模型和对象重叠,则需要将它们备份直到它们不发生碰撞,然后使用结果更新视图。如果你计划有很多碰撞对象,你可能会使用UIViews撞墙。更复杂的是,如果您的对象是圆形的,CGRectIntersectsRect将无法正常工作。这使得数学变得复杂,但这并不算太糟糕。有了我的应用程序,我发现很难让物理看起来很逼真。问题变成了球A和B重叠,所以你支持它们,然后他们现在交叉其他球等等。This链接是一个很好的起点,但有很多代码示例“几乎”工作。