[予約] [ゲーム開発] Luaの中でオブジェクト指向機能を実装 - シミュレーションクラス、継承、ポリモーフィズム[ゲーム開発] Luaのオブジェクト指向機能を実装 - シミュレーションクラス、継承、ポリモーフィズム[ゲーム開発]白スクールプロセス要素のLuaのルックアップテーブルから元Lua--テーブル要素法を見て

[] Luaのオブジェクト指向ゲーム開発特性 - シミュレーション、継承、多型

 

I.はじめに

  それはその発明から、数え切れないほどのゲームは開発言語としてのLuaを使用していますので、Luaは、非常に強力な、非常に柔軟なスクリプト言語です。しかし、スクリプト言語として、Luaはまた、自身の欠点を持っていることは、それ自体でオブジェクト指向機能を提供しないということである、と開発者のためのオブジェクト指向機能が存在しない場合はゲーム開発は、大規模で複雑なプロジェクトであるいくつかを持って来るためにバインドされています不便。幸いなことに、このような強力なLuaのテーブルはデータ構造を有し、その後、我々は簡単にクラス、継承、および多型と他のオブジェクト指向プログラミングLuaの特性を有するをシミュレートすることができるテーブル要素(メタテーブル)と一緒にそれを使用します。

知識の第二に、前提

  慣例により、我々は最初の私たちがフォローアップのコードを理解するために必要な前提知識を理解しておきます。

表1(表)

  (1)テーブルのようなデータの異なるタイプ、作成する私たちを助けるために、ルアのデータ構造である:配列、辞書などを、

  (2)表は、アレイへのインデックスとしての値の任意のタイプを使用することができ、連想配列であるが、この値はゼロ、すべてのインデックス値が必要とされている「[」と「]」囲まれていることができない、文字列がある場合また、ブラケットおよび引用符を削除することができ、[]で囲まれていない場合、それは文字列インデックスに考えられている、すなわち、Luaのテーブルは、固定サイズは、あなたが自分のニーズに応じて拡張することはできません。

  (3)テーブルは、一般的にインデックスを記述せず、デフォルトの初期開始インデックスであり、インデックス番号は、バック1つの注釈の順序に従って、考慮されます。

  (4)だけ変数テーブル参照アドレス、テーブルの動作はデータに影響を与えないであろう。

  (5)テーブルサイズが固定長ではなく、自動的に新しいデータの長さを増加させるが挿入されています。

  (6)データに格納されたテーブルは、関数および表を含め、任意のタイプであってもよいです。

  (7)すべての要素の間でテーブルを、常にカンマで「」分離。

表2要素(メタテーブル)

  メタテーブルの概念と、それの要旨については、我々は持っている「[ゲーム開発]白い学校Lua--のLuaから元のテーブルを参照するには、プロセス要素のルックアップテーブル、要素法は、深さで調査された」ここで、このブログでそれらを繰り返すことはしません、忘れたり、見てみることができ、小さなパートナーに精通していません。

三つは、Luaはクラスで実装され、継承、多態性

1.実装クラスのLuaを使います

  オブジェクト指向機能では、一般的に、クラスのクラス名、コンストラクタ、メソッドのメンバー、特性等。ここでは、Luaのテーブル内に実装され、どのようにこれらの特性テーブル要素シミュレーションクラス、Class.luaコードは次のとおりです。

