2017-03-19 24 views
0

好吧,我正在Swift 3遊樂場工作,只有當用戶的鼠標關閉時才需要將Sprite節點移動到某個點,並在發佈時停止。到目前爲止,我有:Swift 3 - 如何在布爾值爲真時移動精靈節點?

override func mouseDown(with event: NSEvent) { 
    mouseIsDown = true 
} 

override func mouseDragged(with event: NSEvent) {  
} 

override func mouseUp(with event: NSEvent) { 
    mouseIsDown = false 
} 

func moveGuy() { 
    let action = SKAction.move(to: CGPoint(x: size.width/2,y: 200), duration: 2) 
    action.timingMode = .easeInEaseOut 
    guy.run(action) 
} 

//UPDATE 
override func update(_ currentTime: CFTimeInterval) { 
    if(mouseIsDown) 
    { 
     moveGuy() 
    } 
} 

這工作有點,但問題是隻有在我鬆開鼠標(mouseIsDown是假的),請問SKAction實際運行(順利)。我認爲這是因爲它被一次又一次地調用。

正常情況下,我會以小增量使用moveBy動作,但我需要我的節點移動到特定點。

如何讓我的節點只在鼠標關閉時才移動到某一點?

+1

在update中運行'SKAction'是一個錯誤的方法(一般來說),尤其是在你的情況下,action的持續時間爲2秒,update:每秒執行60次。它不是高性能的,(也沒有意義),因爲您一次又一次地重新創建SKAction對象,以便將一個精靈從點A移動到點B.您需要並且應該爲此創建一個SKAction對象......就像下面@ nateslager的回答中所述。 – Whirlwind

+0

當然,如果你正在執行像[導彈導彈](http://stackoverflow.com/a/36235426/3402095)的東西,你可能想要使用'update:'方法(不帶'SKActions')。如果您需要使節點從點A移動到點B,則操作更加方便。不過,關鍵是,不要將行爲置於'update:'方法中(以每幀的形式創建操作對象)。如果你仍然陷入困境,試着描述一切(例如,你的目標是否改變了它的位置,或者它是靜態的)並讓我知道...... – Whirlwind

回答

0

當你調用

guy.run(action) 

精靈套件將運行在這個傢伙的動作,直到完成。你是對的,moveGuy()被一次又一次地調用(每次幀更新時,即每假設30fps〜33ms)。

嘗試在mouseDown()中放置moveGuy()。只要你點擊,這個傢伙就會順利地移動到他的目的地,但是如果你停止點擊,他不會停下來。你需要以某種方式停止行動。你可以做的是更換

guy.run(action) 

guy.run(action, withKey: "moveGuy") 

這將鑰匙與操作相關聯,你可以看看後來在mouseUp事件():

guy.removeAction(forKey: "moveGuy") 

後這個,只有當你的鼠標關閉時,你的節點纔會移動到一個點。但正如你所指出的那樣,如果你重新點擊,節點的移動依然不規則。嘗試更改.easeInEaseOut.linear。這個動作將是一致的,儘管在開始/停止時是突然的。

我強烈建議閱讀documentation on SKActions以更好地瞭解如何使用它們。

+0

謝謝!唯一的問題是由於持續時間的原因,如果你在鼠標移動到目的地之後開始動作,則他的移動速度會逐漸變慢。我如何保持速度不變? – skyguy