搜尋部落格文章

2013年12月18日 星期三

[轉] MMO遊戲數值框架概述(偏類比方向)

概述:

本文討論了以下幾個模組:
1.國內遊戲數值的現狀
2.遊戲數值策劃所需要具備的素質
3.數值策劃的職業規劃
4.數值策劃對遊戲能控制的程度
5.框架設計和一些數值技巧
6.計算方法
7.設計思路問題
注:本文觀點是建立在成為一個好的數值策劃上,而並非是僅僅是成為數值策劃,個人覺得,任何人,任何水準都可以做數值策劃,但並非任何人,任何水準都能做好數值策劃。本文主討論框架設計,不討論細節地方。也許前面的敘述會較長,請耐心看下去,也許會有您想要看到的東西。想噴的朋友隨意!
國內數值現狀:
無論是看到,還是聽到,甚至被面試,總有人議論魔獸世界為什麼會成功,或者說國內遊戲和魔獸的差距在哪,而且如此經久不衰,許多人給出了各種各樣的答案,而又有很多人按照自己的答案去做自己的遊戲,但事實證明,並沒有遊戲成功(注:本文並非想討論魔獸如何如何,僅僅為引出關於數值的討論)。
作為一個遊戲玩家,也許會說,它好玩,但這是一個毫無意義的答案,對於一個遊戲開發者來說,基本就會從以下幾個方面來考慮,運營,市場,研發。
市場和運營,沒什麼好說的,大家都知道,魔獸世界的成功和它們沒有非常大的關係,而且作為遊戲開發者,更關注的是研發層面。
對於研發層面,關注的就是最基礎的三個點,技術(程式),畫面(美術)和遊戲性(策劃)。對於技術來說,我諮詢過不少的資深程式,確實,國外比國內要強不少,但頂多是功能更強或者更全面一些,肯定沒有強到有巨大的差距的程度(此處指的是重大功能缺失,並非指一些錦上添花的東西)。
美術,國內的美術水準不會比國外差,甚至某種意義上來說,比國外更好,而且對於魔獸來說,其畫面肯定比不過09年整得風風火火但又很快銷聲匿跡的永恆之塔。
策劃,對於策劃方面來說,分的可能也就三方面,主要為系統,數值,劇情。許多人說魔獸很大程度上因為劇情而成功,但並非是這樣,魔獸的劇情是建立在魔獸3的基礎上才廣為流傳的,因為有了魔獸3的成功,才有玩家對於其劇情而津津樂道。而並非因為劇情才導致魔獸3的成功,當然,也不能否認因為魔獸3的劇情的原因,給魔獸世界吸引了一大批的使用者,但這不會是大量使用者一直留在魔獸世界中的原因。除了早期的單機遊戲外,就幾乎沒有過會因為劇情而留在網路遊戲中的玩家。(注:此處並非想討論劇情是否重要的問題)
系統,魔獸的系統做的確實相當出色,但相對而言,我見過不少的製作人,也聽說過不少的設計理念,然後也看過和研究過不少遊戲的系統,發現一個問題,國內不少遊戲的系統,無論是關聯性還是設計的巧妙性都不比魔獸差,甚至有的比魔獸好,但為什麼卻達不到魔獸的高度?
最終的結論是,國內的數值水準遠遠落後于國外,而且並非設計思路的落後,而是執行能力的落後。為什麼這麼說,從以下幾個方面來說明:
首先從人員配置上來說:很少有公司的數值組會超過5個人,一般都1-2個,這還是大公司,而對於小公司來說,甚至一個都沒有,而僅僅是一些從來沒幹過數值而對數值有興趣的人在兼職。也許有人會說,要那麼多數值幹嘛,活有那麼多麼?其實對於策劃而言,工作量最大的就是數值,遊戲內的所有東西,除了資源和命名以外,所有東西都和數值有關。
其次從重視程度上來說,在早期,因為市場原因,導致遊戲只要能上,就能賺錢,而且數值本身就是一個在大概念上相容性比較強的東西,即即使有不平衡,有數值問題,遊戲一樣能夠賺錢,而更有很多的人覺得,即使沒有數值,或者有簡單數值,遊戲一樣能火,而在近幾年開始拼遊戲品質的時候,更多公司更關注的是引擎的先進,畫面的優化,功能的強大,卻很少有人關注到數值這一塊。甚至非常多人覺得數值策劃僅僅只是一個執行,給系統幹活的。而且非常多人,甚至非常多數值本身都覺得,數值是靠測出來的,而並非算出來的。但我想強調一個概念:如果數值能力夠,是可以不用測試的。(也許這句話很多人會嗤之以鼻,後文會具體講述原因)
再次從業者的素質來說,很多數值策劃幾乎都沒有數值背景,不懂得好的計算方法,如何能夠快速高效並準確的計算出值。曾經看到過一篇帖子說,小學四年級就能做數值策劃,說實話,我很想笑,我並不否認小學四年級就能做數值策劃,但要做好的數值策劃,這個說法純粹做夢,也許有人會覺得,數值策劃有那麼複雜麼?我可以很負責任的說,如果想做精品,那麼數值策劃就會那麼複雜,複雜並非取決於數值本身,而取決於遊戲是一個大世界,也許有人會說我這麼光說理論是沒令人信服的,那麼舉個例子,大家都知道暗黑2,這個遊戲10多年了都經久不衰,到現在還N多戰網不停開荒,想來大家都知道這個遊戲裡面只有這麼幾個系統:裝備(包含神符之語)、掉落、技能,一個純數值遊戲。而它拋開操作行的話,就主要玩一個裝備搭配,從幾千幾萬件裝備中選出12件(包含副手的兩件)。這中間就是一個最優化模型的問題,試問一下,小學四年級的數值策劃能夠算得清楚?或者說即使他用加減乘除算清楚了,那麼得花多少時間?
大家提起魔獸必然會提起魔獸的技能和天賦系統,但實際國內遊戲一對比,就會發現,比魔獸的技能和天賦系統做得複雜的遊戲很多,但為什麼沒有魔獸的影響力和遊戲性,當然,這中間確實有操作性的成分在內,但拋開操作性,也是能看出一些問題的。
也許會有人覺得,其實暗黑的數值策劃也許沒沒有算清楚,那麼咱們還不說這麼複雜的問題,再舉個簡單的例子,一個套裝有四件裝備,現在有三套裝備,一套是平衡裝,一套是攻裝,一套是防裝,在套裝啟動屬性不起決定影響的基礎上,這12件裝備穿哪四件會最佔優勢,怎麼穿會對其他穿法有什麼影響,我相信國內的數值很少能夠清楚的說明其計算方法並對其設計出有效的數值來。再也許會有人覺得,咱們幹嘛弄這麼複雜,管他怎麼玩最優化,反正只要沒問題就行了。那麼我就想問,既然設計者自己就不知道會有啥結果,怎麼可能指望玩家按照自己的設計來玩?怎麼能確定沒問題?
這還僅僅是12選4,如果是24選8,抑或是更多,那麼在設計者都不知道玩家會怎麼玩,只能靠市場去檢測的情況下,碰到運氣不錯,那麼這遊戲就好了,碰到運氣不好,那麼這遊戲就萎了,打個比方,很多遊戲都有加點玩法,這個玩法的初衷實際上是想讓加點變得有選擇性(暫時拋開加點屬性占人物屬性比例較低的因素),但是由於數值無法計算清楚,導致很多時候,這種選擇會變得唯一,即會存在最優配點方法,那麼原先想達到的選擇目的就無法達到,後果就是輕的會廢掉加點玩法,重的會影響到其他玩法(如果加點玩法跟其他較多系統關聯的話)。
在一個龐大的系統架構中,一個系統連著一個系統,如果關聯性沒那麼強,發生達不到目的的情況還算好,但是如果關聯性較強,則會發現,一個鏈條的中間斷了,然後後面一堆全跟著掉了。
或者再舉個例子,大家眾所周知的裝備升星玩法,只要是個數值都會涉及到這裡的消耗計算上,那麼,先舉個簡單的例子,規則如下,升星失敗不會降星,1到9星有不同的成功率,現在要計算升到9星的平均消耗,相信絕大多數人都能計算出來。但事實上會發現,幾乎沒有遊戲公司用這種規則。進一步,失敗會降一星,再計算升到9星的平均消耗,相信就有90%的人算不出來或者算錯了,這種方法下,不懂概率論的人想要計算出來就有點搞笑了。或者再複雜點,失敗有X%幾率降一星,Y%幾率降到0,有Z%的幾率不降,再計算平均消耗,我相信業內大部分數值是不會計算的(具體演算法我會在後文中講述)。
再次,對於工具的應用上,目前來說,對於數值策劃最多的用的是excel,但大多數數值策劃的應用水準僅體現在簡單的填表,簡單的函數上,對於熟練使用查找函數,資料有效性,條件格式,甚至是更高層的陣列公式,VBA,甚至是樞紐分析表,更甚至ribbonX的少之又少。不會excel,無法建立起能夠關聯,整體計算的資料模型,那麼這個數值策劃至少不能算是一個成功的數值策劃(當然,我並不否認存在憑感覺成功的數值策劃,但這並非常態,需要包含運氣和大量經驗在內),而業內絕大多數的數值策劃都達不到這個水準。如果對於excel這個基本工具都不能保證掌握的話,那更不用提掌握其他sas,matlab等數學專用工具了(當然,這個我也不太精通,學習中)。
最後,在於數值的教學上,一般來說,國內的數值策劃大多都是自學成才,而這些數值更多都感慨一個問題,就是無法學習到一些比較先進的計算方法,每次聽說好的計算方法都會眼前一亮。面對一個遊戲,可以很容易的反推出其系統關聯性,但幾乎不可能反推出其數值框架、數值公式和給值思路。所以導致數值策劃的成長大多都是自悟和經歷專案的經驗,能夠學習知識的面非常窄。
然後打個比方,系統策劃好比「前鋒」,而數值好比「後衛」,系統策劃容易出彩,而數值策劃即使能力非常強,做得非常好,也僅僅只是讓遊戲沒有問題,很難有比較出彩的地方,即較難看到效果,所以大部分人都會奔系統而去。
所以,以上種種,都導致了一個問題,國內數值水準普遍偏低(並非貶低別人,我自己能力也偏低),並且因為市場的原因,導致很少有人認識到這一點。所以國內很少出或者很少複製出精品遊戲。
好數值策劃所需要具備的基礎素質:
1.必須至少深入玩過幾款網游:
這一點主要是,如果數值沒有玩過網游或者說玩過太少網游的話,首先是無法理解系統需求,無法明白遊戲元素,其次對於玩家心理完全不理解,設計思路會成問題。
2.熟練應用excel,並有好的工作習慣
熟練應用包括(按照深入程度劃分):
基本功能方面:拉表、簡單公式(sum,if等)、插入、刪除、隱藏、凍結窗格
進階功能:簡單排序、篩選、查找與邏輯函數、選擇性粘貼、定位
更高一點:名稱、條件格式、資料有效性、高級篩選和排序、分列、刪除重複項
再高:表、陣列公式、樞紐分析表、VBA
其他:ribbonX
3.好的工作習慣:
不能在公式中加入常量(當然,1,0這些特殊數值除外)
多使用名稱,讓公式簡潔明瞭
工作表sheet分類明確,某些表就是變數定義,某些表就是模組計算
4.有數學背景或者對數學演算法瞭解較多
該點主要是用來計算一些較複雜的演算法,設計一些要滿足需求的公式等(例如後文中傷害公式的改造公式)
5.有邏輯思想,最好懂一些程式(首推VBA,其次C++),自己個人是lua用的最熟,其次VBA,再次C++
因為數值經常涉及到超大量的計算,有時候僅僅靠演算法是沒有用的,更多的時候還需要進行大資料量的遍歷計算,這 時候靠人工去計算肯定是不現實的,這時候就需要有程式邏輯進行迴圈。
也許有人會說,有程式需求找程式就行了唄,但是,很多時候這種想法是不現實的,首先,程式不一定有空給你做東西,其次,程式不一定能理解你想做什麼,再次,對於數值來說,大量資料是建立在excel上的,而程式開發的東西大量是建立在C++上的,不大好相容,當然,你確實是可以找一個熟練使用VBA的,但這種絕對是可遇而不可求的。而且最關鍵的是如果要修改,自己來做重複工作量小。
6.懂系統關聯
做一個系統策劃可以不懂數值,但一個好的系統策劃肯定對數值有不少的瞭解,同樣,一個數值策劃可以不懂系統,但一個好的數值策劃必須對系統有較深入的瞭解。
並因為玩家如何玩一個遊戲最終還是取決於數值策劃的值給的如何,所以,事實上,數值策劃必須清楚一套數值給出去之後,其所服務的系統跟其他的系統的關聯性會怎麼樣。也就是說,系統策劃定義的系統關聯是否能夠達到預期效果是由數值直接決定的,所以,數值策劃必須要理解系統的關聯以及系統所要達到的目的。
舉個例子:某個BOSS掉升星必成的道具和金幣,這個BOSS究竟與道具關聯更重,還是與金幣關聯性更強僅僅取決於道具的掉率和數量,以及金幣的掉率和數量。而系統策劃僅僅只能告訴你他想要的是:道具多產點,金幣少產點,但究竟是多少,他其實自己都沒有太確鑿的概念。所以數值必須清楚中間的關聯度有多高,而給出相應的數值。
7.要明確玩家如何玩
這個是屬於比較難的,就是一個系統案子做出來之後,首先要清楚設計目的,其實要想好玩家如何去玩。自己先設身處地想到玩家有多少種可能的玩法。玩家是交易、賣店、不玩、還是其他情況。
就比如說,同一等級段有幾套套裝,那麼首先得想到玩家穿齊一套的,但其次,還必須想到玩家穿散件的情況。甚至跨等級段穿裝備的情況。
當然,以上僅僅是最關鍵的幾點。其他的就暫且不說了。
總結語:評價一個數值策劃最重要的標準在於:他對於自己所設計的數值的把握程度,或者說拍腦門的次數。
理由:遊戲開發的流程:設定->執行->測試,然後從測試這裡進行一個while do的迴圈,while測試不通過,則do執行->測試繼續迴圈下去,而這個迴圈的次數有多少,就是評價一個數值的最好的指標。對於一般數值來說,自己並不清楚或者是靠感覺大概知道給出的數值是個什麼情況,然後只能靠測試回饋,回饋完之後,再測試,再回饋,差的數值會將這個過程拉到很長,而導致大量的測試工作量,執行工作量,而產生大量的工作週期。而好的數值則會將該過程無限往下壓縮,接近于1,而節省大量的工期。如果哪個數值能夠1次給值就沒有任何問題,那麼無疑,他的數值能力絕對是強到一定程度了。因為他知道自己給的數值有什麼問題,能夠達到什麼目的,在什麼地方會盈餘多少。遊戲的一切盡在掌握之中,這是數值策劃發展的最終目標(也許這個目標確實很難達到,但是可以無限接近,在接近的過程中,你會發現,你給專案帶來了巨大的效益,無論是縮減工期,還是對遊戲的掌握)。
數值策劃的職業規劃:
僅指如何入門,如何發展,如何學習,不包括爬到管理之類的
首先,數值分為設計和執行兩種,執行是僅僅懂執行,計算,不太理解系統關聯,而設計是指既會計算,也懂系統的人。那種只懂設計不懂計算的數值,我將其定義為系統,而並非數值,而這些人做數值更多的靠的是經驗和想像。數值計算是一個嚴謹的過程,不可能存在任何的猜測和直覺。很多遊戲中存在很多「拍腦門」的值,嚴格來說,一個遊戲中,幾乎只允許存在幾個「拍腦門」的值,其他都必須是經過嚴格計算出來的。或者,評價一個遊戲數值好壞只需要看裡面有多少拍腦門的值就行了。
對於應聘來說,純系統的數值找工作跟系統一樣,主要看運氣,能碰到那個喜歡你思路的人,你就牛B,不喜歡你思路的人,你就SB。而現在業內更多的數值是這一類型。而數值的從業者更多更容易變成這樣的數值。除非曾經鍍金過(即在一些成功專案中當過數值),才會相對受重視,否則,能不能打動面試者,就看你是否對他胃口或者會不會侃了。
執行數值,對於執行數值來說,首先也得excel熟悉,其次懂計算方法。門檻相對較高,但一旦進入門檻後,就會發現,即使你說不出來設計思路,即使你沒呆過成功專案,你也會很搶手。因為即使你對於設計沒有説明,但執行效率絕對遠高於其他策劃。
而對於既會執行,又懂設計思路的數值來說,絕對是各個公司熱門要挖的人物,而這種人,也一般都具備了主策的能力。如果曾經呆過成功專案,那麼絕對可以往總監、經理上爬了。
所以,綜上,對於想要做數值策劃的人來說,給一句忠告:先學會excel,再來談設計。個人經歷可以完全證明這一點。(如果您口才特別好,那麼可以忽略這句話)
數值策劃的類比表能控制到的程度:
1.人物屬性:
不包含隨機玩法,可以保證遊戲中人物的數值和計算表中完全一致,小數點都不差
包含選擇玩法,根據其選擇可以將遊戲中人物的數值和計算表完全一致
包含隨機玩法,可以保證遊戲中人物的數值絕對不會超過數值設定的上限
總結:也就是說,如果在計算表中按照遊戲內的裝備配置,可以保證遊戲內的數值和計算表中的數值完全一致,這是數值策劃把握遊戲的基礎
主要用來控制遊戲中的總戰鬥數值體系
2.技能:
根據玩家所配置的技能迴圈和應對策略,可以保證遊戲內的單人戰鬥和計算表中的類比戰鬥結果基本一致(因為涉及到操作準確性以及傷害浮動,暴擊等,只能保證平衡值基本一致)(文尾會配表)
主要用來控制和類比玩家的單人PK平衡
3.怪物數值:
根據當前人物能力,以及所需要怪物達到的目的來決定怪物數值
目的是指:怪物打人多少血,人打怪的效率,以及怪物屬性引導,例如某怪閃避特高,需要玩家堆到多少的命中才能殺死等等
4.成長:
根據有哪些一次性任務(這些任務中哪些即時能完成,哪些需要一段時間後能完成),以及每日任務,再類比大部分玩家的行為,可以一次性準確的設計出玩家升級所需要的時間,經驗,以及玩法經驗公式等
主要用來控制和類比玩家的成長速度和經驗獲得
5.經濟:
根據玩家每日的行為,所進行的玩法,可以完全的計算出玩家身上應該有多少錢和什麼物品(不包含交易和掉落),控制和類比每日的產出
商城定價之後,能夠平均的控制住自己每個玩法的大概收入
6.總結:
主要為以上幾個大模組,為什麼招聘數值策劃的人都會提到一個數學建模的問題,而數學建模為什麼要建模,建立的就是一個數學模型,而數學模型的目的用來幹什麼,相信大家都知道,就是用來類比的。也就是說,如果一個數值策劃不會數值類比,那麼絕非一個好的數值策劃。
數值策劃計算類比所能達到的最高境界:輸入玩家的行為模式,輸出玩家的等級、經濟、物品、裝備情況等資料庫所記錄的全部屬性。
以上所說的僅僅為對於遊戲資料的控制,我一直有個觀點:只有建立在你能控制遊戲數值的基礎上,才能讓自己的設計變得有根據。很多人在進行討論的時候都會說玩家喜歡喜歡怎麼樣,到多少級可能會怎麼樣。很多東西都是憑個人觀點或者說個人經驗去猜測出來的,這些說法不可能都靠譜。
只有建立在能夠瞭解遊戲中的各項資料的情況下,再去設計東西,才能夠準確的達到目的。
數值框架與一些設計技巧(注:數值框架涉及到的框架內容和細節內容太多,不做詳細說明,僅僅只描述一下大概框架的設計流程)
相對於設計方法,我更擅長於類比,所以後文更多的講到一些類比的技巧,敬請關注。
雖然以下介紹了一種比較簡單易懂也容易實施的設計思路,但僅僅只是為了抛磚引玉,並不推薦去深入研究或者照搬,較好的數值策劃基本都會有自己一套獨立的數值架構和設計方法,如果總是照搬別人的,永遠都成為不了好的數值策劃
數值框架設計,許多人不明白數值框架指什麼,下面一步步的說明,先簡要說明,再詳細舉例說明:
首先,先明確自己的遊戲裡面有什麼,而這些有什麼僅僅是一個框架的組成部分,例如:有職業、屬性、等級、怪物、裝備、技能、坐騎、貨幣、掉落、道具等一系列的東西。相當於先設計出遊戲裡有哪些「積木」。
其次,需要將這一系列元素組合和串聯起來,職業有哪些屬性,裝備有哪些屬性,等級對裝備和屬性有什麼影響,貨幣和道具對裝備有什麼影響,掉落對道具和貨幣的影響。相當於「積木」搭建的方式,誰搭在誰上面,誰會承載誰。
因為現在MMORPG的戰鬥數值設計起來框架和流程幾乎完全一樣,並沒有什麼變化特別大的地方,所以按照常見流程進行說明,但並非指數值設計就一定得按照以下規則設計。而且以下僅僅為一些常見方法,一些細節東西不提(例如職業特色如何搭建)
舉例:
戰鬥模組。設定遊戲屬性與傷害公式,這是整個遊戲戰鬥的基礎
遊戲屬性就不用多說了,按照各自遊戲的風格和具體設計來設定自己所需要的屬性即可(本例子中是使用的無一級屬性的概念,即沒有力量、智力等屬性,在現今的遊戲當中,他們其實並沒有太大的實際存在必要。當然,也有相應的設計方法,但不在此詳細敘述。)
傷害公式:一般來說,從公式的主體上來說,是減法和除法兩種公式,當然,從本質意義上來說,現在的公式遠比這複雜,但是無論是數學還是物理,都很常見一句話:理想狀態下,即某些東西先不管。
我不想在這裡討論減法公式好還是除法公式好,僅僅只想說各有各的優缺點,將傷害公式稍作設計和修改即可彌補。
關於減法公式,最大的優點就是簡單明瞭,而且傷害增長明顯,即攻漲1點,防不變,傷害就漲1點,但最大的缺點就是不破防的問題,在不破防的情況下,會出現很多問題,一是打怪無消耗,二是人物追求攻的過程中,如果攻一直沒對方防高,那麼一直不破防,追求攻的過程會比較受打擊,當然,還有其他一些問題,暫且不提(例如很難控制上限值等)
有個簡單的設計方案:
該方案的公式看起來比較複雜,主要目的就是為了解決不破防也會有傷害的問題,以及在追求攻的過程中能看到實際效果,也許有人會說公式太複雜,程式的計算壓力會太大,但配合數值的設計(攻跟防的差距拉得稍微大點),讓該功能的出現幾率變小點就沒有太大問題了。
對比一下實際效果:
上圖為攻-防的實際效果,下圖為使用簡單設計方案後的效果
至於除法公式,有一個最大的好處就是能夠控制上限,並擁有一個遞減規則。但同樣擁有一個較大的問題就是,一旦到達某個階段後,收益遞減,玩家評價如何該收益已經不值得的時候,該數值就幾乎無法再往上疊加了。該公式不做再進一步的說明了,如果有人想討論的話,可以單獨聊。
傷害公式確定後,那麼就是職業和屬性,以及戰鬥平衡了。首先明確一個概念,那就是平衡的概念:平衡並非指誰的攻擊高,或者誰的血多,或者誰的防高,抑或者是誰的閃避高,而僅僅是這麼一個公式:存留時間A≈存留時間B。以下以減法公式為例
為什麼這裡是約等於,就是因為玩家有一個感受範圍,在同樣的裝備檔次下,超過他的感受範圍了,他會認為不平衡,在公式上就表現為存留時間A和存留時間B的數值差別的精確範圍,我暫定為0.2,即存留時間A/存留時間B的數值範圍在0.8~1.25之間(注,此處因為0.8算為平衡範圍內,則A/B=0.8,而B/A=1.25,所以定義為0.8~1.25而並非0.8~1.2)
即我認為A/B在0.8~1.25的範圍內,則為平衡,當然,在這中間可能會有誰強誰弱,但總體差別不會太大。
在減法公式下,存留時間B=生命B/(攻 A?防B),這個公式有一個好處,即如果在基礎的人物屬性模型下基本平衡的話,各個職業的數值按照一個固定的比例係數成長的話,存留時間是不會變化的。例如:A和B都升到了40級,A的攻為原來的10倍,而相應的B的防也為原來的10倍,血也類似。則除出來的存留時間是和1級的時候完全一樣的。
也就是說,在這個理論下,可以建立一個在大方向上基本平衡的模型。即在各個玩法上固定攻、防、血的成長比例一致,則會出現平衡模型。也許會有人誤解,這樣是否會導致各個職業屬性都一樣,並非如此,如果你仔細想,你會發現各個職業的屬性傾向會非常明顯(注:這個方法是一個取巧的方法,做起來相對簡單而且能夠在一定程度上保證平衡性,而且還有職業屬性特色,但也有不少的局限性,並非這麼做是最好的,所以僅僅作為介紹來敘述一套設值思路,覺得有價值的專案可以使用)
設定職業範本
首先,先設定一個所有職業共用的範本,例如:這裡的各項數值可以根據自己的喜好憑空產生,不過即使是這樣,中間的數值也會有一定的來源,例如生命、攻、防的比例是一個需要注意的資料,即你希望你的職業在光看屬性的情況下的平均存留時間。內力可以隨意給,它只跟使用技能時消耗多少有關系,所以,初始設定多少都無所謂。至於命中閃避,則看其數值空間有多大,最終能放大多少倍,可以根據後面設定的放大比來進行調節。
其次,設定職業特點,並根據職業特點設定職業的屬性傾向,然後使用該數值範本進行偏向,如下(其中,中代表和範本數值一樣,低代表低兩檔,中低代表低一檔,然後在係數表中配置每低一檔的差距,這裡每檔的差距可以用等差數列,等比數列,或者是枚舉數列都行,僅僅是為了體現職業屬性傾向,以下以等差數列為例,每檔差距為25%):
偏向完之後,就會產生1級時各個職業的屬性數值,如下:
然後根據該數值,先簡單計算一版的數值平衡(注:該表僅為示意,裡面包含的是各種取值傾向下的各種職業的戰鬥平衡資料,選擇該項傾向,則該項屬性為原先的1.1倍,該設置沒有什麼意義,可以理解為不同加點模式)(其中粉色背景的表示為不滿足我預先設定的可以接受的範圍內的,即不太平衡的可能性,那麼觀察出現這種情況是因為什麼,然後返回之前的屬性傾向設定步驟調整一下數值繼續看,直到相對滿意為止):
小插曲:注意儲存格中的公式:
使用名稱會讓你的公式變得簡單易懂
該步結束後,則已經完成了職業屬性範本,後面一系列的東西往上放大即可
升級獲得屬性
因為在上一步已經設定好了職業屬性的傾向性,按照百分比放大,則能保證其傾向性,並且能夠保證平衡性,所以,升級獲得的屬性職業按照1級時的屬性進行百分比放大即可
如下圖所示:
設定能力分佈比例(這裡主要談攻防血這些影響戰鬥的基礎屬性,以裝備系統為例,有其他系統類推即可,至於像命閃爆韌等其他特殊屬性可以單獨做限制)
假設裝備系統上有基礎屬性,顏色屬性,品質屬性,其他屬性,其中裝備強化程度對基礎屬性有影響,裝備顏色對裝備的基礎屬性有影響(與強化疊加),對顏色屬性也有影響,根據設計的需求,先分配一下各個部位屬性所占的比例大小,如下圖:其中裝備總和代表的是裝備對人的能力的提升是人物本身能力的多少倍,下圖例子中即為9倍(僅為舉例,該數值並非一定合理,不必細究)


