2017-11-08 10 views
0

SpriteKit으로 게임을 만들고 Xcode의 장면 편집기를 사용하여 GameScene을 설정하고 있습니다.SKSpriteNode 사용자 정의 하위 클래스의 이니셜 라이저에 물리 물리 체를 설정하면 작동하지 않습니다.

씬에 Player이 포함되어 있는데,이 장면을 Color Sprite로 드래그하여 Custom Class 필드에 mygame.Player으로 채 웁니다.

Player이라는 SKSpriteNode의 사용자 지정 하위 클래스가 있는데이 클래스에서 응용 프로그램이 호출하는 이니셜 라이저에 물리 속성을 설정합니다. 내 GameScene.swift 파일에서

class Player: SKSpriteNode { 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     print(self) 
     self.physicsBody = SKPhysicsBody(rectangleOf: self.size) 
     self.physicsBody?.restitution = 0 
     self.physicsBody?.isDynamic = true 
     self.physicsBody?.affectedByGravity = true 
     self.physicsBody?.velocity = CGVector(dx: 50, dy: 0) 
     print(self.physicsBody) 
    } 

} 

, 나는 플레이어를 참조 할 수, 그래서이 연결 작동합니다.

override func didMove(to view: SKView) { 
    player = childNode(withName: "player") as! Player 
    print(player) 
    print(player.physicsBody) 
} 

실제로 플레이어와 물리학 자 본문을 완벽하게 인쇄합니다.

<SKSpriteNode> name:'player' texture:['nil'] position:{0, 0} scale:{1.00, 1.00} size:{100, 100} anchor:{0.5, 0.5} rotation:0.00 
Optional(<SKPhysicsBody> type:<Rectangle> representedObject:[<SKSpriteNode> name:'player' texture:['nil'] position:{0, 0} scale:{1.00, 1.00} size:{100, 100} anchor:{0.5, 0.5} rotation:0.00]) 

그러나 플레이어는 중력을 갖도록 장면을 설정했지만 장면 위로 이동하지 않습니다! 실제로 이동하는 플레이어를 얻기 위하여, 나는 다시 PhysicsBody을 설정 GameScene의 : 함수에 didMove (에 코드의 또 다른 라인을 추가해야합니다

player.physicsBody = SKPhysicsBody(rectangleOf: player.size) 

여기 무슨 일이야? 왜 이니셜 라이저에서 내 플레이어의 물리 구조체를 설정하지 않습니까?

답변

1

physicsworld가 존재하기 전에 physicsbody가 만들어지면 제대로 설정되지 않은 버그가 있기 때문에.

임시 해결책으로 시도 :

class Player: SKSpriteNode { 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     print(self) 
     DispatchQueue.main.asyncAfter(deadline: .now() + 1) 
     { 
      self.physicsBody = SKPhysicsBody(rectangleOf: self.size) 
      self.physicsBody?.restitution = 0 
      self.physicsBody?.isDynamic = true 
      self.physicsBody?.affectedByGravity = true 
      self.physicsBody?.velocity = CGVector(dx: 50, dy: 0) 
      print(self.physicsBody) 
     } 
    } 

} 

세계가 존재 후까지 몸을 만들 지연.

세계 정상이 끝나면 몸을 만드는보다 우아한 방법을 찾아야합니다.

+0

맞습니다. SpriteKit에는이 버그가 있습니다. 네가 나에 대해 말해 줘서 고마워! – thecanteen