2016-12-19 12 views
4

我想以更有序和更清晰的方式設置我的SpriteKit遊戲,所以我決定利用類來處理每種類型的Sprite節點。將物理應用到自定義SKSpriteNode類

在我來說,我迅速看起來像這樣

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

我在現場Editor's自定義類檢查正確引用這個雪碧節點,我可以觸發類的方法沒有任何創建一個獨立的播放器類問題 - 所以這個效果很好。

我引用Player類在我GameScene這樣的:

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

但物理身體不適用了,我想不通爲什麼是這樣的情況。

在我將物理體添加到sprite節點後,我期望節點落下屏幕。但是這不會發生,我不明白爲什麼。

有沒有人有線索我怎麼能從課堂上應用物理機構?

+0

你的意思是什麼_物理機構不適用_? – Mina

+0

在我將物理體添加到sprite節點後,我期望節點落下屏幕。但是這不會發生,我不明白爲什麼。 – boehmatron

+0

我無法在發佈的代碼中看到該代碼,您只需將自己的物理主體添加到自己。 更具體,並張貼更多的代碼。 – Mina

回答

2

我可以用其他名字稱呼你的函數比initializePlayer,一些更相關的是實現代碼:

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

之後,如果你想要從場景編輯器你的精靈,你可以使用:

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

PS:我也添加了//:這指定搜索應該從根節點開始,並在整個節點樹上遞歸執行。否則,它會從當前位置執行遞歸搜索。

+0

謝謝你的支持。我試過你的方法,但是仍然從所需的初始化方法中得到同樣的錯誤 @Mina re給我的感覺是我不明白的東西,我不知道如何解決這個問題。你認爲你可以再看一次嗎? – 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 
} 

它會解決你的問題並正確運用物理身體。

+1

這在我的情況下不起作用。編譯器會拋出一個錯誤:「致命錯誤:init(編碼器:)還沒有實現:file/Player.swift 此外,我不需要並且想要在啓動實例時指定紋理,而是要指定紋理從SceneEditor中。 – boehmatron

+0

我測試過了,它一定不會出錯,但是你可以使用這個[thread](http://stackoverflow.com/a/24036440/1724845)來解決錯誤 – Mina

+0

@ Mina你的代碼是正確的,但是由於initWIthCoder:被調用,所以OP會遇到這個錯誤,這是因爲他從.sks文件加載播放器 – Whirlwind

相關問題