8

我的程序中的數據模型有許多離散狀態,但我想爲這些狀態之間的轉換設置動畫。當動畫正在進行時,用戶在屏幕上看到的內容與底層數據的內容是斷開的。一旦動畫完成,他們再次匹配。當模型離散時如何處理中間狀態的動畫

例如,我們假設我們有一個簡單的遊戲,在2D網格上拖動兔子跳躍。 Snuffles模型包含整數x/y座標。當玩家告訴Snuffles向北跳,他的y座標立即減1。然而,在屏幕上,那個時候的鼻les仍然應該在他的舊位置。然後,一幀一幀地緩緩進入他的新位置,直到他顯示在他的模型所在的位置。

通常,當我們畫鼻菸時,我們可以在他的模型中查找他的座標。但是當他跳躍時,那個座標是錯誤的。

如果屏幕上只有一件東西在移動,我可以放棄凍結整個遊戲狀態,並且不允許用戶在Snuffles完成跳轉之前做任何事情。但是如果屏幕上有多個兔子呢?

如果元素進行交互,合併或拆分,情況會變得更糟。如果Snuffles神奇地與一頂帽子合併成馬鈴薯,那麼數據模型會刪除兔子和帽子,然後添加馬鈴薯?如果立即這樣做,該視圖立即失去了獲取關於鼻菸和馬鈴薯的信息,它仍然需要繪製神奇合併的動畫。

我在實現動畫GUI(特別是遊戲)時遇到過多次這個問題,並且找不到滿意的解決方案。

不滿意的措施包括:

  • 立即做的修改,但隨後暫停模型中的任何進一步的修改,直到動畫已經解決。使事情無法響應,並且如果不止一件事情可以移動或事物以複雜的方式相互作用,則無法正常工作。

  • 合併模型和視圖 - 鼻音獲得浮點座標,可能還有一個z座標來表示他有多遠。模型的規則因此變得越來越複雜,因爲模型不再能夠做出簡潔的陳述,例如「如果在(x,y - 1)處有牆,你不能跳北」。對規則的任何更改需要更長的時間,並且開發速度會變慢。

  • 保持相當於視圖中數據的副本。 SnufflesModel具有整數座標,但SnufflesSprite具有浮點座標。最終複製視圖中的一些模型規則並使其保持同步。花費大量時間進行調試,以確保SnufflesModel和SnufflesSprite在某些罕見情況下不會失步。

我現在最好的選擇是選項3,但它幾乎沒有讓我覺得優雅。思考?

回答

7

您將需要一個更強有力的模型來解釋變化的時間部分:

  1. 每個精靈需要保持它應該進行動畫動作的隊列。將動畫添加到隊列應該是一個零時間操作(遊戲時間)。當排隊的動畫從動畫時鐘獲得勾號時,逐幀進行。排隊使您可以將模型從圖形子系統和動畫中分離出來。

  2. 當動畫完成時,隊列中的每個動畫都攜帶一個模型動作。一些語言使得這更容易,例如在C#或JavaScript中使用匿名函數。在其他語言中,您可以使用回調。模型動作可讓您指定動畫完成時模型的變化方式。

  3. 精靈可以攜帶高分辨率座標(例如浮點),而該模型與保持整數的。精靈不需要知道關於遊戲規則的任何信息 - 排隊的動畫完成模型 - 行動處理這些。

  4. 模型實體應該能夠解釋過渡狀態:出現,消失和移動。這可以避免檢查轉換中對象的規則。

要實現鼻塞的任務,然後你可以:

  • 用戶要求移動鼻塞北? - (1)檢查該規則允許移動,(2)對鼻塞的子畫面,加上一個着陸模型動作排隊一個移動動畫。將兔子的模型置於過渡移動狀態。

  • 鼻塞的登陸模型行動帶來了兔子的模式回到正常狀態,並檢查着陸點和規則。找到一頂帽子,它會爲馬鈴薯外觀動畫(「合併」)排隊,併爲兔子和帽子排列兩個失蹤動畫。

  • 消失動畫的模型動作在完成時刪除兔子和帽子。

相關問題