3

そのため、fallingBall現在、UIView と呼ばれる UIView とうまく衝突する UIView がありtheBlockViewます。CGRectIntersectsRect(theBlockView.frame, fallingBall.frame)この衝突を検出するために使用しています。

それはすべて非常にうまくいっているので、 fallingBall実際に丸くしたいのですが、上隅もtheBlockView丸くしたいと思います。これを行うには、次のコードを使用しました。

//round top right-hand corner of theBlockView
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:theBlockView.bounds 
                                           byRoundingCorners:UIRectCornerTopRight
                                           cornerRadii:CGSizeMake(10.0, 10.0)];
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = theBlockView.bounds;
maskLayer.path = maskPath.CGPath;
theBlockView.layer.mask = maskLayer;

//round the fallingBall view
[[fallingBall layer] setCornerRadius:30];

しかし、おかしなことに、丸みを帯びてきれいに見えますが、ビューはまだ長方形です。だから私の質問は、どうすればCGRectIntersectsRectそれらを見た目の形として扱うことができるでしょうか? 同じように機能するが、ビューのアルファを使用して衝突を検出する関数はありますか?

御時間ありがとうございます!

4

2 に答える 2

3

実際、私自身の質問に答えさせてください!

さて、過去 10 時間の大部分を周りを見回して過ごしたところ、次の投稿に出くわしました: Circle-Rectangle 衝突検出 (交差) - e.James の意見を確認してください!

これを支援する関数を書きました。まず、次structの sを宣言します。

typedef struct
{
    CGFloat x; //center.x
    CGFloat y; //center.y
    CGFloat r; //radius
} Circle;
typedef struct
{
    CGFloat x; //center.x
    CGFloat y; //center.y
    CGFloat width;
    CGFloat height;
} MCRect;

次に、次の関数を追加します。

-(BOOL)circle:(Circle)circle intersectsRect:(MCRect)rect
{

    CGPoint circleDistance = CGPointMake(abs(circle.x - rect.x), abs(circle.y - rect.y) );

    if (circleDistance.x > (rect.width/2 + circle.r)) { return false; }
    if (circleDistance.y > (rect.height/2 + circle.r)) { return false; }

    if (circleDistance.x <= (rect.width/2)) { return true; } 
    if (circleDistance.y <= (rect.height/2)) { return true; }

    CGFloat cornerDistance_sq = pow((circleDistance.x - rect.width/2), 2) + pow((circleDistance.y - rect.height/2), 2);

    return (cornerDistance_sq <= (pow(circle.r, 2)));
}

これが誰かに役立つことを願っています!

于 2012-07-01T11:50:08.983 に答える
2

CGRectIntersectsRect は常に長方形を使用し、ビューのフレームも常に長方形になります。独自の関数を作成する必要があります。ビューの中心を使用して、角の半径を使用して円を計算し、長方形と円が何らかの形で交差するかどうかをテストできます。

于 2012-07-01T01:34:12.533 に答える