交互时删除节点 Spritekit

Posted

技术标签:

【中文标题】交互时删除节点 Spritekit【英文标题】:Delete Nodes Spritekit when interact 【发布时间】:2017-05-11 18:29:17 【问题描述】:

我的视野中心有一个圆圈。被称为enemyBall 的圆圈与它发生碰撞。我想检测这些碰撞,然后从视图中移除enemyBalls。

func generateEnemyBall()

    let enemyBall = SKSpriteNode()
    let randomColor = Int((arc4random_uniform(UInt32(circleTextures.count))))
    enemyBall.texture = SKTexture(imageNamed: circleTextures[randomColor])
    enemyBall.size = CGSize(width: mainCircle.size.width / 5, height: mainCircle.size.width / 5)
    enemyBall.physicsBody = SKPhysicsBody(circleOfRadius: enemyBall.size.width / 2)
    enemyBall.physicsBody?.affectedByGravity = false

    let quadrant = Int(arc4random_uniform(UInt32(3)))
    enemyBallForce = -CGFloat(arc4random_uniform(UInt32(100)))

    switch quadrant 

    case 0:

        enemyBall.position = CGPoint(x: self.frame.maxX - 20, y: self.frame.maxY - 100)

        self.addChild(enemyBall)

        let dx = (enemyBall.position.x) - mainCircle.position.x
        let dy = (enemyBall.position.y) - mainCircle.position.y

        let impulse = applyImpulse(dx: dx, dy: dy)
        enemyBall.physicsBody?.applyImpulse(CGVector(dx: enemyBallForce * impulse.dx, dy: enemyBallForce * impulse.dy))

        break

现在我该怎么办。

【问题讨论】:

查看关于 SO 的 Sprite-Kit 文档 - 有一些在 Swift 中使用 Sprite-Kit 进行碰撞和接触检测的好例子。 【参考方案1】:

我对 swift 有点新,这就是为什么我想用客观 C 来回答你的问题。

在 didMoveToView 中添加:

self.physicsWorld.contactDelegate = self;

为你的敌人球添加更多属性,即

enemyball.physicsBody.categoryBitMask = ballhitcategory;
enemyball.physicsBody.collisionBitMask = ballhitcategory;
enemyball.physicsBody.contactTestBitMask = ballhitcategory;

其中 ballhitcategory 可以是任何无符号常量整数值。

然后在didBeginContact委托方法中:

-(void)didBeginContact:(SKPhysicsContact *)contact

    SKPhysicsBody *body1,*body2;

    body1 = contact.bodyA;
    body2 = contact.bodyB;

    //Do your ball removal here.

【讨论】:

谢谢,我会尝试这两个解决方案,并更新您的进度 你能解释一下 didBeginContact 函数中的最后一部分,body1 和 body2 是什么?【参考方案2】:

声明 SKPhysicsContactDelegate

class GameScene: SKScene, **SKPhysicsContactDelegate** 
...

当有联系时调用这个委托方法:

  func didBegin(_ contact: SKPhysicsContact) 
...

删除节点

enemyBall.removeFromParent()

【讨论】:

代码正常,但只有部分敌方球被删除,而不是全部【参考方案3】:

挖完之后。这对我来说最有效,因为我随机生成了enemyBalls。

func didBegin(_ contact: SKPhysicsContact) 

    contact.bodyB.node?.removeFromParent()


我知道身体 B 将成为敌人球,因此我访问了它的节点,然后将其删除。 只需使用删除的一些节点。

 enemyBall.removeFromParent()

谢谢@DeepakRastogi 和@JPAquino

【讨论】:

以上是关于交互时删除节点 Spritekit的主要内容,如果未能解决你的问题,请参考以下文章

(Swift + Spritekit) - 完全删除节点及其数据

SpriteKit:如何添加/删除节点并避免枚举时出现突变异常?

Spritekit 节点未从内存中删除

如何删除具有特定名称 spritekit 的所有节点

从数组 spritekit swift 中删除节点

Sprite Kit:为所有场景只创建一次节点