CGRectIntersectsRect:如何将检测更改为UIImageView内的图片边缘

时间:2014-06-01 12:31:13

标签: ios objective-c uiimageview cg

以下是我用来检测2 UIImageViews是否相互碰撞的代码。

 if (CGRectIntersectsRect(Appy.frame, Bottom.frame)) {
   [self GameOver];
}

此时它检测到物体的边缘。

如何更改它以检测UIImageView内的图像边缘。

里面的图像有一个透明的背景,并且“几乎是圆形”,所以如果UIImageView的角落到另一个UIImageView的角落但是图像实际上并没有击中,那么它们会发生碰撞,所以它的制作看起来有些“混乱”

修改*

Errors im getting

这些是我得到的错误

enter image description here 这是我的.h


编辑:下面是我的代码现在的样子

.m方法

if (CGRectIntersectsRect([self: RectBox:Appy].frame, Bottom.frame)) {
        [self GameOver];
    }

·H

-(UIImageView *)RectBox:(UIImageView *)box;

我把它放在最后一个@end上面,直到我的.h才确定。

我仍然“使用未声明的标识符'RectBox'”

修改

Debug screem

修改

这里要求的是我调用方法的代码

-(void) PipeMoving2{

    PipeTop2.center = CGPointMake(PipeTop2.center.x -2, PipeTop2.center.y);
    PipeBottom2.center = CGPointMake(PipeBottom2.center.x -2, PipeBottom2.center.y);





    if (PipeTop2.center.x < -53+33) {
        [self PlacePipe2];
    }

    if (PipeTop2.center.x == 62) {
        [self Score];
    }


    if (CGRectIntersectsRect(Appy.frame, PipeTop2.frame)) {
        [self GameOver];
    }

    if (CGRectIntersectsRect(Appy.frame, PipeBottom2.frame)) {
    [self GameOver];
    }

    if (CGRectIntersectsRect(Appy.frame, Top.frame)) {
        [self GameOver];
    }

    if (CGRectIntersectsRect([self RectBox:Appy].frame, Bottom.frame)) {
        [self GameOver];
    }

}

我认为你需要看到这一切吗?

4 个答案:

答案 0 :(得分:1)

试试这个

.h

-(UIImageView *)RectBox:(UIImageView *)box;

的.m

if (CGRectIntersectsRect([self RectBox:Image].frame, Bottom.frame)) 
{
   [self GameOver];
}

-(UIImageView *)RectBox:(UIImageView *)box
{
    box.frame = CGRectMake(box.frame.origin.x +15,
                          box.frame.origin.y +15,
                          box.frame.size.width -30,
                          box.frame.size.height-30);
    return box;
}

答案 1 :(得分:1)

将其更改为以下内容:

if(CGRectIntersectsRect([self RectBox:Image].frame, Bottom.frame))

我从你的图像中注意到的另一件事是你将方法放在另一种方法中。

Ex :(我从你的形象看到的,似乎)

- (void)yourMethod
{
    ......
    if (CGRectIntersectsRect([self RectBox:Image].frame, Bottom.frame)) 
    {
       [self GameOver];
    }
    .....
    //etc etc

    //and then you have this
    -(UIImageView *)RectBox:(UIImageView *)box
    {
        box.frame = CGRectMake(box.frame.origin.x +15,
                               box.frame.origin.y +15,
                               box.frame.size.width -30,
                               box.frame.size.height-30);
        return box;
    }

....
}

您应该提取它并将其放在方法之外,因此它变为:

- (void)yourMethod
{
    ......
    if (CGRectIntersectsRect([self RectBox:Image].frame, Bottom.frame)) 
    {
       [self GameOver];
    }
    .....
    //etc etc
    ....
}

//take it out and place it here, for example

- (UIImageView *)RectBox:(UIImageView *)box
{
     box.frame = CGRectMake(box.frame.origin.x +15,
                            box.frame.origin.y +15,
                            box.frame.size.width -30,
                            box.frame.size.height-30);
     return box;
}

更新 以及与原始问题不完全相关的评论中的问题,但这是我在您的代码中的发现:

角色改变大小的原因可能源于您在frame方法中更改其RectBox这一事实。

这是对方法的粗略重新定义,以便我们可以“保存”#34;你角色的框架:

- (CGRect)RectBox:(UIImageView *)box
{
     CGRect tempRect = CGRectMake(box.frame.origin.x +15,
                                  box.frame.origin.y +15,
                                  box.frame.size.width -30,
                                  box.frame.size.height-30);
     return tempRect;
}

并对通话进行更改。

例如:

if (CGRectIntersectsRect([self RectBox:Image], Bottom.frame)) 
{
   [self GameOver];
}

关于动作,请检查您为NSTimer设置的频率。我不会比0.1更频繁。

希望这有帮助。

答案 2 :(得分:0)

试试此代码

&#13;
&#13;
CGPoint a = imageViewA.center;
CGPoint b = imageViewB.center;
CGFloat distance = sqrt(pow((b.x - a.x),2) + pow((b.y - a.y),2));

if(distance < (imageViewA.bounds.size.width/2.0 + imageViewB.bounds.size.width/2.0)){
    //images are touching.
}
&#13;
&#13;
&#13;

答案 3 :(得分:0)

var attributes = [UICollectionViewLayoutAttributes]()
    for att in cache {            
        if (att.frame.intersects(rect))
        {
        attributes.append(att)
        }
    }

在swift 3中你可以这样使用。