所以,就像我的SKSpriteNode
一样,我正在尝试创建一个函数来使我成为一个默认的物理体。
这是我创建的DefaultBody.swift
:
import Foundation
import SpriteKit
enum Type {
case rectangle
case circle
}
// Create new default physics body
func createPhysicsBodySprite(for body: inout SKSpriteNode, type: Type) {
// Create new physics body
switch type {
case .rectangle:
body.physicsBody = SKPhysicsBody(edgeLoopFrom: body.frame)
case .circle:
body.physicsBody = SKPhysicsBody(circleOfRadius: body.frame.width / 2)
}
body.physicsBody?.isDynamic = false
body.physicsBody?.allowsRotation = false
body.physicsBody?.pinned = false
body.physicsBody?.affectedByGravity = false
body.physicsBody?.friction = 0
body.physicsBody?.restitution = 0
body.physicsBody?.linearDamping = 0
body.physicsBody?.angularDamping = 0
}
func createPhysicsBodyShape(for body: inout SKShapeNode, type: Type) {
// Create new physics body
switch type {
case .rectangle:
body.physicsBody = SKPhysicsBody(edgeLoopFrom: body.frame)
case .circle:
body.physicsBody = SKPhysicsBody(circleOfRadius: body.frame.width / 2)
}
body.physicsBody?.isDynamic = false
body.physicsBody?.allowsRotation = false
body.physicsBody?.pinned = false
body.physicsBody?.affectedByGravity = false
body.physicsBody?.friction = 0
body.physicsBody?.restitution = 0
body.physicsBody?.linearDamping = 0
body.physicsBody?.angularDamping = 0
}
在这里,我可以轻松调用Sprite版本:
但是,虽然我可以使用SKSpriteNode
执行此操作,但我的SKShapeNode
函数不起作用,因为我收到此错误:
这不起作用,所以如果我摆脱了函数中的inout
并将其添加为返回,它现在可以正常工作(使用上图中注释掉的调用)
这有什么理由,我如何使用inout
而不是返回SKShapeNode
?
注意: PhysicsBody
可设置为SKShapeNode
这两个都是var
而不是let
,因此 应该是可变的:
答案 0 :(得分:1)
首先,要传递inout参数,您必须添加&
:
createPhyscisBodyShape(for: &topBar, type: .rectangle)
您使用&ball
执行此操作。我想知道你为什么第二次忘记了&
。
无论如何,你首先不需要inout
。 SKSpriteNode
和SKShapeNode
是类。这意味着只要您没有使用赋值语句将body
设置为其他内容,您对body
所做的更改就会反映在您传递的参数中。
删除inout,它应该可以正常工作。
答案 1 :(得分:0)
将值传递给inout
参数的函数,我们应该使用&
createPhyscisBodyShape(用于:&topBar,键入:.rectangle)
使用此链接https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID545
检查