Lua(setmetatable,_index,self,メタテーブル)+(cococos 2 d+lua情報表示ボックスの実装と表示)

18056 ワード

次の3つのステップは、cococos 2 d+luaの開発環境で情報表示ボックスを実現し、それを表示する実現方法です.
  • プロジェクトには共通のパネルクラスbaseDialogがある.luaファイル)、
  • baseDialog={}
    function baseDialog:new()
        local nc={
    bgLayer=nil,--背景sprite
    ダイアログ・レベル
    パネルラインBg、--下枠
        }
        setmetatable(nc,self)
        self.__index=self
        return nc
    end
    function baseDialog:init(bgSrc,isfullScreen)
         self.dialogLayer=CCLayer:create()
    --ボタン、背景などを追加
         return self.dialogLayer--表示ボックスのあるレイヤ
    end
    function baseDialog:resetTab()
    end
    --ユーザーが特別なニーズに対応
    function baseDialog:doUserHandler()
    end
  • 具体的に表示するパネルの実装は以下の通りである(ADialog.luaファイル):
  • ADialog=baseDialog:new()
    function ADialog:new()
        local anc={}
        setmetatable(anc,self)
        self.__index=self
        self.tab1=nil
        self.tab2=nil
        return anc
    end
    function ADialog:resetTab()
    end
  • 表示パネル:
  • local td=ADialog:new()
    local dialog=td:init("panelBg.png",true)
    sceneGame:addChild(dialog,3)--追加されたsceneGameにはCCLayer(レイヤ)があります.
    知識ポイントのまとめ:
    setmetatable(anc,self)--selfをancのメタテーブルに設定し、いくつかの操作方法を定義します.
    self.__index=self--__indexはメタメソッド、self._index=selfは、ancで見つからない場合はselfに、selfで見つからない場合はselfのメタメソッドに、メタメソッドがない場合はnilに戻るようにコンパイラに伝えるために使用されます.
    Luaがテーブル要素を検索するルール:1.テーブルで検索し、見つかった場合は要素を返し、見つからない場合は続行します.このテーブルにメタテーブルがあるか否かを判断し、メタテーブルがなければnilを返し、メタテーブルがあれば継続する.メタテーブルの有無を判断するindexメソッド、もし_indexメソッドがnilの場合はnilを返します(注意:メタテーブルのみを設定し、_indexメソッドがなければメタテーブルで検索しません).もし__indexメソッドはテーブルであり、1、2、3を繰り返す.もし__indexメソッドが関数である場合、その関数の戻り値を返します.
    luaの検索メカニズムは(例えばtd:init()ADialogの一般テーブルancでinitメソッドを検索し、まずADialogクラスでinitメソッドを検索し、ADialogにそのメソッドがあれば直接実行し、そうでなければbaseDialogで検索し、baseDialogにもなければnilに戻る)
    self luaでオブジェクト向けを実現
    http://www.jellythink.com/archives/529この博文はLuaの中のオブジェクト向けのプログラミングの説明のとても詳しいことに対して、時間があって多く見ることができます
    以下は私が見た後のまとめです.
    local tb1 = {a = 1, b = 2}
    local tb2 = {a = 1, b = 2}
    local tb3 = tb1
    
    if tb1 == tb2 then
         print("tb1 == tb2")
    else
         print("tb1 ~= tb2")
    end
    
    tb3.a = 3
    print(tb1.a)

    上記コードは、tb 1~=tb 2を出力し、同じ値を有する2つのオブジェクトが2つの異なるオブジェクトであることを示す.
    上記コード出力tb 1.aの値は3であり、Luaのtableが参照タイプであることを示し、tb 1をtb 3に付与すると、tb 1とtb 3はいずれも{a=1,b=2}というコードブロックを指し、中のaまたはbの値を操作することができる.このときtb 1またはtb 3をnilに割り当てると、{a=1,b=2}コードブロックに対するtb 1またはtb 3の参照がキャンセルされ、tableの値が操作されなくなる.
    Account = {balance = 0}
    function Account.withDraw(v)
         Account.balance = Account.balance - v
    end
    
    Account.withDraw(10) --     
    print(Account.balance)
    Luaではtableに基づいて実装されたモジュールであり、上のコードはtableで関数を定義し、tableは独自の操作を有する.
    a = Account
    Account = nil
    a.withDraw(100)
    の上の操作が間違っているのは、前に関数を定義したときに関数がAccountというオブジェクトしか呼び出せないことを指定したためです.aがこの関数を呼び出すことができるように、関数の中で文をa.balance=a.balance-vに変更する必要があります.これは面倒です.上の関数定義を次のselfに変更します.
    Account = {balance = 0}
    function Account.withDraw(self, v)
         self.balance = self.balance - v
    end
    
    a = Account
    Account = nil
    a.withDraw(a, 100)
    print(a.balance)
    selfというキーワードは、関数を呼び出すときに、関数内の計算が関数を呼び出すオブジェクトで指定されたtableの内容を使用することを指定します.
    luaでAccount.withDrawをAccount:withDrawに変更してselfを非表示にします.
    だから私たちが今よく見ているコードはこうです.
    Account = {balance = 0}
    function Account:withDraw(v) --        ":"
         self.balance = self.balance - v
    end
    
    a = Account
    Account = nil
    a:withDraw(100) -- ":"
    print(a.balance)

    コロンの役割は簡単です.メソッド定義に追加の非表示パラメータを追加し、メソッド呼び出しに追加の実パラメータを追加します.
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~