Не могу использовать SKShapeNode в функции inout - PullRequest
0 голосов
/ 30 апреля 2018

Итак, как и мои SKSpriteNode s, я пытаюсь создать функцию, которая сделает меня физическим телом по умолчанию.

Вот мой 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:

enter image description here

Однако, хотя я могу сделать это с SKSpriteNode, моя функция SKShapeNode не работает, так как я получаю эту ошибку:

enter image description here

Это не работает, поэтому, если я избавлюсь от inout в функции и добавлю ее в качестве возврата, она теперь работает (с использованием вызова, закомментированного на изображении выше)

Есть ли какая-либо причина для этого, и как я могу использовать inout вместо возврата SKShapeNode?

Примечание: a PhysicsBody можно установить на SKShapeNode

Оба var, а не let, как показано здесь, и поэтому должен быть изменяемым:

enter image description here

1 Ответ

0 голосов
/ 30 апреля 2018

Сначала, чтобы передать параметр inout, вы должны добавить &:

createPhyscisBodyShape(for: &topBar, type: .rectangle)

Вы сделали это с &ball. Интересно, почему ты забыл & во второй раз.

Во всяком случае, вам не нужно inout во-первых. SKSpriteNode и SKShapeNode являются классами. Это означает, что до тех пор, пока вы не установите body для чего-то другого с помощью оператора присваивания, внесенные вами изменения в body будут отражены в переданном вами параметре.

Удалите вход и он должен работать нормально.

...