创建和使用类

时间:2016-06-09 02:51:48

标签: swift sprite-kit

如果我在下面创建一个类的实例并从我的控制器调用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,但有人可以解释为什么第一个版本不能按预期工作吗?

2 个答案:

答案 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类提供在其他类中使用它所需的所有属性。