2016-09-24 94 views
0

我在Swift 3上使用Sprit-kit我的问题是在将子弹射向一个节点(我称之为Planet)之后,我不希望节点(Planet)消失我只想要子弹从场景中消失,并且我的节点(Planet)仍然继续运行,并且如果该节点(Planet)与主玩家发生碰撞,它们都会消失(这里没有问题)。我的问题是当子弹与那个节点两者如何消失在碰撞函数曾经我只是写Bullet.removefromParent()这里是我的代码(我想保持我的星球子弹碰撞,并从现场我的子弹取出后):SpritKit swift 3物理身体碰撞,只删除一个节点

func CollitionPlannetWithBullet(_ Bullet : SKSpriteNode, Planet : SKSpriteNode){ 
    Bullet.removeFromParent() 
} 

,这是代码中确实开始了联系功能N代表地球和子弹:

if ((firstBody.categoryBitMask == physicsCatagory.Planet) && 
    (secondBody.categoryBitMask == physicsCatagory.Bullet)) || 
    ((firstBody.categoryBitMask == physicsCatagory.Bullet) && 
    (secondBody.categoryBitMask == physicsCatagory.Planet)) { 
     CollitionPlannetWithBullet(firstBody.node as! SKSpriteNode, Planet: secondBody.node as! SKSpriteNode) 
} 
+0

你混淆了自己,在你的if语句,你说body1或body2可以子弹,但在你的'CollitionPlannetWithBullet'(拼写错误?)你是说只有body1是子弹。尝试并保持一致 – Knight0fDragon

回答

0

我发现这样做是为了sublcass SKSpriteNode,然后让你用,如果让使用它的子类,一个函数来对待每一个节点在发生碰撞的最佳途径。

我会推荐阅读子类化和多态性,因为它会让你的代码更清洁,并给你更多的灵活性来构建你的东西​​。

func evalChainGun_Drone(_ contact: SKPhysicsContact){ 
    let nodeA = contact.bodyA.node 
    let nodeB = contact.bodyB.node 

    //A Items 
    if let shotA = nodeA as? ChaingunBullet { 
     shotA.damage()} 

    if let droneA = nodeA as? Drone { 
     droneA.weaponDamage(droneA.HP_Class, damage: 1, node: droneA, contactLocation: contact.contactPoint) 
    } 

    //B Items 
    if let shotB = nodeB as? ChaingunBullet { 
     shotB.damage()} 

    if let droneB = nodeB as? Drone { 
     droneB.weaponDamage(droneB.HP_Class, damage: 1, node: droneB, contactLocation: contact.contactPoint) 
    } 
} 

我希望这会有帮助。

最好的问候, 亡灵地球

+0

这有何帮助? – Knight0fDragon

+0

plus,请参阅:https://en.wikipedia.org/wiki/Don%27t_repeat_yourself – Knight0fDragon

+0

spritekit的问题在于,您无法真正控制哪个节点是哪个联系人,因此您需要处理这两种情况。虽然我同意重复代码可能不是最佳实践,但我不确定有什么方法可以使用Swift。 –