我创建了一个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: “随你”)。我认为子类化是要走的路。
答案 0 :(得分:0)
问题在于我没有为循环中的每个怪物初始化物理体。
for monster in walkingMonsters {
let body = SKPhysicsBody(rectangleOfSize: monster.sizes[0])
monster.physicsBody = body
//rest of setting comes here
}