2016-12-19 1 views
4

내 SpriteKit 게임을보다 체계적이고 명확하게 설정하고 싶기 때문에 각 유형의 스프라이트 노드에 클래스를 사용하기로했습니다. 내 경우사용자 정의 SKSpriteNode 클래스에 물리학 적용

은 내가 올바르게 장면 Editor's 사용자 정의 클래스 관리자에서 Sprite 노드를 참조하고 내가 어떤없이 클래스 메소드를 실행할 수있는이

import SpriteKit 

class Player: SKSpriteNode { 

func initializePlayer() {   
    self.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: self.size.width, height: self.size.height)) 
    self.physicsBody?.affectedByGravity = true 
} 


func moveLeft() { 
    print("left") 
} 

func moveRight() { 
    print("right") 
} 
} 

처럼 보이는 빠른에 별도의 플레이어 클래스를 생성 문제 - 이것은 잘 작동합니다.

내가 이렇게 내 GameScene에서 플레이어의 클래스를 참조 :

class GameplayScene: SKScene { 
var player: Player = Player() 
let myNode = SKSpriteNode(imageNamed: "player") 
override func didMove(to view: SKView) {  
    player.initializePlayer()   
} 
} 

그러나 물리학 본문이 적용되지 않으며,이 경우 이유를 알아낼 수 없습니다.

물리 본문을 스프라이트 노드에 추가 한 후 노드가 화면에서 떨어질 것으로 예상됩니다. 하지만 이런 일은 일어나지 않고 왜 그럴 수 없는지 알 수 없습니다.

수업 내에서 물리 물리학을 적용 할 수있는 사람이 있습니까?

+0

물리 체체가 무엇을 의미합니까? 적용되지 않았습니까? – Mina

+0

물리 본문을 스프라이트 노드에 추가 한 후에는 노드가 화면에서 떨어질 것으로 예상됩니다. 하지만 이런 일은 일어나지 않고 왜 그럴 수 없는지 알 수 없습니다. – boehmatron

+0

게시 된 코드에서 물리 바디를 본문에 추가 한 것을 볼 수 없습니다. 자세한 내용을 게시하고 코드를 게시하십시오. – Mina

답변

2

나는 initializePlayer보다 다른 이름으로 구현하는 코드와 더 관련이 뭔가를 당신의 함수를 호출 할 수

if let node = self.childNode(withName:"//mySpriteNodeName") as? Player { 
      // Set up your sprite here 
      node.setPhysics() 
} 

ps : //도 추가했습니다. 루트 노드에서 검색을 시작하고 전체 노드 트리에서 반복적으로 검색을 수행하도록 지정합니다. 그렇지 않으면 현재 위치에서 재귀 적 검색을 수행합니다.

+0

지원해 주셔서 감사합니다. 귀하의 접근 방식을 시도했지만 여전히 필요한 초기화 메소드에서 동일한 오류가 발생합니다. @Mina가 다시 제공하는 솔루션 나를 이해하지 못했고 나는이 문제를 해결하는 방법을 모른다. 네가 다른 모습을 가질 수 있다고 생각하니? – boehmatron

+0

Mina 코드의 첫 번째 부분에서 Player 클래스를 SKSpriteNode 하위 클래스로 빌드하는 방법을 설명하지만 init 메서드를 재정의하거나 다른 사용자 지정 함수를 빌드하지 않도록 결정하여 원본 init 함수를 그대로 둡니다. –

1

문제는 초기화 기능으로 만들어진 SKSpriteNode에서 플레이어 노드를 초기화하지 않았기 때문입니다. 대신

init() { 
    let texture = SKTexture(imageNamed: "Spaceship") 
    super.init(texture: texture, color: UIColor.blue, size: texture.size()) 
    self.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: self.size.width, height: self.size.height)) 
    self.physicsBody?.affectedByGravity = true 
} 

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

:

func initializePlayer() {   
    self.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: self.size.width, height: self.size.height)) 
    self.physicsBody?.affectedByGravity = true 
} 

이 문제를 해결하고 올바르게 물리학 몸을 적용합니다

다음 코드를 사용합니다. 당신은 화면 편집기에서 스프라이트를 검색 할 경우 사용할 수있는 후

func setPhysics() {   
    self.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: self.size.width, height: self.size.height)) 
    self.physicsBody?.affectedByGravity = true 
} 

, :

+1

내 경우에는 작동하지 않습니다. 컴파일러가 오류를 발생시킵니다. "치명적인 오류 : init (coder :)가 구현되지 않았습니다. file/Player.swift 더 이상 인스턴스를 시작할 때 텍스처를 지정하지 않아도됩니다. 텍스처를 SceneEditor 내에서 가져 오십시오. – boehmatron

+0

테스트 해봤는데 오류가 있어서는 안됩니다.하지만이 [thread] (http://stackoverflow.com/a/24036440/1724845)를 사용하여 오류를 해결할 수 있습니다 – Mina

+0

@ Mina 코드가 맞지만 initWIthCoder :가 호출되어 OP에 해당 오류가 발생했습니다 .SSKS 파일에서 Player를로드하기 때문에 발생하는 문제입니다 – Whirlwind

관련 문제