SKSpriteNode子类的不正确实例化

时间:2016-03-11 03:43:57

标签: swift sprite-kit subclass skspritenode

我创建了一个SKSpriteNode子类,并试图在SKScene中实例化它,并设置一些SKSpriteNode属性,其中包含我在实例化时存储在子类中的其他属性。这是类定义。

class WalkingMonster: SKSpriteNode {
    var rangeOfMovement: CGFloat
    var originalPosition: CGFloat
    var platformNumber: Int
    var imageName = "walkingAlien"
    var sizes = [CGSize(width: CGFloat(30.0), height: CGFloat(30.0)), CGSize(width: CGFloat(30.0), height: CGFloat(15.0)), CGSize(width: CGFloat(30.0), height: CGFloat(7.0))]
    var monsterName: String
    var textureName: String

    init(texture: SKTexture, color: UIColor, size: CGSize, rangeOfMovement: CGFloat, originalPosition: CGFloat, platformNumber: Int, name: String, textureName: String) {
        self.rangeOfMovement = rangeOfMovement
        self.originalPosition = originalPosition
        self.platformNumber = platformNumber
        self.monsterName = name
        self.textureName = textureName
        super.init(texture: texture, color: color, size: size)

    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

  }

以下是该类的实例化:

var walkingMonsters = [WalkingMonster(texture: SKTexture(), color: UIColor(), size: CGSize(), rangeOfMovement: CGFloat(25.0), originalPosition: CGFloat(750.0), platformNumber: -1, name: "walkingMonster1", textureName: "walkingAlien1")]

这就是我在didMoveToView()中设置SKScene属性的方法:

for monster in walkingMonsters {
            let texture = SKTexture(imageNamed: monster.textureName)
            monster.texture = texture
            monster.size = monster.sizes[0]
            monster.position.x = monster.originalPosition

            //If it is supposed to sit on the ground
            if monster.platformNumber < 0 {
                monster.position.y = self.groundHeight + super.groundBlockSize.height / 2 + monster.size.height / 2
            }
            monster.physicsBody?.categoryBitMask = physicsBitMasks.walkingEnemy
            monster.physicsBody?.contactTestBitMask = physicsBitMasks.ground | physicsBitMasks.player | physicsBitMasks.aerialBlock
            monster.physicsBody?.contactTestBitMask =  physicsBitMasks.ground | physicsBitMasks.player | physicsBitMasks.aerialBlock
            monster.physicsBody?.dynamic = true
            monster.physicsBody?.affectedByGravity = true
            self.addChild(monster)
        }
    }

在运行时,有一个怪物会产生,但他(或者至少是他的纹理)似乎有点离地。当玩家(具有.player的categoryBitMask并且其接触和碰撞位掩码包括.walkingEnemy)走进他时,主角的移动没有​​任何反应,并且walkingMonster(walkingMonsters [0])也不会移动。我不确定是否有一些我在语法上缺少的小东西,或者是否有更大的阻止程序。

我已经成功实现的另一种方法是在相应的参数向量中存储那些风格上应该是SKSpriteNode的子类的成员变量,然后在使用SKSpriteNode便利初始化程序SKSpriteNode(imageNamed: “随你”)。我认为子类化是要走的路。

1 个答案:

答案 0 :(得分:0)

问题在于我没有为循环中的每个怪物初始化物理体。

for monster in walkingMonsters {
    let body = SKPhysicsBody(rectangleOfSize: monster.sizes[0])
    monster.physicsBody = body
    //rest of setting comes here
}