2016-10-20 2 views
-1

내 장면의 여러 객체 가운데에 SKCameraNode를 배치하려고합니다. 관심있는 모든 객체를 일종의 컨테이너에 배치 한 다음 매 업데이트마다 중심을 계산할 생각입니다. 나는 SKObjectNode로부터 상속받은 PhysicalObject를 상속 한 두 클래스 인 Ball과 Car를 가지고 있습니다. 내가 뭘하고 싶은데요다른 유형의 두 객체를 컨테이너에 저장하는 간단한 방법이 있습니까?

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") 
    } 

} 

Ball.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") 
    } 
} 

Car.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") 
    } 
} 
+0

왜 [[PhysicalObject]]가 아닌가요? 그들은 이미 공통 기본 클래스를 공유하기 때문에 더미 프로토콜을 가지고 아무 의미가 없습니다 –

+0

그 배열을 설정 방법은 괴짜입니다. 그리고 그것은 여러분이 여러분의 충돌을 설명하는 방식을 설정하지 않도록 초기화합니다. 왜냐하면 여러분이 무효에 추가하려고하기 때문입니다. – NSGangster

+0

배열 도 컴파일해서는 안됩니다 ... 배열 클래스 또는 다른 것을 무시하고 있습니까? – PeejWeej

답변

1

당신은이 Array<PhysicalObject> (일명 [PhysicalObject]), 모두 Ball 객체를 저장할 수있는 수 , 및 Car 개체가 있습니다.

1

enumerateChildNodes 메서드가 SKNode 인 경우 특정 이름을 가진 모든 개체를 열거하는 더 좋은 방법입니다. 그렇게하면 배열을 직접 관리 할 필요가 없습니다.

Apple's documentation을 살펴보십시오.

+0

확실히 사용하겠습니다. 노드를 찾기 위해 정규 표현식을 사용할 수 있는지 몰랐습니다. – Ralph

1

카메라와 관련된 모든 객체를 새로운 부모 SKNode에 배치하고 calculateAccumulatedFrame을 사용하여 모든 노드 주위에서 프레임을 얻은 다음 부모 프레임의 중심을 사용하기 만하면됩니다.

+0

또 다른 유용한 정보. 나는 이것을 사용할 것이다. – Ralph

관련 문제