如何检测物理学家不同区域的接触

时间:2014-07-08 16:29:04

标签: sprite-kit skphysicsbody

我想在sprite-kit游戏中实现经典的“爆头”效果。

我的想法和尝试:

  1. 在同一个精灵上创建单独的“body”和“head”physicsBodies并用关节固定它们。不可能:(

  2. 在“敌人”精灵上创建一个“body”物理体,并创建另一个透明精灵,其物理身体后面的“head”physicsBody(位于顶部)。这种方法要求我跟踪头部与身体的关联。这也会降低游戏效率。我很好奇我是否可以创建SKSpriteNode的子类并创建一个将这两个spritenodes和physicsBodies捆绑在一起的“敌人”。

  3. 检查射弹与敌人的位置,看看射弹是否在精灵顶部的某个Y范围内接触。我相信这种方法效率很低,因为弹丸飞得很快。

  4. 如果有人创造了这种效果并且可以分享他们的知识,我将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:1)

我在很多地方使用此设置。如果您发现自己想要添加更多零件或武器,它可以很好地扩展,并且它可以让您轻松地在视觉上隐藏任何这些零件或武器。使用userData可以派上用场,如果你有很多事情发生,并且不同的敌人有不同的东西"或者你正在做疯狂的事情,比如根据游戏玩法等将孩子精灵养育到不同的实体

-(SKSpriteNode*)makeAnEnemy
{

    SKSpriteNode *mainEnemy;
    SKSpriteNode *enemyHead;
    //setup mainEnemy physics body
    //setup enemyHead physics body
    [mainEnemy addChild:enemyHead];

    // depending on your plans, on hit you could use the following code later:
    SKSpriteNode *theEnemyThatWasHit = (SKSpriteNode*)enemyHead.parent;

    //or you can use userdata and set it all up here
    [mainEnemy.userData setObject:enemyHead forKey:@"myHead"];
    [enemyHead.userData setObject:mainEnemy forKey:@"myBody"];

    return mainEnemy;
}

答案 1 :(得分:1)

使用physicsBody的pinned属性可以轻松创建具有多个接触区域的复杂精灵。将物理主体固定到节点的父节点:

  

默认值为NO。如果是,则节点的位置是固定的   相对于其父母。节点的位置不能改变   动作或物理力量。节点可以绕其自由旋转   位置以应对碰撞或其他力量。如果是父节点   有一个物理机构,那么这两个物理机构就像对待它们一样   用针接头连接。

这是一个基本的狗类,其中狗有一个主体和一个头。请注意,我也设置了allowsRotation = false,因此头部无法在身体周围移动。

import SpriteKit

// for readability
let mainSize = CGSize(width: 300, height: 300)
let headSize = CGSize(width: 100, height: 100)

class Dog : SKSpriteNode {

    let head = SKSpriteNode(color: SKColor.greenColor(), size: headSize)

    init() {
        super.init(texture: nil, color: SKColor.redColor(), size: mainSize)

        head.position = CGPoint(x: mainSize.width - headSize.width, y: 0)
        addChild(head)
    }

    // called after Dog has been added to the scene
    func configurePhysicsBody() {

        physicsBody = SKPhysicsBody(circleOfRadius: mainSize.width / 2)
        physicsBody.dynamic = true
        physicsBody.allowsRotation = false
        // set contactBitmask for main body

        head.physicsBody = SKPhysicsBody(circleOfRadius: headSize.width / 2)
        head.physicsBody.dynamic = true
        head.physicsBody.allowsRotation = false
        // The head is pinned to the parent node, so position is fixed relative to parent
        head.physicsBody.pinned = true
        // set contactBitmask for head

    }

}

enter image description here