以下是我用来检测2 UIImageViews
是否相互碰撞的代码。
if (CGRectIntersectsRect(Appy.frame, Bottom.frame)) {
[self GameOver];
}
此时它检测到物体的边缘。
如何更改它以检测UIImageView内的图像边缘。
里面的图像有一个透明的背景,并且“几乎是圆形”,所以如果UIImageView的角落到另一个UIImageView的角落但是图像实际上并没有击中,那么它们会发生碰撞,所以它的制作看起来有些“混乱”
修改*
这些是我得到的错误
这是我的.h
编辑:下面是我的代码现在的样子
.m方法
if (CGRectIntersectsRect([self: RectBox:Appy].frame, Bottom.frame)) {
[self GameOver];
}
·H
-(UIImageView *)RectBox:(UIImageView *)box;
我把它放在最后一个@end
上面,直到我的.h才确定。
我仍然“使用未声明的标识符'RectBox'”
修改
修改
这里要求的是我调用方法的代码
-(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];
}
}
我认为你需要看到这一切吗?
答案 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)
试试此代码
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;
答案 3 :(得分:0)
var attributes = [UICollectionViewLayoutAttributes]()
for att in cache {
if (att.frame.intersects(rect))
{
attributes.append(att)
}
}
在swift 3中你可以这样使用。