LUA指令碼元件系統 三

2021-06-11 20:31:25 字數 1957 閱讀 5098

----讓lua成為c++的子集

2.1 c++與物件導向雜談

上一節,我大概羅列出一些靜態語言的缺陷及動態語言的優點,但這些觀點僅僅只是一些教條式的陳述,並沒有給出一些具有邏輯的推理和證明.至少我認為還有三點沒有講清楚:首先是c++靜態語言的缺陷及這些缺陷是怎樣影響遊戲開發的;其次指令碼語言是如何解決c++的缺陷的;最後,為什麼要使用lua語言而不是其它指令碼語言.

對於第乙個問題,我想先從基本的概念上進行論述,首先來看看物件導向中的兩個基本的概念,」物件」和」類」.

什麼是物件呢?

在哲學層次上來說:

物件(英語:object)指可感知或可想像到的任何事物,既包括客觀存在並可觀察到的事物(如樹木、房屋,抽象的如物價、自由),也包括想像的事物(如神話人物)。(---

在電腦科學層次上來說

物件(object),台灣譯作物件,是物件導向(object oriented) 中的術語,既表示客觀世界問題空間(namespace)中的某個具體的事物,又表示軟體系統解空間中的基本元素。

在軟體系統中,物件具有唯一的識別符號,物件包括屬性(properties)和方法(methods),屬性就是需要記憶的資訊,方法就是物件能夠提供的服務。在物件導向(object oriented) 的軟體中,物件(object)是某乙個類(class)的例項(instance)。

(---

什麼是類呢?

類(class),是一種物件導向計算機程式語言的構造,是建立物件的藍圖,描述了所建立的物件共同的屬性和方法。

(從哲學層次上來講,類也是乙個抽象的概念,因此類也是物件的一種!但在c++中,類不是一種物件,這也決定了c++這種語言在設計層次上就有一些缺陷.

在遊戲開發或者其它的軟體開發過程中,我們首先對需求進行分析,提取出所需要的物件,然後再根據這些物件的屬性和方法抽象出乙個類,再用這個類去建立所需的物件,最後使這些物件相互協作,形成最終產品.用乙個簡單的圖形來描述該流程如下:

這樣的流程程有以下幾個缺陷:

1.      由於抽象的層次會因為對物件的了解和認知程度不同而不同.因此抽象出來的類也會因此而不同.

2.      需求的改變變導致物件的改變,因此描述物件的藍圖—類也會改變

3.      每乙個物件都必需有乙個類來描述,也就是說產生乙個新的物件必須要有乙個新的對應的類來作為它的藍本(雖然這種情況可以通過組合來避免)

在遊戲開發中,需求是不斷變更的,由於以上的缺陷使得這種開發方式不能很好的響應需求的變更.

那麼如何改進上述這個流程來更好的響應開發需求呢?最理想的流程如下:

但這是不現實的,至少到目前為上沒什麼系統可以支援這樣的開發流程,當需求提出後,產品就直接生成了。

我們再來看看這樣的流程

也就是說首先根據需求提取物件,然後用這樣的物件協作組成最終的產品.嗯,看起來不錯,我們減少了由物件抽象出類和類定義物件的的這兩步,從而降低了需求響應的週期.但這樣的流程可以實現嗎?

我們知道,物件由屬性和方法組成,也就說如果語言能支援動態的為物件增加屬性和方法,上面流程就可以實現.但同時我們也知道,靜態的編譯語言是不支援這種操作方式的.因此我們需要一種動態語言,這種語言可以動態的為物件增加物件和方法.除些之外我們還希望這種語言可以完成物件之間的協作從而形成最終的產品.指令碼語言剛好滿足上述的兩個特點,能彌補c++語言的缺陷.

最後回答乙個問題,為什麼用lua而不是其它指令碼語言?首先最主要的原因是筆者的偏好,因為筆者對lua的語言的了解比其它指令碼語言更深入;其次,lua語言是一門小巧,靈活的語言,在執行效率上比其它指令碼語言高;最後,lua已經被很多遊戲開發者使用,有更多的資料和例項可以參考和學習.

SSIS 調式指令碼元件

ssis比dts的日誌架構更加強大,你再也沒有必要寫入乙個msgboxes來獲得你所需要的日誌資訊 因為你的指令碼元件是繼承於乙個有log方法的script ponent元件,這個方法允許你返回乙個訊息到ssis包的日誌中,它會觸發script ponentlogentry的呼叫,例如下面 vb d...

Jmeter四 jmeter指令碼組成和元件搭配

一 jmeter指令碼開發原則 簡單 去除無關的元件,同時能復用的盡量復用。正確 對指令碼或者業務正確性進行必要的判斷,不能少也不能多 200 高效 部分元件僅僅在指令碼開發模式使用,在真正生產環境下不要使用。listener要越少越好 httpwatch抓包 勾選 解析所有內嵌資源 引數 enco...

unity獲取指令碼元件 獲取物件指令碼 變數 名稱

遊戲中相當常使用的功能getcomponent,經常用來get 取得 物件上的component 元件 資訊,若沒有取得元件會回傳null值。gameobject.getcomponent scriptname 如果發現要抓取getcomponent上的值為大寫可能就要注意一下原本的變數是否為小寫如...