以编程方式创建SKNode并为其提供SKPhysicsBody

请注意:我在开发游戏时正在学习Swift,这是我很难从Google搜索中真正找到的东西。 如果代码有任何问题,请告诉我更好的方法👍

问题

在学习了如何在SpriteKit中创建场景的教程之后,我遇到了很多问题,这些问题都出现在媒体上。 放入其中的项将导致Xcode(在撰写本文时为10.1版)崩溃。 这使学习经验和工作流程成为噩梦,因此我决定了解如何以编程方式创建SKNode,SKSpriteNode等,并了解我的工作方式。

SKNodes,SKSpriteNodes和所有节点🤷‍♂️

了解如何在GameScene中创建节点非常容易:

  //创建节点变量 
var myNode:SKSpriteNode!
  //使节点为白色矩形,并指定位置和名称 
myNode = SKSpriteNode(颜色:UIColor.white,大小:100,高度:5)
myNode.zPosition = 0
myNode.position = CGPoint(x:0,y:0)
myNode.name =“ my_node”
  //将节点添加到场景 
self.addChild(myNode)

向节点添加物理设置🤬

但是,这部分很可能是由于我缺乏理解和轻微的名字扭曲而导致的,这让我进行了一些搜索和游戏,直到我理解为止。 如果您像我一样在这里苦苦挣扎,它在Xcode中:

我读了一些有关SKPhysicsBody的内容,但是我无法将其与屏幕快照中显示的设置名称相关联。 因此,这是对我有用的东西,如果您遇到与我相同的问题(崩溃🤬),或者如果您希望以编程方式创建场景,则希望对您有所帮助。

  myNode.physicsBody = SKPhysicsBody(rectangleOf:myNode.size) 

上面与将“物理实体”类型设置为“边界矩形”相同。

  myNode.physicsBody = SKPhysicsBody(circleOfRadius:myNode.size) 

这个用于“边界圆”,如果创建圆形节点显然很有用。

我遇到一点麻烦的最后一个是“ Alpha Mask”选项。 我通过以下步骤完成了此任务。

  //根据需要为SKPhysicsBody创建纹理 
让nodeTexture = SKTexture(imageNamed:“ texture”)
  //将纹理应用于节点 
myNode = SKSpriteNode(纹理:nodeTexture)
  //添加物理体 
myNode.physicsBody = SKPhysicsBody(纹理:nodeTexture,大小:nodeTexture.size)

如果要修改节点锚点,请注意自身和其他人

如果您像这样调整节点的锚点:

  myNode.anchorPoint = CGPoint(x:0,y:0) 

然后给节点一个相同大小的PhysicalBody,则PhysicalBody不会从相同的锚点进行包裹,因此您可能会遇到一些奇怪的结果,因为主体将不匹配节点的面积。

要解决此问题,则可以在定义SKPhysicsBody时使用“ center”设置,如下所示:

  myNode.physicsBody = SKPhysicsBody(rectangleOf:myNode.size,中心:CGPoint(x:0,y:0)) 
  // x和y为节点的中心 

在为“地面”节点提供左下角的锚点以轻松将其移至屏幕左侧并使其成为场景宽度时,我遇到了此问题。

重力,旋转和动态设置等

我接下来要做的是更改重力,旋转复选框的设置,这些设置很简单,因为它们是简单的布尔值(对或错)。

  myNode.physicsBody!.affectedByGravity = true / false 
myNode.physicsBody!.allowsRotation = true / false
myNode.physicsBody!.isDynamic = true / false
myNode.physicsBody!.pinned = true / false

结局

希望本文对开始使用Swift开发并使用SpriteKit的人有所帮助。 如果您是Swift开发人员,但我错过了某些内容或对解释有误,肯定会让我知道👍