2012-06-23 65 views
0

我正在RPG Maker XP(用紅寶石製作)中製作一些動畫腳本,允許您顯示動態圖像。我的問題在這裏並不是嚴格意義上的RPG Maker,而是一般性的術語。這是我發現至今的代碼和它的工作原理,但有問題的:正確的OO 2D動畫邏輯

class Poser 
    attr_accessor :images 

    def initialize 
    @images = Sprite.new 
    @images.bitmap = RPG::Cache.picture('Character.png') #display picture 
    @images.x = 540 #place it on the bottom right corner of the screen 
    @images.y = 180 
    end 

    def move(x,y) 
    @images.x += x 
    @images.y += y 
    end 

    def animate(x,y,step,delay) #Animate moving the picture up and down with delay 
    forward = true 
    2.times { #the first loop, do code 2 times of : 
     step.times { 
     wait(delay) #wait x frame 
     if forward 
      move(x/step,y/step) #move the picture down 
     else 
      move(-x/step,-y/step) #move the picture up 
     end 
     } 
     wait(delay*3) 
     forward = false 
    } 
    end 

    def wait(time) 
    while time > 0 
     time -= 1 
     Graphics.update 
    end 
    end 
end 

然後我創建它的一個實例,並調用的方法:

$test = Poser.new 
$test.animate(0,10,10,10) 

上面的代碼做的是上下移動圖片(就像呼吸動畫,你的頭部上下襬動)

正如你所看到的,我使用循環函數來延遲移動圖片。我得到的是,我不能做別的什麼直到動畫完成。我所說的「其他」是指我的角色四處走動,與NPC交談,我想在背景中播放動畫時做這些事情。最後,遊戲在循環塊中「暫停」。

是否有另一種方法可以在沒有循環的情況下進行動畫製作,或者,在動畫完成之前不會「暫停」屏幕的任何動作?提前致謝。

回答

2

通常,遊戲使用稱爲遊戲循環的系統。遊戲循環是程序主要功能中的循環,其執行速度儘可能快。每次執行時,它都會執行兩個函數(或者這些函數可以是循環的主體,這是您可以設計的一個設計選項):drawupdateupdate,然後draw)。

update的工作是改變角色的位置,通常通過公式position=(x+pixelsPerSecond*secondsSinceLastTick,y+pixelsPerSecond*secondsSinceLastTick)(在遊戲術語中,刻度是遊戲循環的迭代)。遊戲循環系統針對遊戲進行了優化,因爲每個動畫可以執行每個動畫中的一小部分,並且足夠快,從而給出併發幻覺(遊戲循環每秒運行多次)。

update已經改變了整個對象的位置(例如,快速NPC現在向左5個像素),draw用於繪製場景。 draw可以做幾件事情。它可以在update指示的位置上繪製精靈,並且它還可以保持它自己的動畫(像行走動畫這樣的小動作 - update不應該在行走動畫中設置雙腿的位置,這個勾號的字符)。

我不確定我是否正在回答你的問題,因爲我對RPG Maker一無所知(所以也許你必須完全做一些其他的事情),但是因爲你一般說,這就是它。

+0

謝謝你的輸入,是的,該方法在遊戲主循環中調用。我在做的是在遊戲主循環中循環播放動畫,所以當然結果就是這樣。現在我要弄清楚如何讓這個對象與遊戲主循環「並行」運行。真的有可能有「多循環」嗎?就像多線程一樣,進程a轉到線程A,b轉到B,兩個線程都在主循環上運行? – AzDesign

+0

不,不。這不完全是。你必須打電話,幾乎是該方法的一小部分。每次遊戲循環被調用時,做一小部分動作。在某種程度上,只需將方法中的代碼放在循環中並將其放入遊戲循環中(通過更改,再次閱讀答案)。 – Linuxios

+0

工作時間在腳本上擺弄之後,我從你的答案中得到了建議,而不是在我自己的方法中定義自己的循環,而是在遊戲的主循環的Update方法中採用動畫行爲(move(x,y))搜索這個位置在哪裏)。它的工作原理現在我可以在動畫在後臺運行時移動。謝謝,這解決了我的問題 – AzDesign