碰撞图像问题,触摸前碰撞

时间:2011-05-15 08:53:06

标签: iphone animation uiimageview collision-detection

大家好我是法国人因为我的英语而烦恼。我的问题如下:我在屏幕中央有一个名为viewToRotate的图像,然后我有一个名为flakeView的图像,它是在屏幕外创建的然后它移动到中心,每秒钟Timer都会这样做(在屏幕外创建一个flakeView,然后将其移动到屏幕中心)。

我想要做的是:如果flakeView和viewToRotate碰撞,则将viewToRotate的alpha减少到0.5。但是当屏幕上出现flakeView时,调用减少alpha的动作而没有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 :(得分:0)

我不建议在viewDidLoad上使用计时器。我相信你应该把计时器设置为其他功能。即使你不使用viewDidLoad也是如此。

另一件事是UIView动画。即使您每60fps有一个计时器,动画也不会更改动画对象的属性。因此,在创建动画之前,您需要设置一次这些属性。当您创建动画时,您第二次设置相同的属性。就是这样。从现在开始,如果您对属性进行检查,则动画正在运行时,您将始终获得第二个值。

要有一个工作代码,一个选项是在特定时间间隔为每个步骤创建UIView动画(并执行属性检查)。或者使用OpenGL。

答案 1 :(得分:0)

在深入研究此问题之前,请确保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:
返回最远的   接收器的后代   层次结构(包括其自身)   包含指定点。

答案 2 :(得分:0)

以下是您要检查的内容。

  1. 不要使用图像初始化,使用带帧的init然后执行 flakeView.image = ----;因为你的图像足够宽 最初,因此从你初始化时发生碰撞。
  2. 尝试.center的替代品,例如.frame.size.x,因为我有 .center的问题
  3. 您可能可以在之前和之前NSLog记录两个图像视图的边界 减少alpha后