因此,就像我的 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
,因此应该是可变的:
最佳答案
首先,要传递一个inout参数,你必须添加&
:
createPhyscisBodyShape(for: &topBar, type: .rectangle)
你用 &ball
做到了这一点。我想知道你为什么第二次忘记了 &
。
无论如何,您首先不需要inout
。 SKSpriteNode
和 SKShapeNode
是类。这意味着只要您不使用赋值语句将 body
设置为其他内容,您对 body
所做的更改将反射(reflect)在您传递的参数中。
移除 inout,它应该可以正常工作。
关于ios - 不能在 inout 函数中使用 SKShapeNode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50105732/