現實中的遊戲開發常常面臨兩種互相矛盾的壓力,一方面需要測試和驗證新想法,另一方面又需要快速開發並且按時交付。把指令碼語言整合到遊戲專案中可以提公升團隊的開發效率,並且可以很好地擴充套件原生編譯語言的能力。lua在遊戲開發的許多基礎領域中都表現得很出色。
在遊戲開發團隊中,可能有許多成員都使用lua來完成他們的工作。程式設計師負責將lua整合到遊戲開發環境中,通常,他們會需要編寫一些lua**。遊戲設計師是指令碼語言的主要使用者,因為他們和上層的遊戲設計和資料直接打交道。美術師也會經常使用lua,進行諸如介面布局、設計和3d場景中各種模型的擺放之類的工作。
lua是非常強大的工具,可以用來完成下面這些工作:
1 遊戲介面
遊戲介面是玩家和你的遊戲進行互動的媒介。遊戲介面是乙個遊戲最基本的部分,因為它負責所有和玩家的互動工作。因為它的重要性,所以需要能夠高品質、高效能地執行,並且能夠被測試和持續改善,以最大化地提公升使用者體驗。
lua可以讓介面設計師迅速建立所有主要的介面元素——進行介面布局、管理使用者輸入並且輸出遊戲資料。利用遊戲程式設計師開發的一部分核心的介面控制項和控制函式,介面設計師不僅能負責介面的美術觀感還能控制遊戲的互動。這不僅節省了程式設計師的時間,而且給了美術設計師更大的創作空間,同時還能為介面設計的測試節省出許多時間。**清單3.2展示了使用lua建立文字gui控制項的方法。
**清單3.2 使用lua建立文字gui控制項
2 管理遊戲資料
管理遊戲資料對於遊戲開發者一直都是一種挑戰。遊戲資料定義了遊戲世界中所有物件的引數和特性,如脈衝槍公升級費用、氣墊船的行駛速度等。對於資料密集型遊戲來說,開發者常常利用電子**工具來輸入和儲存資料,然後建立解析工具將其轉換成遊戲中可以使用的格式。這種方法一般用在資料密集型遊戲中,如角色扮演類遊戲(npc或者非遊戲玩家角色的資訊以**結構形式儲存)或者策略類遊戲(角色單位資訊儲存在資料表中)。
lua可以讓這個儲存系統更為簡單,它以lua檔案作為儲存介質讓程式使用相同的資料。通過建立乙個簡單的資料管理系統,變數和型別可以定義在lua中,然後可以很容易地讀取。因為不用關心整個資料處理過程,所以遊戲設計師可以按照需要修改、增加和縮減遊戲資料,而不需要程式設計師的協助。因為lua語法的特性和在指令碼中新增注釋的能力,資料檔案是易讀的。如果需要轉換工具,也非常容易開發,把lua資料輸出到lua檔案,然後在執行時載入。
lua本身並沒有可以直接訪問外部資料庫的能力,但可以用c++開發訪問資料庫的元件,然後再利用luaglue函式整合該元件來達到目的。
在**清單3.3中,我們可以看到如何使用lua示例檔案來直接儲存遊戲資料。在這個例子中,通過使用luaglue函式,向由核心**管理的資料結構中寫入資料。**清單3.3的輸出可參照圖3.1。
**清單3.3 使用lua儲存美國**選舉模擬遊戲(《frontrunner》)的資料
圖3.1 遊戲《frontrunner》的截圖,lua資料的實時顯示
3 事件處理
通常,遊戲中的絕大部分重要的處理都是由事件驅動的,要麼是來自遊戲角色,要麼是來自遊戲中那些互動的**。這些事件可以是簡單的,如使用者按下了鍵,也可以是複雜的,如兩個遊戲實體同時來到了某個地方。
事件驅動的程式設計,對於熟悉了windows開發(事件是windows gui操作的基礎)的使用者來說不是什麼陌生的技術。在c++精心開發的事件系統中,使用lua來接收和處理這些事件,使用者可以在遊戲內部執行機制、高階lua函式和使用者輸入之間建立清晰的反饋流程。乙個簡單的例子是,獲取鍵盤輸入然後向lua事件處理器傳送該事件,同時將該輸入值顯示出來。這個概念將一直貫穿於本書之中——事件會返回事件型別id和驅動事件的物體id,參照**清單3.4。
**清單3.4 獲取按鍵事件的例子
4 儲存和讀取遊戲狀態
儲存和讀取玩家的資料是遊戲開發專案中最具有挑戰的事情之一。因為玩家有時需要暫時離開遊戲,所以需要一種儲存遊戲進度的方法。玩家還需要在某種新的嘗試和挑戰前儲存遊戲狀態,這樣萬一嘗試失敗了還可以恢復遊戲進度。同樣,在開發和測試過程中,開發者會經常需要讀取特定的遊戲狀態來驗證遊戲功能或者確認bug是否已修復。
如果使用lua儲存使用者的核心遊戲資料,就可以用lua作為儲存和讀取當前遊戲狀態的系統。在lua中,遊戲進度檔案是簡單的可執行的lua**的文字檔案。程式設計師或者設計師可以通過進度檔案來獲取當前遊戲的狀態(也可以修改),讀取遊戲進度就和執行lua指令碼一樣簡單。利用lua標準的輸入/輸出函式,編寫乙個函式來儲存遊戲資料到可執行的lua指令碼中是最直接的方法。這個系統的優點是可以讓設計師在開發過程中,根據遊戲資料的增長和刪減來編輯並修改這個函式(不需要特別的讀取函式)。
在開發的最後階段,還可以利用指令碼編譯函式來為遊戲資料加密。
5 人工智慧
人工智慧(ai)在如今的遊戲中非常關鍵——玩家需要精明的、有挑戰性的對手,感覺就像真人一樣。遊戲開發者明白真實世界的ai不是說完全模仿人如何玩和反應,而是為玩家創造這種感覺。多年來,開發者一直在爭論計算機對手「」(計算機對手可以比玩家訪問更多的遊戲資料)的優缺點。這種爭論最好用在別的時間和地方。不過,幾乎所有的開發者都同意,比起ai模擬,ai行為的玩家感知更為重要。
就開發ai判定來說,lua是一種非常高效的工具。有許多人工智慧元件,如路徑尋找,最好留給底層語言來實現。路徑尋找(計算機控制的物體在虛擬世界中的路徑尋找)是乙個資料運算量很大的工作,計算機需要反覆測試可能的路徑來尋找最短或者最直接的路徑。(路徑尋找最好整合到上層的luaglue函式中以便控制相關引數,但還是會在後面的章節中介紹一種lua的實現。)另乙個例子是用最大最小值方法實現的移動判定,一般被用在計算機象棋遊戲中,**之後幾步的移動並嘗試計算出最優的移動步驟。一般來說,「能思考的函式」都需要大量的數學計算,如導航樹或者嘗試錯誤法運算最好都留給底層**。依賴有限的資料集合和引數的人工智慧才更適合lua的特點。lua的優點是設計師可以編寫簡單的模型來試錯,並快速驗證和迭代想法而不需要麻煩程式設計師。想要利用lua高效率實現ai,需要很仔細地設計函式(c函式),讓lua指令碼可以訪問和互動遊戲資料。使用lua作為事件管理系統同樣可以讓ai設計師能應對遊戲開發中的變更,開發出靈活反應的ai系統。
在**清單3.5中,使用者可以看到使用lua來評估可能的競選旅行目的地,評估的依據是這個州的選舉人票數量和這個州的支援率。
**清單3.5 評估虛擬的美國**候選人應該去哪個州的lua人工智慧函式
6 快速構建原型
商業化的遊戲必須為玩家提供高效能的體驗,掉幀和處理延遲的現象在如今競爭激烈的市場中是絕不允許的。程式概要分析(profiling)是行之有效的確定效能瓶頸的方法,但必須在所有功能都開發完成並正確工作的前提下才能進行。原型開發和效能改善一般是不能同時進行的。
lua是構建可移植的核心遊戲功能原型的不錯工具。因為lua可以整合原生語言開發的元件,所以移植單獨的lua函式到c++,對於其他lua函式來說是不需要變更的。它可以讓設計師在構建原型時,如果碰到有高效能需求的函式就可以讓程式設計師用底層語言來實現。因為程式的演算法結構已經有了,所以c函式和luaglue呼叫都可以高效能、無縫地整合在專案中。
7 小結
在遊戲開發領域,lua和c++是乙個功能十分強大的組合。對於gui開發、事件管理、資料儲存和獲取、遊戲進度儲存和載入以及人工智慧這些遊戲開發工作,需要能夠快速地構建原型、測試和迭代設計,而這些正是lua所擅長的。在核心底層語言開發的專案中,頻繁的變更會導致系統的不穩定,並讓開發者不能專注於更重要的開發任務。使用lua環境分擔這些工作,可以讓設計師和程式設計師快速而安全地使用指令碼來設計、測試和實現遊戲功能。
本書是資深lua遊戲開發工程師10餘年工作經驗和智慧型的結晶,lua語言創始人親自作序推薦,是lua遊戲開發領域最具實戰意義和代表性的著作之一。它不僅詳細講解了在遊戲開發中使用lua的各種技術細節、方法技巧和最佳實踐,而且講解了如何使用lua作為主要工具將遊戲設計轉化為**實現的過程。此外,它還重點闡述了lua語言的核心要素。最重要的是,本書包含大量精心設計的案例,並附贈了完整的源**,可操作性極強。
豆瓣收藏:
移動開發新寵 Lua語言
當移動開發成為如日中天的技術話題,這必將帶動一些新的技術熱點的興起,之前並未廣泛應用的lua語言,因其靈活 輕量 高效的效率成為iso平台上的新寵。tiobe程式語言流行度排行榜的統計資料 於google bing yahoo 等主流搜尋引擎,以及各大技術 發布的招聘資訊,在很大程度上代表了程式語言...
移動開發新寵 Lua語言
當移動開發成為如日中天的技術話題,這必將帶動一些新的技術熱點的興起,之前並未廣泛應用的lua語言,因其靈活 輕量 高效的效率成為iso平台上的新寵。tiobe程式語言流行度排行榜的統計資料 於google bing yahoo 等主流搜尋引擎,以及各大技術 發布的招聘資訊,在很大程度上代表了程式語言...
lua學習 遊戲中的Lua
lua作為一種指令碼語言,可以快速地開發遊戲的原型。提高遊戲的開發效率。最熟悉不過的就是作為魔獸世界 博德之門 憤怒的小鳥等遊戲的指令碼語言。但是,具體來說,lua在遊戲中可以做什麼呢?在遊戲中,lua可以用來完成下面這些工作 編輯遊戲的使用者介面 定義 儲存和管理基礎遊戲資料 管理實時遊戲事件 建...