如果我在下面创建一个类的实例并从我的控制器调用spawn函数,则会出现sprite,但我将无法更改其任何属性。
class Hero: SKSpriteNode
{
var hero = SKSpriteNode(imageNamed: "hero3")
func spawn(parentNode: SKNode, position: CGPoint, size: CGSize = CGSize(width: 50, height: 50))
{
hero.size = size
hero.position = position
hero.physicsBody = SKPhysicsBody(circleOfRadius: 25)
hero.physicsBody?.allowsRotation = false
hero.zPosition = 10
parentNode.addChild(hero)
}
}
如果我摆脱了英雄财产并将一切都变为自我,那就可以了。
class Hero: SKSpriteNode
{
func spawn(parentNode: SKNode, position: CGPoint, size:CGSize = CGSize(width: 50, height: 50))
{
self.size = size
self.position = position
self.texture = SKTexture(imageNamed: "hero3")
self.physicsBody = SKPhysicsBody(circleOfRadius: 25)
self.physicsBody?.allowsRotation = false
self.zPosition = 10
parentNode.addChild(self)
}
}
我确定这是快速的101,但有人可以解释为什么第一个版本不能按预期工作吗?
答案 0 :(得分:0)
在第一个示例中,您在SpriteNode
内创建了一个var(基本上是SpriteNode
)。
当您实例化类let hero = Hero(....)
时,您现在拥有一个名为hero的SpriteNode,其中包含一个名为hero
的属性。你也可以改变。调用hero.size会改变基础英雄,而hero.hero.size会改变内部的SpriteNode ......这可能不是你想要的行为。
如果你只是想创建一个SpriteNode并修改它,那么第二个类看起来是正确的。该类是SpritNode的子类,因此它已经是SpriteNode - 无需像第一个一样在其中创建一个。
希望这有帮助!
答案 1 :(得分:0)
您的Hero class
继承自SKSpriteNode,因此它本质上是一个SKSpriteNode,这意味着您不需要创建英雄SKSpriteNode变量。
在您的第一堂课中,当您使用hero.size = size
时,您正在访问班级中变量的属性,而不是 on 该班级本身。然后将英雄SKSpriteNode作为子项及其所有属性添加,但保存变量的类SKSpriteNode没有设置属性大小或物理主体。您可以将该类视为包含变量SKSpriteNode的容器。
在第二个函数中,当您使用self.size = size
时,您将访问类的属性,并为SKSpriteNode类提供在其他类中使用它所需的所有属性。