2013年11月26日 星期二

[轉] AS3專案嵌入字體

Operating with embedded graphics and fonts of flash application during development is significant, since unique cross-browser (and cross-platform hopefully) look is one of key RIA/flashgame features. This article reviews font embedding for pure AS3 project, as it's the most universal way for embedding. Flashplayer uses device fonts for textfields by default. So if you specify the font property of TextFormat object, then the given font must be available on device where flash-application is running. If the preferable font is missing, default system font is used. You should embed the font to assure the font is displayed properly on any computer. Embedding gives some more advantages: font symbols can be rotated, fonts provide smoother playback when zooming, fonts are anti-aliased. The following font file types are supported by Mxmlc compiler for embedding:
  • TrueType fonts (*.ttf);
  • OpenType fonts (*.otf);
  • TrueType Collections (*.ttc);
  • Mac Data Fork Fonts (*.dfont);
  • Mac Resource Fork TrueType Suitcases (don't have file extension).
The basic syntax for font embedding is (note that semicolon is not placed at the end of line):
?
1
[Embed(source="pathToTtfFile", fontName="FontName", mimeType="application/x-font- truetype")]
You must specify either a valid URI to the font (as shown above), or reffer to the font by its name using this syntax:
?
1
2
[Embed(systemFont="systemName", fontName="FontName", mimeType="application/x-font")]
private static var font:Class;
The font name specified above should match the font name within the operating system. This way you do not include the font file's extension. You can embed fonts that are locally accessible by JRE, including fonts that are made available to the JRE by OS, files in the jre/lib/fonts folder and fonts that are mapped in the jre/lib/font.properties file.
For each font embedding separate metadata tag [Embed] must be defined. If you attempt to embed a font that Flex compiler cannot find, compiler throws a similar error: "exception during transcoding: Font for alias 'Tahoma' with plain weight and style was not found by family name 'Tahom'".
There are two code areas in ActionScript file where the [Embed] tag can be put:
1. Inside a package, but outside of the class definition. However this type of embedding allows you to embed only one font per file - not the best choice for rich applications. Attempt to include several embeddings in this manner will lead compiler to the error: "Unable to transcode /fontPath/FontName".
2. Inside class definition. This way you need to put Class-type or String-type variable definition right after metadata tag:
?
1
2
[Embed(source="pathToTtfFile", fontName="FontName", mimeType="application/x-font- truetype")]
private static var fontName:Class;
This variable is not used directly in code (though it is used to handle other embeddable data types, like images and sound). In our case this definition must exist in order the compiler to link-in the font. Compiler generates an error if no definition found: "Embed only supported with variables of type Class or String".

When dealing with fonts the [Embed] tag may take the following properties:

NameDescriptionAcceptable valuesDefault value
systemFontExact name of the font installed on your system. Use either this or source parameter.String name of the font, e.g. "Arial"-
sourceRelative or absolute path to the font file.path string, e.g."./font/MyriadPro-Regular.otf"-
fontNameString used to identify font further in code and at runtime. Use the same string when assigning font property of TextFormat object (classic text), or fontName property of FontDesctiption object (FTE).Any string identifier-
fontFamilyProperty is intended to identify the precise font face. When embedding system-font this property should include the font name and font face. For example "Trebuchet MS Bold", where the font name is "Trebuchet MS" and font face is "Bold". In this case thefontName property is generated automatically. 
See source code below lines 60-67. 221-238. See also Embedding multiple typafaces from container file formats below.
When embedding via source path this property becomes equivalent to the fontName property. So you may use either this, or thefontName property.
Any string identifier of the font.-
unicodeRangeUnicode range for embeddable font. Specifying this range helps to reduce the size of the embedded font. Also it lets developer to embed only the glyphs that are really needed. Range syntax: 
U+[beginning of range]-[end of range]
Multiple ranges are separated by commas, also single character codes are allowed. To specify required range quickly you may useUnicode range generator utility.
Ranges can be specified by names in flex-config.xml file (located atAdobe Flash Builder 4/sdks/4.0.0/frameworks/). The file contains tag, for setting up ranges. The flash-unicode-table.xmlfile(located at the same folder) already contains a number of pre-defined unicode table mappings, like Uppercase, Lowercase, Numerals, Punctuation, Basic Latin, Cyrillic, Arabic and others. All you need to do is paste them into flex-config.xml. When ranges specified it is handy to use their string-names. More about ranges onadobe. Y
Unicode characters in U+hex notation. Example:"U+0400-04CE, U+2000-206F, U+20A0-20CF, U+2100-2183, U+0020".
Or string names of language-ranges (the ranges must be defined in flex-config.xml). Example:"englishRange"
all glyphs of the font, but not more than 1000 per type face. 
max-glyphs-per-face value can be modified in flex-config.xmlfile
advancedAntiAliasingProperty determines whether to include advanced anti-aliasing information when embedding the font. Advanced antialiasinghelps to display text clearer on small font sizes. Property is ignored when embedAsCFF property is set to true, since the Flash Text Engine (FTE) renders text by its own way.true or falsetrue
embedAsCFFNew Flash Text Engine (FTE) uses Compact Font Format (CFF) fonts. Since Flex 4 embedAsCFF is set to true by default. Classic TextFormat objects are unable to use CFF fonts.true or falsetrue
fontWeightProperty sets the type-face value of the font. Property should be used only when required for embeddable font.normal, bold, heavynormal
fontStyleProperty sets the type-face value of the font. Property should be used only when required for embeddable font.normal, italic, obliquenormal
mimeTypeThis property is required if font has no, or uses untypical file extension.application/x-font, application/x-font-truetype, application/x-font-opentype, application/x-font-truetype-collection-

Embedding multiple typafaces from container file formats (.ttc, .dfont).

The documentation claims that for a "container" of several fonts (such as a *.ttc or *.dfont file), you should use the fontFamily property to select custom font face out of the collection. But this feature doesn't seem to work properly, only four basic typefaces (regular, bold, italic, bold-italic) can be embedded this way, while other typefaces like "condensed", "black", "condensed extrabold", etc. are being skipped by flex font-managers. If the typeface doesn't match 4 standard face patterns regular typeface is embedded.
To workaround this issue you may convert single font file to separate *.ttf or *.otf files. You are free to choose any converter, I'd recommend free-online converter http://onlinefontconverter.com, which worked perfectly for me on *.ttc to *.ttf conversion. Given that the subfamily for converted font doesn't match the four-standard faces, you'll have to reference that font by its name only, though it doesn't take a lot of annoyance.

Embedding bitmap fonts.

As a big fan of bitmap fonts I disable smoothing for small text sizes, if possible. Flex does not allow to disable font antialiasing, so the font is always smoothed. The best way to avoid smoothing on small sizes is to embed pixel fonts. These fonts are designed to provide crisp screen text at very small sizes, these fonts look sharp when their X and Y points are set to non-fraction values. It is also possible to create pixel bitmap font in Flash IDE, as it has the option "Bitmap text (no-antialiasing)" for text fields, publish swf with the font, and than embed it to pure as3 project. To embed bitmap font perform the following: 
A) In Flash IDE:
  1. Create a new document (FLA file, AS3);
  2. Add dynamic or input text field on stage, specify the font, select "Bitmap text (no-antialiasing)" item of "Anti-alias" list;
  3. Embed font-glyphs by clicking on "Embed..." button, or type required symbols in the textfield;
  4. Convert textfield to MovieClip, select "Export for ActionScript" in "Convert to symbol" dialog, set Identifier field value;
  5. After the symbol created, publish document.
B) Than in AS3-editor (Flash Builder or whatever) embed movieclip symbol from obtained swf file:
?
1
2
3
// dentifierName is Movieclip AS3 Identifier value
[Embed(source="mySWF.swf#identifierName")]
private var MyFontHolder:Class;
The compiler will link the font from the movieclip. Note that flash automatically renames bitmap font adding suffix _9pt_st to its name, where 9 is its point size, see source code line 241.

Running example:


form: http://inspiritgames.com/blog/2010/09/embed-fonts-into-pure-as3-project/
source code download