[MMF2]相同複數物件的寫法

  終於作完專題壁報了,花了好久的時間呢~不過以後的"空閒時間"大部分都會變成要待在實驗室中,能在這邊打廢話的機會變得更少了,看來小弟已經開始三室(寢室、教室、實驗室)的生活啦。唉,果然還是大學生活比較多空閒時間啊....= =a




壁報的冰山一角圖



  趁週末的空閒時間,繼續把之前還沒打完的MMF2心得系列寫完。小弟在上一篇有提到,如果每種Active物件都只有一個時,便可以不用擔心事件判斷錯誤,但只要其中一種Active物件出現兩個以上,就有可能判斷錯物件。因為Active物件常會需要用到,這可以算是用MMF2作程式最大的問題



  這問題原本一直困擾著小弟。以小弟之前所做的遊戲為例,假設數個相同的Active物件(此處指敵人)有不同的狀況(有些在空中,有些站著,有些剛落地),那麼MMF在事件判定上常常就會發生錯誤,因為MMF會把要作用的Active物件群搞錯(假設敵人A1、A2經過同事件判定成功後分別受到自己的變數影響,例如經過同事件A1得到100元,A2得到1000元,結果往往會是兩個人都得到100元,只受到其中一者的變數影響),有時甚至會因為多個條件判斷錯誤而波及到其他Active物件(敵人A3無緣無故得到100元),這也是我們所不想看到的結果。










  要解決這個問題,只要把多重判定跟先前所提到的迴圈結合起來就可以了。不過用這個方法需要用兩個Alt. Flag或是一個Alt. Value,所以只適用有Alt. Flag或Alt. Value的物件(像Counter物件或String物件就不適用)。在此說明有多個物件A(這邊跟其他複數物件B沒有關連)的寫法,用最近作的「凱特衝浪去」中許多星星以不同的速度閃爍為例,每個星星都有個別的閃爍頻率(ShinePeriod),並在每幅為每個星星的ShinePhase加一,當星星自身的ShinePhase與ShinePeriod相同時,就會把ShinePhase設定為-1,並且閃一下(最下面的兩個事件,調透明度大小)。如果用一般寫法,程式就會常常搞錯要把ShinePhase設為為-1的星星,最後就會發現許多星星會一起亮一起暗。







  從事件表可以看出有雙迴圈(黃)跟一個星星物件的Alt. Value(綠),第一個迴圈St1會把所有星星都跑一次(因此會跑"星星個數"次),接著從變數LpNm為0的星星中挑一個出來(Pick one of 物件)並把被挑出的星星的變數LpNm設為1,接著跑第二個迴圈St2。第二個迴圈會先找出變數LpNm為1的星星,因為只有一個(剛剛挑出來的星星),只要符合緊接著的判斷(ShinePhase≧ShinePeriod),便能將這僅有星星的ShinePhase設定為-1而不影響到其他的星星,接著在第二個迴圈的最後將變數LpNm設為2,表示這顆星星已經判定完畢,之後迴圈內的判定就跟這星星無關了。等到每個星星都判定完離開迴圈後,別忘了把所有星星的變數LpNm都設為0,到下個畫幅時才能繼續判定。







  同樣的例子,但是改用兩個Alt. Flag來作,也是一樣的道理。因為Alt. Value比Alt. Flag常用,小弟通常都用Alt. Flag來作避免浪費。





  同理,要作多個物件A跟多個物件B之間的事件判定,甚至是三種複數物件之間的判定,都可以用這種方法。因為以前作的遊戲都沒用到多組複數物件的判定,小弟作了個簡單的示範程式,「球球大戰」,以及其原始檔。載點如下:








  示範大致的內容是,有許多彈來彈去的藍球、橘球,他們一開始會有相同的球數,每個球有四命,當其中一個藍球、橘球的X值或Y值相近(±2像素)時,兩者就會攻擊相消一命,到四命都沒有時,球就會消失。所以說,如果複數物件間的事件運作正確,到最後兩種球就會完全相消,反之則其中一種可能會留下來。







  根據前面只有一種複數物件的寫法(二迴圈),我們可得知這個球球大戰要有四迴圈來判定兩種球之間的關係,其事件表以及示意圖如下。大體而言,外面的二迴圈(A1、A2)是選擇其中一個藍球,裡面的二迴圈則是(B1、B2)選擇其中一個橘球,並且在最裡面的迴圈B2作藍橘球X/Y相同的判定與動作。由於我們是先選其中一個藍球跟其他橘球比較,因此在比較完後要讓被比較完的橘球"歸零"(便回原本還沒比較的數值),才能繼續給下個藍球比較。另外要注意的是,在藍橘球比較XY值時,因為用Compare two general value來比較兩數值(藍橘球的XY值)MMF並不知道是哪個藍球跟哪個橘球要比較,因此在這邊要多加Pick one of 藍/橘球,否則迴圈就白作了。







  以此類推,三種複數物件就要三個迴圈來判定(這邊附註一下,小弟剛剛發現,以上的兩個迴圈其實可以合併為一個 囧).....雖然有點麻煩,不過至少不是沒有方法可以解決(花了小弟很長一段時間才找到方法解決呢= =b)。希望這些MMF2的心得能夠給對MMF2有興趣或是正在使用的朋友一些幫助~



  至於心得系列......也許想到什麼有趣的東西時會繼續寫<( ̄︶ ̄)>

1 則留言:

﹨( ̄︺ ̄) ∕ 提到...

嘿嘿嘿


版主回覆:(12/13/2008 04:07:54 AM)

呵...呵呵呵 O_O|||

張貼留言