2014年8月22日 星期五

gamesalad magnitude(向量絕對值)的用法


先說在前面,
本人對數學其實並不十分有興趣,
也並非技術背景出身的人員,
以下的內容,
對遊戲製作沒有興趣的人,看起來應該也會覺得很沉悶吧@@


這個magnitude(向量絕對值)一詞,
因為之前沒看過,是一個不懂的新字,
所以光看就覺得很威的樣子,
直到看到國外gs開發者的用法,
才知道是怎麼一回事,
封面圖是用google找到的一張能簡單說明的示意圖,
但是如果我沒看過以及用gs實做過,
我也不會有興趣去瞭解這不知道能幹嘛用只是看起來好像很厲害的專有名詞^^"

用上面的圖說解示,
就是由某一點(頭)到某一點(尾)間的距離取絕對值,
主要是在向量的世界裡取得距離用的。
(3D的世界裡我想應該也是一樣的原理)

那在遊戲製作中,
在gamesalad這套工具裡能用來做什麼呢?

原來可以拿來改變碰撞範圍的大小,
在gs中,
任何物件的hitbox(碰撞範圍)預設都是本身拖進場景中的方塊的大小,
gs號稱不需要"寫"程式?
但是如果你只用內建不更動程式的方式的預設工具去製作,
是沒辦法做到改變hitbox(碰撞範圍)的,
視覺化編輯器中的actor看到的方塊就一定得是碰撞範圍。

如果要做一些進階的變化,
我這邊立刻聯想到的例子是彈幕射擊遊戲,
比如cave社的怒首領蜂系列,
飛機的可視圖像內含極小的自身碰撞判定,
所以可以做出即使被子彈擊中機身圖像,
除非被打中中心點那極小的hitbox(碰撞範圍),否則不會被擊落的效果,
就一定要使用magnitude(向量絕對值)去自訂hitbox(碰撞範圍)。


用實際在gs中製作的情形來說明,
跟怒首領鋒系列相反,
為了方便說明,使用的是超過本身圖像之外的碰撞判定來當圖示,
上圖中觸碰左邊方塊的中心A點時,
右邊的文字方塊顯示用magnitude得出的數值是大約1.3。
(如果能剛好碰到正中心的話會是0,
但理論上來說人的手指或滑鼠是不可能剛好碰到正中心點的)


上圖中觸碰左邊方塊的B點的虛線任何一處時,
右邊的文字方塊顯示用magnitude得出的數值是大約60。
也就是說,
A點(方塊的中心點)到B點黃色虛線的任一處的magnitude(向量絕對值)是60。

在gs中要取得上圖例子中文字方塊顯示的數值,
只需要用A點的座標減掉B點的座標就可以了。


magnitude裡要輸入兩個值,分別是X跟Y,
像這樣

===========
magnitude(X,Y)
===========

所以可以先設一個real性質的全域變數,比如叫做magnitude,
再把magnitude計算後的結果紀錄起來,

magnitude = magnitude( self.Position.X - game.Mouse.Position.X , self.Position.Y - game.Mouse.Position.Y )

這樣就可以再用任何數字去決定hitbox(碰撞範圍),
如果方塊的面積是60x60,
那設定magnitude < 70才觸發碰撞條件的話,
就會在方塊周圍產生像圖示的黃色虛線一樣,
多出看不見的10(70-60=10)的距離範圍也會被當作觸發碰撞判定,
如果想要設定小於方塊本身的hitbox(碰撞範圍),
像怒首領鋒那種極小hitbox(碰撞範圍)的話,
就只要設小於本身方塊的數值就可以了,
比如magnitude < 20才觸發碰撞條件,
就算碰觸到原本有顯示的方塊區也不會觸發了。

這個magnitude(向量絕對值)我想很多開發工具應該都有類似的用法,
比如說像以前flash的hitArea就有點接近,
而在unity要設定碰撞範圍應該是更容易才是,
只是換一個名詞變成magnitude後,
因為是平常比較少用的生硬英文,
就看起來變成很厲害,
其實運作原理並沒有字面上看到的那麼難理解,
難怪網路上流傳著一個笑話...

要學好程式最先要學哪一種語言比較好?



答案是:英文 : )


沒有留言:

張貼留言