從Hint 談遊戲中擴充套件文字控制項

2021-05-03 21:14:42 字數 1492 閱讀 8319

題目有點大,但實際上是很簡單的事情,也許一兩句話就說完了。

組成文字控制項的核心物件:

unit: 最小顯示單元的抽象。

line:用於組織顯示的物件,主要用於可見部分的文字和內容的構造,記錄了一組unit所在的位置。

chunk:文字控制項內部儲存unit的容器,不記錄unit的位置資訊,乙個文字控制項裡應該包含大量的chunk。

行為:parse:將一段序列化的文字解析成乙個chunk。

bulidline: 將乙個chunk按目標視窗的大小等引數,將物件初始化成一組組的line,這裡需要考慮unit的splite功能(處理轉行的問題)。

show: 計算出需要顯示的line,選擇正確的內容進行顯示。

我知道上面的文字很偷懶,但是給出乙個相當的實現實在是....各位yy吧。

做過hint的朋友一定知道,它絕對是乙個極其繁瑣的東西...不在於板式多難,而是策劃需要顯示的項極其多...

ps:在處理hint的時候,巧妙的使用macro,合理構造出需要手寫的 {} ,能使vs對功能**進行摺疊,會對維護帶來極大的好處。方便看,還能設斷點。另外說一句,我們解析物品hint的功能函式有近4000行...

現在來談這個題目的核心。

margin 縮排

upstride 上邊距

downstride 下邊距

我不知道各位的實現策略是什麼。比如line的縮排,是可以使用空字元來代替的。但是整chunk的縮排,用空字元的策略就顯得不那麼正確了。我不懷疑你能用那方法做出來,但是這絕對不方便serailize/parse的交替進行。那麼,問題是什麼?

問題就是什麼樣的物件需要上面3個功能?

直接說結論吧:

unit : space

line : upstride, downstride

chunk : margin, upstride, downstride

現在來說理由

unit : line 內部的 unit 的上下邊距是沒有意義的,同時沒有字縮排這個說法,我們一般都說字間距。所以在這裡換個說法。雖然說普通文字的間距不是通過在這裡進行處理的,大多數的方案是在font上進行, 但是必須要考慮非文字物件,所以對於unit來說,需要實現space。

line : 對於遊戲而言,極少需要每line進行縮排排版。如果真有這樣的需求,也可以將需要排版的地方轉換成「每chunk乙個line,使用chunk的縮排」,但是上邊距和下邊距是需要的,如果不在line上做邊距,就沒有辦法每chunk調整其內部的「行間距」了。

chunk : chunk的整體縮排是為排版提供更加豐富的可能性。上下邊距是為了實現「段間距」功能。

當然,段間距我們也可以通過「設定多個文字控制項,每文字控制項乙個chunk」的方式進行實現,這跟行縮排的代替方案的思路一致,但是當你考慮chunk的長度不固定的情況,那你不得不為了使多個文字控制項支援動態調整height而做一些非文字控制項固有的功能。其實我覺得雖然各種方案最後都能實現,但是其中的取捨根據實現難度、思考理解難度、時間限制等因素,並沒有優劣之分,只有合適不合適的問題。這裡是我的選擇方案:)

如何從遊戲中建立指令碼!

在乙個網路遊戲中,插入乙個指令碼,能代替滑鼠的運動,檢測怪物和特定npc的位置。最好就是指定乙個座標,能讓自己的角色去到那兒,乙個通用的程式,而不是專門為這個遊戲設計的程式,而是通過指令碼就能把所有遊戲的這種功能實現。希望能有高手解釋一下。我不會程式設計,至少現在也還沒會,就我所知道的,遊戲可能是把...

buff系統 遊戲中 從心理學看遊戲中的社交系統

人是社會性動物,活在關係中,關係裡最重要的東西就是理解,而理解的前提就是 看見 社交的本質就是提供 看見 的基礎,你存在,所以我存在,因為被看見,才有價值。開場故事 現實與遊戲中的社互動動 春天已經來了,疫情在全國多個城市0增長和武漢艙醫院全部休艙,基本宣告了結束。年前本來就要動手術的阿西一直拖到了...

從sprintf函式談符號擴充套件問題

這裡要注意乙個符號擴充套件的問題 比如,假如我們想列印短整數 short 1 的記憶體16 進製表示形式,在 win32 平台上,乙個 short 型佔2 個位元組,所以我們自然希望用4 個 16 進製數字來列印它 short si 1 sprintf s,04x si 產生 ffffffff 怎麼...