2011-07-08 102 views
2

目前,我正在用純UIKit構建遊戲。這是一個角色捕捉墜落物品的遊戲。所有物體都沿着三點軌跡運動:每個物體出現在A點,然後移動到B點,然後落到C點。對我來說,重要的只有一個時刻 - B點的物品。我需要檢查,該角色是否抓住了B點的物品。目前,我在主遊戲控制器中有一個定時器,它不斷髮布通知。遊戲物品是觀察者,他們傾聽該通知並重新定位自己(他們自己移動)。現在,通過這個計時器,每個物品都從A點移動到B點。當它位於B點時,物品方法會檢查,角色是否抓住了他。如果沒有,那麼我正在執行從點B到點C的持續時間的UIView動畫。UIKit遊戲:遊戲對象移動動畫中的中間回調

我在想整個運動可能是動畫的,可能是Core Animation CAKeyframeAnimation類或者是smth。唯一的問題是,我不知道如何觸發回調來檢查動畫中間的抓點 - 在B點。有人說這是不可能的here,如果我有整個動畫,我需要得到當前項目的位置,那麼我需要一個定時器,定期從presentationLayer中拉取/讀取模型數據。但我不確定這種方法,因爲現在,我不存儲指針來屏幕我的主遊戲控制器中的項目 - 遊戲控制器只創建一個項目,遊戲定時器向這些對象發佈通知。但爲了實施提議的解決方案,我需要有這樣的一個。另外,我應該從整個屏幕項目中閱讀presentationLayer。

另一種選擇是將一個動畫分成兩個動畫:首先,從A動畫到B,然後觸發完成回調以檢查捕捉。然後,執行從B到C的另一個動畫。

夥計們,你對此有何看法,也許你有另外一個建議?

回答

0

我認爲你需要把它分成兩個動畫。這是正確的,您只有animationDidStartanimationDidStop代表方法CAAnimation。 使用NSTimer的方法可能會有問題。 presentationLayer值將在主線程中更新。我的猜測是檢查計時器運行的不同線程上的presentationLayer值可能會給出錯誤的值。

你可以通過使用performSelectorOnMainThread來解決這個問題。然後,這個問題將是該方法調用的可靠調度。也就是說,當你調用performSelectorOnMainThread時,在方便的時候由運行時決定執行。

爲了記錄,我還在純UIKit中編寫遊戲。最令人頭疼的並不是正常遊戲中的動畫。相反,它會在暫停遊戲,接受電話,移動到背景等中斷時停止並恢復它們。特別是在遊戲在後臺時從內存中清除。

我在回答寫了一些關於這個這個問題:

Restoring animation where it left off when app resumes from background

因此,對於接下來的比賽,我將不得不仔細看cocos2d看到它所提供在這方面。

+1

感謝分享信息。我無法找到比寫有問題的解決方案更好的解決方案,只是完成併成功將遊戲上傳到應用商店。就像暫停遊戲一樣,我也有暫停的頭痛:如果用戶暫停遊戲並且有物品已經從B到C(它們用UIView animateWithDuration動畫),那麼我仍然讓他們完成他們的動畫,甚至一位用戶暫停了一場比賽,儘管我用50%不透明黑色面具淡化了所有遊戲畫面。 – Centurion