【问题标题】:Intersection between multiple images in XcodeXcode中多个图像之间的交集
【发布时间】:2012-06-04 19:15:56
【问题描述】:

嘿,伙计们,我一直在制作一个游戏,其中用户按下一个按钮,每次按下该按钮时,屏幕都会添加一个新的 UIImageView(每次都相同)。这些 UIImageView 可以通过 UITouch 功能单独拖动。但我希望他们也能检测到十字路口! 我想知道哪两个 UIImageViews 相交,这样我就可以更改相交的两个 UIImageViews 的 image-url。

-(IBAction)ClTouched:(id)sender {

imgView2 = [[UIImageView alloc] initWithFrame:CGRectMake(120, 20, 80, 80)];
imgView2.backgroundColor = [UIColor clearColor];
imgView2.userInteractionEnabled = TRUE;
imgView2.image = [UIImage imageNamed:@"Cl.png"];

[self.view addSubview:imgView2];

}

// 触摸移动图像你可以 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { imgView.userInteractionEnabled = TRUE;

// get touch event
UITouch *touch = [[event allTouches] anyObject];
CGPoint touchLocation = [touch locationInView:self.view];

if ([self.view.subviews containsObject:[touch view]]) {
    [touch view].center = touchLocation;
}

if (CGRectIntersectsRect(imgView.frame, imgView2.frame)) {
    naam.text = @"INTERSECTION";
}

}

我希望这是足够的信息来帮助我!

【问题讨论】:

    标签: c++ iphone xcode image


    【解决方案1】:

    您可以使用CGRectIntersectsRect() 来查看是否有任何 UIImageView 与另一个相交。下面的例子..

    编辑:后来意识到您已经实现了CGRectIntersectsRect() 方法。如果您有一个可以访问的所有其他图像的数组,在拖动要比较的图像时,您可以执行类似的操作

       for(UIImageView *image in yourArrayOfImages) {
    
             if(CGRectIntersectsRect(self.frame,[image frame])) {
    
                  NSLog(@"self overlaps %@",image);
                  //Now you know self is overlapping `image`, change the URL.
    
              }
    
        }
    

    由于您有多个这些图像,因此您必须对所有图像进行 for 循环,并使用上述方法确定哪些图像相交。

    【讨论】:

    • 这行不通,因为如果您仔细查看代码,您会发现每次按下按钮时都会添加 imgView2(应该这样做)但我不能这样做:if( CGRectIntersectsRect([imgView2 frame],[imgView2 frame])) { NSLog(@"Image2 and Image2 Overlap");这将导致它总是相交。
    • 保留一个引用数组来存储所有添加的图像,这是您应该做的。这样你就可以检查一些东西了。
    • 我想我不明白你。我现在有:`imgView2.userInteractionEnabled = TRUE; UITouch *touch = [[event allTouches] anyObject]; CGPoint touchLocation = [touch locationInView:self.view]; for(UIImageView *image in images) { if(CGRectIntersectsRect([touch view].frame,[image frame])) { naam.text =[NSString stringWithFormat:@"self 重叠 %@",imgView2]; } } }` 但看不出这将如何解决
    【解决方案2】:

    我的方法

    我在创建的游戏中遇到了类似的问题,目标以不同的颜色和属性出现在屏幕上。我接近它的方法是使用 NSMutableDictionary 并存储每个目标,这是一个按钮,然后在我停止使用它们时删除它们。

    创建图像

    每次用户按下该按钮时,我都会创建一个新的 UIImageView,然后将其存储在包含每个 UIImageView 的字典中。我会用像“1”或“2”这样的唯一键来存储它们。这样,您可以将数字保存为图像中的标签,然后稍后获取数字,这实际上是 UIImageView 的键。换句话说,UIImageView 的标签与存储在字典中的键值相同。

    碰撞

    我也遇到过这个问题,我想出了一个解决方案。

    -(BOOL) checkIfFrame:(CGRect)frameOne collidesWithFrame:(CGRect)frameTwo {
        return (CGRectIntersectsRect(frameOne, frameTwo));
    }
    

    如果frameAframeB 冲突,此方法将返回 TRUE 或 FALSE 语句。

    NSMutableDictionary 使用示例

    NSMutableDictionary * imageViewsDictionary;
    int lastImageViewNumber = 0;
    
    -(IBAction *) addNewImageView {
        UIImageView * newImageView;
    
        newImageView.image = [UIImage imageNamed:@""]; //Your Image
        newImageView.frame = CGRectMake:(0, 0, 0, 0); //Your Frame
        newImageView.tag = lastImageViewNumber;
    
        NSString * currentKey = [NSString stringWithFormat:@"%d", lastImageViewNumber];
        [imageViewsDictionary setObject:newImageView forKey:currentKey];
    
        [self.view addSubview:newImageView];
    
        lastImageViewNumber ++;
    }
    
    -(void) removeImageView:(id)sender {
        UIImageView * imageView = (UIImageView *)sender;
    
        [imageView removeFromSuperview];
    
        NSString * key = [NSString stringWithFormat:@"%d", imageView.tag];
        [imageViewsDictionary removeObjectForKey:key];
    
        lastImageViewNumber --;
    }
    

    【讨论】:

    • 好的,非常感谢,我应该如何/在哪里调用这个 BOOL?
    • 当你想知道一个对象是否与另一个对象相交时,你应该调用它。一种方法是创建一个计时器,该计时器连续运行不同的方法,然后运行此方法来检查对象是否与另一个对象发生碰撞。
    猜你喜欢
    • 2012-07-01
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 2023-03-27
    相关资源
    最近更新 更多