コードをコピー
同様にclass属性の名前を宣言し、属性の初期値与え1--クラス宣言、
 2級= {X = 0、Y = 0}を
 3 - 。設定されたインデックスのメタデータテーブル、事の種類をシミュレートしたいです、この操作は非常に重要です
 。4 =クラスクラス.__インデックス
 。5 -施工方法、コンストラクタ名だけ)(、新しい新しい名前の生活習慣を始めて
 6クラス機能:新新(X、Y)を。
 7ローカルセルフ= {} - 。 -自己の初期化、フレーズがない場合、その後、変化があれば、他のオブジェクトが変更され作成されたオブジェクト・クラス
 8 setmetatable(自己、クラス) -テーブルの要素が設定されている自己クラス
 9 self.x X = -初期属性値
10 = Yのself.y 
11自己復帰-戻る自体。
12終わりである
13である
14 -クラスのここで定義された他の方法
15のクラスの関数:テスト()
16プリント(self.x、self.y)
。17エンド
18である
19。クラス関数:PLUS()
20はself.x self.xの+ 1 = 
21がself.y self.y用+ 1 = 
22端部であります
コードをコピー

  簡単に言えば、Luaの、ファクトテーブルのクラス、テーブルを保存することができるので、通常の変数と関数の両方を保存することができ、または別のテーブルには、この機能を利用する、我々はオブジェクト指向のクラスのメソッドを実装し、(フィールド)の属性および工法。人民元は、このステップは不可欠であり、テーブルと__index要素法を設定し、我々は、継承やポリモーフィズム、または任意のそのようなことを実現するために、そのルックアップメカニズムの助けを必要としています。

2. Luaの継承を使用します

  上記では、我々は継承を実現することは困難ではありませんので、以下のように、SubClass.luaコードは、クラスでのLuaを達成しました:

コードをコピー
。必要1 'クラス' 
 2 
 3 -新たな特性Zを宣言する   
 4つのサブクラス= {Z} = 0。   
 5 -クラスを設定員表   
 6 setmetatable(サブクラスクラス)   
 7 -インデックステーブルが設けられ、クラス定義と同じですそれ自体として   
 8つのサブクラス.__インデックス=サブクラス。   
 9 -これは、コンストラクタである。
10のサブクラス機能:新規新しい(X、Y、Z)   
11ローカルセルフ= {} -オブジェクト自体を初期化する。   
12自己=クラス:新しい(x 、y)は-親クラス・オブジェクト自体に設定、このステートメントは、等価スーパー他の言語は、スーパークラスのコンストラクタを呼び出すように理解することができるされている
13 setmetatable(自己、サブクラス) -テーブルが要素オブジェクト自体サブクラスクラス設定されている   
14セルフ.Z = Z - = 0でない場合は、新しいプロパティを初期化し、宣言される   
セルフリターン15   
16の終了   
。17 
18である-新しい方法で定義された   
。19のサブクラス機能:GO()   
20 self.x self.x = + 10   
21終了  
22は
23であること-方法は、オーバーライドに対応し、親クラスを再定義
24のサブクラス関数:テスト()   
25プリント(self.x、self.y、self.z)   
26が終了します  
コードをコピー

  コメント内のコードは非常に完全されている、重要な点は、その親クラスのクラスとしてサブクラスのメタテーブルを設定し、かつ容易に継承を実装することで、これはテーブルルックアップ・メカニズムのおかげであるということです。サブクラスのサブクラスでは、我々は自由に新しいメソッドと新しい独自のサブクラスをフィールドすることができます。しかし、また、再定義またはカバー/オーバーライドするJavaのように、親クラスを書き換える、サブクラスは親クラスの仮想メソッドをオーバーライドします。これらによって、我々は、オブジェクト指向の多型をシミュレートすることができます。

多状態のLUAの3.

  次のようにここでは、我々が期待するよう我々は、上記のコードかどうかをテストする、私たちの入り口としてのプログラムMain.luaそれを作成し、Main.luaコードは次のとおりです。

コードをコピー
必要1 'クラス'。
 2必要'サブクラス' 
 3。
 4 =ローカルクラスA:新しい新しい() -親クラスのオブジェクトをインスタンス化し、親クラスを呼び出し
 5 A:PLUS()
 。6 A:試験()を
 図7 
 8 A =サブクラス:新しい() - クラスオブジェクトとインスタンス化サブユニット
 9:プラス() -サブクラスのオブジェクトとメソッドは、親クラスへのアクセス持っている
10: -サブサブクラスオブジェクトの呼び出しに行くを()メソッド新しいクラス
11:テスト() -メソッドオーバーライドするサブクラスのオブジェクトの呼び出し
コードをコピー

  出力は次のように実行しています:

1 1 
11 1 0

  まず、私たちは、親クラスのオブジェクトをインスタンス化し、期待に沿って、親クラスのメソッド、11の出力結果を呼び出します。その後、我々は再びオブジェクトは、サブクラスをインスタンス化され、その後、成功した親クラスのメンバ変数やメソッドにアクセスし、また、サブクラスで新しいメソッドにアクセスすることができ、最終的に私たちは、親クラスのオーバーライドされた仮想関数を実行しこの方法は、結果1110は、正しい出力します。

IVの概要

  単にいくつかの手順を実行することにより、我々はLuaのである成功裏にシミュレートされたクラスは、私たちのアプリケーションの開発を与えることができ、継承やポリモーフィズムの特性は、利便性の多くをもたらしています。ユニティゲーム開発では、例えば、tolua /ウルアユニティゲーム開発は、彼らは非常に強力な機能が、軟膏で飛ぶが開発したとき、彼らはそう、オブジェクト指向機能を提供していないということです、ホット更新スキームで、直接グローバル関数の多くは、 、開発の効率に影響を与えるグローバル変数と手続き開発プロセス、だけでなく、その後のメンテナンス不便のために。彼らはオブジェクト指向開発を実装することができるようにだから我々は、同様の方法によって、このブログのエントリは、tolua /ウルアを向上させることができます。もちろん、このブログのエントリコードが唯一のように、それは実際には非常に簡単です、開始商業的なプロジェクトで改善し、完璧の多くを行うべきニーズを使用したいです。彼らはオブジェクト指向の機能をサポートするように、tolua /ウルアを改善する方法については、今後の章で議論していきます。

   このブログ内のコードはGitHubのに同期されています:https://github.com/XINCGer/Unity3DTraining/tree/master/SomeTest/Lua_Classは    フォークを歓迎します!

 

 

著者:子供の馬山小グループ
出典:http://www.cnblogs.com/msxh/p/8469340.html 
他人の労働を尊重してくださいは、共有は、美徳となっ転載を歓迎します。また、プレゼンテーションとコード間違った場合の面での記事は、批判を歓迎します。あなたの足跡は、コメントを歓迎しているままに!

I.はじめに

  それはその発明から、数え切れないほどのゲームは開発言語としてのLuaを使用していますので、Luaは、非常に強力な、非常に柔軟なスクリプト言語です。しかし、スクリプト言語として、Luaはまた、自身の欠点を持っていることは、それ自体でオブジェクト指向機能を提供しないということである、と開発者のためのオブジェクト指向機能が存在しない場合はゲーム開発は、大規模で複雑なプロジェクトであるいくつかを持って来るためにバインドされています不便。幸いなことに、このような強力なLuaのテーブルはデータ構造を有し、その後、我々は簡単にクラス、継承、および多型と他のオブジェクト指向プログラミングLuaの特性を有するをシミュレートすることができるテーブル要素(メタテーブル)と一緒にそれを使用します。

知識の第二に、前提

  慣例により、我々は最初の私たちがフォローアップのコードを理解するために必要な前提知識を理解しておきます。

表1(表)

  (1)テーブルのようなデータの異なるタイプ、作成する私たちを助けるために、ルアのデータ構造である:配列、辞書などを、

  (2)表は、アレイへのインデックスとしての値の任意のタイプを使用することができ、連想配列であるが、この値はゼロ、すべてのインデックス値が必要とされている「[」と「]」囲まれていることができない、文字列がある場合また、ブラケットおよび引用符を削除することができ、[]で囲まれていない場合、それは文字列インデックスに考えられている、すなわち、Luaのテーブルは、固定サイズは、あなたが自分のニーズに応じて拡張することはできません。

  (3)テーブルは、一般的にインデックスを記述せず、デフォルトの初期開始インデックスであり、インデックス番号は、バック1つの注釈の順序に従って、考慮されます。

  (4)だけ変数テーブル参照アドレス、テーブルの動作はデータに影響を与えないであろう。

  (5)テーブルサイズが固定長ではなく、自動的に新しいデータの長さを増加させるが挿入されています。

  (6)データに格納されたテーブルは、関数および表を含め、任意のタイプであってもよいです。

  (7)すべての要素の間でテーブルを、常にカンマで「」分離。

表2要素(メタテーブル)

  メタテーブルの概念と、それの要旨については、我々は持っている「[ゲーム開発]白い学校Lua--のLuaから元のテーブルを参照するには、プロセス要素のルックアップテーブル、要素法は、深さで調査された」ここで、このブログでそれらを繰り返すことはしません、忘れたり、見てみることができ、小さなパートナーに精通していません。

三つは、Luaはクラスで実装され、継承、多態性

1.実装クラスのLuaを使います

  オブジェクト指向機能では、一般的に、クラスのクラス名、コンストラクタ、メソッドのメンバー、特性等。ここでは、Luaのテーブル内に実装され、どのようにこれらの特性テーブル要素シミュレーションクラス、Class.luaコードは次のとおりです。

コードをコピー
同様にclass属性の名前を宣言し、属性の初期値与え1--クラス宣言、
 2級= {X = 0、Y = 0}を
 3 - 。設定されたインデックスのメタデータテーブル、事の種類をシミュレートしたいです、この操作は非常に重要です
 。4 =クラスクラス.__インデックス
 。5 -施工方法、コンストラクタ名だけ)(、新しい新しい名前の生活習慣を始めて
 6クラス機能:新新(X、Y)を。
 7ローカルセルフ= {} - 。 -自己の初期化、フレーズがない場合、その後、変化があれば、他のオブジェクトが変更され作成されたオブジェクト・クラス
 8 setmetatable(自己、クラス) -テーブルの要素が設定されている自己クラス
 9 self.x X = -初期属性値
10 = Yのself.y 
11自己復帰-戻る自体。
12終わりである
13である
14 -クラスのここで定義された他の方法
15のクラスの関数:テスト()
16プリント(self.x、self.y)
。17エンド
18である
19。クラス関数:PLUS()
20はself.x self.xの+ 1 = 
21がself.y self.y用+ 1 = 
22端部であります
コードをコピー

  簡単に言えば、Luaの、ファクトテーブルのクラス、テーブルを保存することができるので、通常の変数と関数の両方を保存することができ、または別のテーブルには、この機能を利用する、我々はオブジェクト指向のクラスのメソッドを実装し、(フィールド)の属性および工法。人民元は、このステップは不可欠であり、テーブルと__index要素法を設定し、我々は、継承やポリモーフィズム、または任意のそのようなことを実現するために、そのルックアップメカニズムの助けを必要としています。

2. Luaの継承を使用します

  上記では、我々は継承を実現することは困難ではありませんので、以下のように、SubClass.luaコードは、クラスでのLuaを達成しました:

コードをコピー
。必要1 'クラス' 
 2 
 3 -新たな特性Zを宣言する   
 4つのサブクラス= {Z} = 0。   
 5 -クラスを設定員表   
 6 setmetatable(サブクラスクラス)   
 7 -インデックステーブルが設けられ、クラス定義と同じですそれ自体として   
 8つのサブクラス.__インデックス=サブクラス。   
 9 -これは、コンストラクタである。
10のサブクラス機能:新規新しい(X、Y、Z)   
11ローカルセルフ= {} -オブジェクト自体を初期化する。   
12自己=クラス:新しい(x 、y)は-親クラス・オブジェクト自体に設定、このステートメントは、等価スーパー他の言語は、スーパークラスのコンストラクタを呼び出すように理解することができるされている
13 setmetatable(自己、サブクラス) -テーブルが要素オブジェクト自体サブクラスクラス設定されている   
14セルフ.Z = Z - = 0でない場合は、新しいプロパティを初期化し、宣言される   
セルフリターン15   
16の終了   
。17 
18である-新しい方法で定義された   
。19のサブクラス機能:GO()   
20 self.x self.x = + 10   
21終了  
22は
23であること-方法は、オーバーライドに対応し、親クラスを再定義
24のサブクラス関数:テスト()   
25プリント(self.x、self.y、self.z)   
26が終了します  
コードをコピー

  コメント内のコードは非常に完全されている、重要な点は、その親クラスのクラスとしてサブクラスのメタテーブルを設定し、かつ容易に継承を実装することで、これはテーブルルックアップ・メカニズムのおかげであるということです。サブクラスのサブクラスでは、我々は自由に新しいメソッドと新しい独自のサブクラスをフィールドすることができます。しかし、また、再定義またはカバー/オーバーライドするJavaのように、親クラスを書き換える、サブクラスは親クラスの仮想メソッドをオーバーライドします。これらによって、我々は、オブジェクト指向の多型をシミュレートすることができます。

多状態のLUAの3.

  次のようにここでは、我々が期待するよう我々は、上記のコードかどうかをテストする、私たちの入り口としてのプログラムMain.luaそれを作成し、Main.luaコードは次のとおりです。

コードをコピー
必要1 'クラス'。
 2必要'サブクラス' 
 3。
 4 =ローカルクラスA:新しい新しい() -親クラスのオブジェクトをインスタンス化し、親クラスを呼び出し
 5 A:PLUS()
 。6 A:試験()を
 図7 
 8 A =サブクラス:新しい() - クラスオブジェクトとインスタンス化サブユニット
 9:プラス() -サブクラスのオブジェクトとメソッドは、親クラスへのアクセス持っている
10: -サブサブクラスオブジェクトの呼び出しに行くを()メソッド新しいクラス
11:テスト() -メソッドオーバーライドするサブクラスのオブジェクトの呼び出し
コードをコピー

  出力は次のように実行しています:

1 1 
11 1 0

  まず、私たちは、親クラスのオブジェクトをインスタンス化し、期待に沿って、親クラスのメソッド、11の出力結果を呼び出します。その後、我々は再びオブジェクトは、サブクラスをインスタンス化され、その後、成功した親クラスのメンバ変数やメソッドにアクセスし、また、サブクラスで新しいメソッドにアクセスすることができ、最終的に私たちは、親クラスのオーバーライドされた仮想関数を実行しこの方法は、結果1110は、正しい出力します。

IVの概要

  単にいくつかの手順を実行することにより、我々はLuaのである成功裏にシミュレートされたクラスは、私たちのアプリケーションの開発を与えることができ、継承やポリモーフィズムの特性は、利便性の多くをもたらしています。ユニティゲーム開発では、例えば、tolua /ウルアユニティゲーム開発は、彼らは非常に強力な機能が、軟膏で飛ぶが開発したとき、彼らはそう、オブジェクト指向機能を提供していないということです、ホット更新スキームで、直接グローバル関数の多くは、 、開発の効率に影響を与えるグローバル変数と手続き開発プロセス、だけでなく、その後のメンテナンス不便のために。彼らはオブジェクト指向開発を実装することができるようにだから我々は、同様の方法によって、このブログのエントリは、tolua /ウルアを向上させることができます。もちろん、このブログのエントリコードが唯一のように、それは実際には非常に簡単です、開始商業的なプロジェクトで改善し、完璧の多くを行うべきニーズを使用したいです。彼らはオブジェクト指向の機能をサポートするように、tolua /ウルアを改善する方法については、今後の章で議論していきます。

   このブログ内のコードはGitHubのに同期されています:https://github.com/XINCGer/Unity3DTraining/tree/master/SomeTest/Lua_Classは    フォークを歓迎します!

 

 

著者:子供の馬山小グループ
出典:http://www.cnblogs.com/msxh/p/8469340.html 
他人の労働を尊重してくださいは、共有は、美徳となっ転載を歓迎します。また、プレゼンテーションとコード間違った場合の面での記事は、批判を歓迎します。あなたの足跡は、コメントを歓迎しているままに!

おすすめ

転載: www.cnblogs.com/shan-mu/p/11334668.html