【问题标题】:CGRectIntersectsRect at a specific point of the objects?CGRectIntersectsRect 在对象的特定点?
【发布时间】:2014-10-17 02:29:26
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您可以使用 sprite kit 内置的接触检测功能
  • 我查阅了 spritekit 指南,里面有我需要的信息。谢谢。

标签: ios objective-c sprite-kit xcode6


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-13
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多