Swift SKSpriteNode子类的实例化不正确

Swift SKSpriteNode子类的实例化不正确,swift,sprite-kit,subclass,skspritenode,Swift,Sprite Kit,Subclass,Skspritenode,我创建了一个SKSpriteNode子类,并尝试在SKScene中实例化它,并将一些SKSpriteNode属性与实例化时存储在子类中的其他属性一起设置。下面是类定义 class WalkingMonster: SKSpriteNode { var rangeOfMovement: CGFloat var originalPosition: CGFloat var platformNumber: Int var imageName = "walkingAlien"

我创建了一个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中设置其属性的方式:

用于行走怪物中的怪物{
let texture=SKTexture(图像名:monster.textureName)
怪物纹理=纹理
monster.size=monster.size[0]
monster.position.x=monster.originalPosition
//如果它应该坐在地上
如果monster.platformNumber<0{
monster.position.y=self.groundHeight+super.groundBlockSize.height/2+monster.size.height/2
}
monster.physicsBody?.categoryBitMask=physicsBitMasks.WalkingeMy
monster.physicsBody?.contactTestBitMask=physicsBitMasks.ground | physicsBitMasks.player | physicsBitMasks.aerialBlock
monster.physicsBody?.contactTestBitMask=physicsBitMasks.ground | physicsBitMasks.player | physicsBitMasks.aerialBlock
monster.physicsBody?.dynamic=true
怪物。物理身体?。受重力影响=真
self.addChild(怪物)
}
}
在运行时有一个怪物会产卵,但他(或至少他的纹理)似乎离地有点远。当玩家(其categoryBitMask为.player,其接触和碰撞位掩码包括.Walkingemy)走进他时,主角的移动不会发生任何变化,行走怪物(行走怪物[0])也不会移动。我不确定我在语法上是否遗漏了一些小东西,或者是否有一个更大的拦截器


我已经成功实现的另一种方法是,在相应的参数向量中存储这些成员变量,这些变量在风格上应该是SKSpriteNode的子类,然后在使用SKSpriteNode便利初始值设定项SKSpriteNode(ImageName:“whatever”)后进行设置。但是,我认为子类化是一种可行的方法。

问题是我没有为循环中的每个怪物初始化physicsbody

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

从你的代码看不到你如何初始化每个怪物的物理身体,所以你可以编辑你的问题并添加那个部分。。。此外,在开发阶段,您应该将物理可视化表示(skView.showsPhysics=true)转换为。。。这可能会有帮助……我使用[walkingMonster]迭代器类型的monster变量对[walkingMonster]中的每个怪物以相同的方式进行初始化。每个怪物都应该有自己具有相同属性的physicsBody。不,您不是:)您尚未在节点上初始化physicsBody属性。您需要这样的内容:
monster.phyicsbody=SKPhysicsBody(rectangleOfSize:size)
等。然后您可以设置
categoryBitMask
,或该实体上的其他属性。现在,怪物的物理体为零,你在初始化它之前尝试使用它。你是对的。我从不初始化物理体,它不会崩溃,因为您正在使用可选链接。。。
for monster in walkingMonsters {
    let body = SKPhysicsBody(rectangleOfSize: monster.sizes[0])
    monster.physicsBody = body
    //rest of setting comes here
}