CGRectIntersectsRect在对象的特定点?

时间:2014-10-17 02:29:27

标签: ios objective-c sprite-kit xcode6

就像在马里奥游戏中一样,如果你跳跃并降落在怪物的顶部上,怪物就会被击倒。

我在两个对象(玩家和怪物)之间使用CGRectIntersectsRect;然而,怪物将从任何方向被击倒。

如何在对象的特定点处交叉两个对象?

我实际上在每个方向上创建了单独的空白对象,以便工作。有更有效的解决方案吗?

2 个答案:

答案 0 :(得分:1)

您可以使用CGRectIntersectsRect来获取交叉区域的新CGRectIntersection,而不是CGRect。如果玩家从侧面击中,那么这个矩形将比它宽。如果玩家从顶部击中,矩形将比它高,但你需要检查顶部与底部。在这种情况下,您可以将敌方矩形的Y值与交点进行比较。如果玩家从顶部击中,则交叉点和敌方矩形的Y值将相等。否则,玩家会从底部击中。

答案 1 :(得分:1)

typedef NS_ENUM(NSUInteger, IntersectFrom) {
    IntersectFromNotIntersect,
    IntersectFromTop,
    IntersectFromBottom,
    IntersectFromLeft,
    IntersectFromRight
};

IntersectFrom CGRectGetIntersectFrom(CGRect rectPlayer, CGRect rectMonster) {
    CGRect rectIntersect = CGRectIntersection(rectPlayer, rectMonster);
    if(!CGRectIsNull(rectIntersect)) {

        if(CGRectGetWidth(rectIntersect) < CGRectGetHeight(rectIntersect)) {
            // LEFT or RIGHT
            if(CGRectGetMinX(rectIntersect) == CGRectGetMinX(rectMonster)) {
                return IntersectFromLeft;
            }
            else {
                return IntersectFromRight;
            }
        }
        else {
            // TOP or BOTTOM
            if(CGRectGetMinY(rectIntersect) == CGRectGetMinY(rectMonster)) {
                return IntersectFromBottom;
            }
            else {
                return IntersectFromTop;
            }
        }
    }
    else {
        return IntersectFromNotIntersect;
    }
}