Window_Base.prototype.drawTextEx筆記

點(diǎn)擊這里返回rpg_windows.js
點(diǎn)這里返回總目錄

題記

  • 作者:RPGAMKER MV 官方源碼
  • 所在文件:rpg_windows.js
  • 簡(jiǎn)介:實(shí)現(xiàn)轉(zhuǎn)義文字的大入口。

概況

之所以說(shuō)是大入口,是因?yàn)檫@個(gè)函數(shù)源碼并沒(méi)有進(jìn)行詳細(xì)的計(jì)算和賦值。它所做的是判斷情況,順序調(diào)用真正實(shí)現(xiàn)轉(zhuǎn)義過(guò)程的其他函數(shù)。(例如convertEscapeCharacters等)。

一些啰嗦的筆記

Window_Base.prototype.drawTextEx這個(gè)函數(shù)體內(nèi)的代碼并不長(zhǎng),單純來(lái)看也不復(fù)雜,因?yàn)樗皇且粋€(gè)入口。我不知道用入口來(lái)形容是否準(zhǔn)確,它可以看做一個(gè)大袋子,里面還裝著小袋子。就像你去勾搭畫(huà)手寫(xiě)手的時(shí)候,你準(zhǔn)備好了一個(gè)大套路,然后里面套著各種小套路。(太太們,我沒(méi)套路,我只有真心...)

if 判斷

最先執(zhí)行的是if判斷。
if在C和C++里也有,在很多語(yǔ)言里都出現(xiàn)過(guò)。
單獨(dú)列出來(lái),放在JS-MV小故事里了。

此處,它判斷的是否含有文字。如果有文字,執(zhí)行各種操作,如果沒(méi)有文字,那么就直接返回0,在返回0之前,它什么都不做。
我們?cè)敿?xì)看的是含有文字的情況。

textState被初步聲明

大致過(guò)程,聲明文本狀態(tài)對(duì)象textState。(關(guān)于對(duì)象,請(qǐng)看JS-MV小故事。)
這個(gè)對(duì)象在第一次聲明時(shí),定義了幾個(gè)元素

  • index(索引,初始值為0)
  • x (x軸位置,初始值是參數(shù)x)
  • y (y軸位置,初始值是參數(shù)y)
  • left(名字叫做左,實(shí)際上是判斷是不是行頭用的,初始值是參數(shù)x)

convertEscapeCharacters(text)

接下來(lái),調(diào)用同一個(gè)對(duì)象下,它的兄弟函數(shù)convertEscapeCharacters(text)。
這個(gè)兄弟函數(shù)是初步處理,就是編碼的轉(zhuǎn)換,使得JavaScript能夠處理作者在數(shù)據(jù)庫(kù)或地圖事件中的輸入(實(shí)際上無(wú)論在哪里,都會(huì)存儲(chǔ)在json文件里),其實(shí)解讀的是json中的編碼,解讀之后JS語(yǔ)言理解了。
里面還在調(diào)用其他函數(shù),就是套路中的套路中的套路....
值得一提的是,在調(diào)用之后,會(huì)賦值,賦值給一個(gè)剛才聲明狀態(tài)時(shí)未聲明的元素。
這個(gè)元素同樣是textState對(duì)象中的一員。(就當(dāng)做新生兒出生了吧)
這個(gè)元素,被取名為textState.text。
從名字看出,它就是文字本體了,但還未行程真正的轉(zhuǎn)義處理,只是被轉(zhuǎn)碼了。

calcTextHeight(textState, false)

在text完成后,繼續(xù)調(diào)用函數(shù),這一次是calcTextHeight(textState, false);
如果去找,會(huì)發(fā)現(xiàn)calcTextHeight并不是MV定義的。這個(gè)函數(shù)實(shí)際上是JavaScript自身定義的函數(shù),只要是text對(duì)象的實(shí)例,都可以使用這個(gè)函數(shù)。
雖然可能原理復(fù)雜,但用起來(lái)不難,只是似乎百度上很少有人用。這個(gè)函數(shù)的官方解釋是:Calculate text box height。計(jì)算文字框的高度。
它的原理:

 calcTextHeight: function() {
      var lineHeight, height = 0;
      for (var i = 0, len = this._textLines.length; i < len; i++) {
        lineHeight = this.getHeightOfLine(i);
        height += (i === len - 1 ? lineHeight / this.lineHeight : lineHeight);
      }
      return height;
    },

總之,它最后返回的是高度。
有了這個(gè)值,又一個(gè)新生兒被填入靈魂。這個(gè)新生兒同樣是textState對(duì)象中的一員,名叫textState.height。

重設(shè)字體設(shè)置

調(diào)用函數(shù),重設(shè)字體的設(shè)置。
好像沒(méi)啥特別的?

循環(huán)執(zhí)行processCharacter(textState)

關(guān)于循環(huán),while相當(dāng)常見(jiàn),其他編程語(yǔ)言里也有while循環(huán)。(關(guān)于while,可以看jS-MV小故事。)

當(dāng)index小于文本長(zhǎng)度時(shí),循環(huán)操作執(zhí)行一個(gè)函數(shù)processCharacter。而這個(gè)函數(shù)的參數(shù),是textState整個(gè)對(duì)象。
processCharacter這個(gè)函數(shù),用于處理轉(zhuǎn)義字符,也同樣是個(gè)入口。
所有的字符都被轉(zhuǎn)義之后,會(huì)返回新的x元素,此x元素在操作上,應(yīng)該是被重置了,再度回到最左邊去了。
遇到return時(shí),整個(gè)函數(shù)就會(huì)結(jié)束。

其他

等想到了再補(bǔ)充。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容