【问题标题】:Is there a simple way to store two objects of different type in a container?有没有一种简单的方法可以在容器中存储两个不同类型的对象?
【发布时间】:2016-10-20 03:57:26
【问题描述】:

我正在尝试将 SKCameraNode 放置在场景中多个对象的中心。我正在考虑将所有感兴趣的对象放入某种容器中,然后每次更新()计算质心。我有两个类,Ball 和 Car,它们继承自 PhysicalObject,而 PhysicalObject 继承自 SKSpriteNode。我想做的是类似

var cameraObjects: Array<Ball, Car>!
...
var ball1 = Ball()
var car1 = Car()
cameraObjects.append(ball1)
cameraObjects.append(car1)
...
// Loop through objects and calculate centroid

但这会在第一次 append() 时崩溃。

请注意,我不想为每个类创建一个虚拟协议,如 here 所述。有没有简单的方法来做到这一点?

PhysicalObject.swift

import SpriteKit

class PhysicalObject: SKSpriteNode {

    var objectMass: CGFloat!

    override init(texture: SKTexture!, color: UIColor, size: CGSize) {
        super.init(texture: texture, color: color, size: size)
        self.name = "physicalObject"

        //Physics setup
        physicsBody?.usesPreciseCollisionDetection = true
        physicsBody?.affectedByGravity = true

    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

球.swift

import SpriteKit

class Ball: PhysicalObject {

    let MAXBALLSPEED :CGFloat = 0.08

    init(spawnPosition: CGPoint) {

        /* Temporary initialization.. will have further customization for different classes */
        let ballTexture = SKTexture(imageNamed: "ball")
        let ballRadius = CGFloat(50)
        let ballSize = CGSize(width: ballRadius, height: ballRadius)

        super.init(texture: ballTexture, color: UIColor.clear, size: ballSize)

        self.position = spawnPosition

        self.name = "ball"

        //Physics Setup
        //self.physicsBody = SKPhysicsBody(edgeLoopFromRect: CGRect(origin: spawnPosition, size: carSize) )
        self.physicsBody = SKPhysicsBody(circleOfRadius: self.size.height/2)
        self.objectMass = CGFloat(0.005)
        physicsBody?.isDynamic = true // Default is true
        physicsBody?.restitution = 1.0


        self.physicsBody?.categoryBitMask = PhysicsCategory.Ball
        self.physicsBody?.contactTestBitMask = PhysicsCategory.Boards | PhysicsCategory.Car


    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

汽车.swift

import SpriteKit

class Car: PhysicalObject {

    let MAXCARSPEED: CGFloat = 500
    var steering: Bool
    var diagonalLength: CGFloat

    init(spawnPosition: CGPoint) {

        /* Temporary initialization.. will have further customization for different classes of cars */
        let carTexture = SKTexture(imageNamed: "BasicCar")
        let carWidth = CGFloat(screenSize.width/20)
        let carScale = CGFloat(183.0/140.0)
        let carSize = CGSize(width: (carWidth*carScale), height: carWidth)

        // Initialize movement variables
        self.steering = false
        self.diagonalLength = hypot(carSize.width, carSize.height)

        //self.steerRight = false
        //self.steerLeft = false

        super.init(texture: carTexture, color: UIColor.clear, size: carSize)


        self.speed = CGFloat(MAXCARSPEED)
        self.position = spawnPosition
        self.name = "car"

        //Physics Setup
        //self.physicsBody = SKPhysicsBody(edgeLoopFromRect: CGRect(origin: spawnPosition, size: carSize) )
        let carPhysicsSize = CGSize(width: self.size.width, height: self.size.height)
        self.physicsBody = SKPhysicsBody(rectangleOf: carPhysicsSize)
        self.objectMass = CGFloat(2000)
        self.physicsBody?.friction = 0.5
        self.physicsBody?.angularDamping = 1.0
        self.physicsBody?.linearDamping = 1.0
        self.physicsBody?.restitution = 1.0
        physicsBody?.isDynamic = true // Default is true


        self.physicsBody?.categoryBitMask = PhysicsCategory.Car
        self.physicsBody?.contactTestBitMask = PhysicsCategory.Car | PhysicsCategory.Ball


    }


    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

【问题讨论】:

  • 为什么不[PhysicalObject]?没有必要使用虚拟协议,因为它们已经共享一个公共基类
  • 您设置该阵列的方式很奇怪。它初始化为 nil 你设置它的方式,这解释了你的崩溃,因为你试图追加到 nil。
  • Array 甚至不应该编译...你是重写数组类还是什么?
  • 哦,好吧。是的,我之前尝试过 Array ,但它也崩溃了。至少我现在知道为什么感谢@NSGangster。
  • @PEEJWEEJ 抱歉,那是非常逼真的伪代码。

标签: swift sprite-kit


【解决方案1】:

您可以创建一个Array&lt;PhysicalObject&gt;(又名[PhysicalObject]),它可以存储Ball 对象和Car 对象。

【讨论】:

    【解决方案2】:

    您可能会发现SKNodeenumerateChildNodes 方法是枚举具有特定名称的所有对象的更好方法。这样,您就不需要自己管理阵列了。

    看看Apple's documentation

    【讨论】:

    • 我一定会用这个。我不知道你可以使用正则表达式来查找节点!
    【解决方案3】:

    你需要做的就是将所有你想要与相机相关的物体放入一个新的父SKNode中,并使用calculateAccumulatedFrame来获取所有节点周围的框架,然后只需使用父框架的中心即可。

    【讨论】:

    • 啊,另一个有用的信息。我会用这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多