【发布时间】:2020-01-23 06:38:42
【问题描述】:
我正在使用 spritekit 创建一个场景。我有 3 个类:GameScene、Bullet 和 Enemy。在我的 GameScene 中,我通过 Bullet 和 Enemy 类添加了创建 SKSpriteNode。
var newBullet = Bullet();
newBullet.CreateBullet()
self.addChild(newBullet.GetSpriteNode())
稍后我通过扩展 SKPhysicsContactDelegate 来使用碰撞检测。
func didBegin(_ contact: SKPhysicsContact) {
print("collision detected!")
let firstBody = contact.bodyA.node as! SKSpriteNode;
let secondBody = contact.bodyB.node as! SKSpriteNode;
//here's where I'd like to call bullet.hit()
//var bullet = firstBody.GetClass(Bullet)
//bullet.hit()
// I tried - let tempBullet = ((firstBody as? Bullet));
//but firstBody as? Bullet returns nil
//print(firstBody) - it indeed is my bullet sprite... why is it nil?
}
我在上面写了我的伪代码......我将如何获得与 SKSpriteNode 关联的类......?有什么方法可以让我的类脚本成为 SKSpriteNode 的一部分,如果是这样 - 我如何获取附加的脚本来调用它的函数?
这也是我的子弹类
class Bullet : SKSpriteNode{
var skNode : SKSpriteNode?
func CreateBullet(){
skNode = SKSpriteNode(color: SKColor.white, size: CGSize(width: 2, height: 10))
skNode?.name = "bullet"
skNode?.position = CGPoint(x: 0, y: 0)
skNode?.physicsBody = SKPhysicsBody(rectangleOf: skNode!.size)
skNode?.physicsBody?.isDynamic = true;
skNode?.physicsBody?.allowsRotation = false;
skNode?.physicsBody?.pinned = false;
skNode?.physicsBody?.affectedByGravity = false;
skNode?.physicsBody?.categoryBitMask = PhysicsCategory.Bullet;
skNode?.physicsBody?.collisionBitMask = PhysicsCategory.Enemy;
skNode?.physicsBody?.contactTestBitMask = PhysicsCategory.Enemy;
}
func GetSKNode() -> SKNode{
return skNode!;
}
}
【问题讨论】:
-
尝试将第一个主体投射为子弹类型
-
刚刚试过-让 tempBullet = ((firstBody as? Bullet));它编译,但打印 nil...
-
让你成为 SKSpriteNode 类型的子弹类,然后通过铸造希望它不会打印 nil
-
我正在这样做... class Bullet : SKSpriteNode{} 但它仍然为零...我添加它的方式是否正确... self.addChild()...也会将该函数添加到问题中以供参考
-
刚刚添加了更多代码/细节以供参考@SanadBarjawi