我的程序中的數據模型有許多離散狀態,但我想爲這些狀態之間的轉換設置動畫。當動畫正在進行時,用戶在屏幕上看到的內容與底層數據的內容是斷開的。一旦動畫完成,他們再次匹配。當模型離散時如何處理中間狀態的動畫
例如,我們假設我們有一個簡單的遊戲,在2D網格上拖動兔子跳躍。 Snuffles模型包含整數x/y座標。當玩家告訴Snuffles向北跳,他的y座標立即減1。然而,在屏幕上,那個時候的鼻les仍然應該在他的舊位置。然後,一幀一幀地緩緩進入他的新位置,直到他顯示在他的模型所在的位置。
通常,當我們畫鼻菸時,我們可以在他的模型中查找他的座標。但是當他跳躍時,那個座標是錯誤的。
如果屏幕上只有一件東西在移動,我可以放棄凍結整個遊戲狀態,並且不允許用戶在Snuffles完成跳轉之前做任何事情。但是如果屏幕上有多個兔子呢?
如果元素進行交互,合併或拆分,情況會變得更糟。如果Snuffles神奇地與一頂帽子合併成馬鈴薯,那麼數據模型會刪除兔子和帽子,然後添加馬鈴薯?如果立即這樣做,該視圖立即失去了獲取關於鼻菸和馬鈴薯的信息,它仍然需要繪製神奇合併的動畫。
我在實現動畫GUI(特別是遊戲)時遇到過多次這個問題,並且找不到滿意的解決方案。
不滿意的措施包括:
立即做的修改,但隨後暫停模型中的任何進一步的修改,直到動畫已經解決。使事情無法響應,並且如果不止一件事情可以移動或事物以複雜的方式相互作用,則無法正常工作。
合併模型和視圖 - 鼻音獲得浮點座標,可能還有一個z座標來表示他有多遠。模型的規則因此變得越來越複雜,因爲模型不再能夠做出簡潔的陳述,例如「如果在(x,y - 1)處有牆,你不能跳北」。對規則的任何更改需要更長的時間,並且開發速度會變慢。
保持相當於視圖中數據的副本。 SnufflesModel具有整數座標,但SnufflesSprite具有浮點座標。最終複製視圖中的一些模型規則並使其保持同步。花費大量時間進行調試,以確保SnufflesModel和SnufflesSprite在某些罕見情況下不會失步。
我現在最好的選擇是選項3,但它幾乎沒有讓我覺得優雅。思考?