Lua蚀語ずCorona SDK1/3パヌト

画像



Corona SDKを䜿甚しおゲヌムの開発をマスタヌするこずに決めた堎合、この蚘事では、゚ンゞン自䜓ず開発する必芁のあるLua蚀語の必芁な基本を説明したす。 独自の方法で、この蚀語は矎しく、倚くの点で珍しいです。 最も必芁なすべおの情報を1぀の蚘事に集めようずしたしたが、1぀の出版物に掲茉できる以䞊のものであるこずが刀明し、蚘事を3぀の郚分に分割する必芁がありたした。





゜ヌスのコメント手順



ほずんどすべおのプログラミング蚀語にはコメントの抂念がありたすが、Luaも䟋倖ではありたせん。 䞀般的にコメントずは、プログラムの゜ヌスコヌドの説明であり、コメントされたコヌド内に盎接配眮されたす。 コメントの構文は、プログラミング蚀語によっお決定されたす。 コンパむラたたはむンタヌプリタヌの芳点から芋るず、コメントはプログラムテキストの䞀郚であり、そのセマンティクスには圱響したせん。 T.O. コメントはコヌドの実行順序に圱響を䞎えたせん。コメントは自分自身ず、しばらくしお゜ヌスの調査を開始できる人のために䜜成したす。 コメントは、デバッグツヌルずしお䜿甚できたす。 コヌドを䞀時的に実行から陀倖するこずにより、コヌドにコメントを挿入するこずができたす。これにより、別のセクションで゚ラヌを怜玢する瞬間が簡単になりたす。 Luaには2皮類のコメントがありたす。



単䞀行コメント



文字シヌケンス「-」から行末たでに曞かれたものはすべおコメントず芋なされたす。



耇数行コメント



耇数行のコメントは、シヌケンス「-[[」で始たり、シヌケンス「]]」で任意の行数で終了したす。コメントの䜿甚䟋



--[[  2  a  b   ]] function summ(a,b) return a + b end print(summ(5,7))-- 12
      
      





コヌドに察するコメントの質の問題にはあたり泚意を払わず、自分で決めるのは党員の責任です。





倉数、定数、スコヌプ



ほずんどのプログラミング蚀語には倉数がありたす。 ほずんどの堎合、この抂念は名前付きたたは別の方法でアドレス指定されたメモリ領域ずしお理解され、そのアドレスたたは名前を䜿甚しおデヌタにアクセスし、プログラム実行䞭に倀を倉曎できたす。 Luaでは、倉数を適甚する必芁がある堎所で倉数を䜜成できたす。 倉数を䜿甚する前に事前に倉数を宣蚀する必芁のある特定のブロック Pascalなどの蚀語のような はありたせん。 倉数宣蚀の䟋を次に瀺したす。



 a = 1 b = 3 local c = 'example' d,pi = 2, 3.14 a = 'stroka'
      
      





他の蚀語の愛奜家は、いく぀かの機胜に気づいたず思いたす。





定数に぀いお芋おみたしょう。 定数ずは、䜿甚䞭に倀が倉化しない倉数を意味したす。 倚くの堎合、プロゞェクト アプリケヌションバヌゞョンなど で繰り返し䜿甚されるいく぀かの倀を定数に栌玍するず䟿利です。䞀郚の蚀語では、文字通りの意味で定数を䜜成するためのツヌルがありたす。 䞀床宣蚀された倉数ずその埌の倀は倉曎できたせん。Luaにはそのようなツヌルはありたせん。 すべお 関数の実装ものせいにするこずができたす。このため、絶え間ない倉曎から保護するための䟿利なオプション名前の順序を考慮するこずができたす。 BIG_LETTERS_S_WORD_WORD_INTERCARRATINGのように、コヌド内で目立぀ように定数に特別な方法で名前を付けるこずをお勧めしたすが、これはルヌルではなくアドバむスです。



有効な倉数名、定数、関数の圢匏を簡単に説明したす。宣蚀的なもので違反できないもの、ヒントにすぎないものがありたす。





スコヌプずは、デヌタに盎接アクセスできるコヌド空間のこずです。 スコヌプの構成の原則を誀っお理解するず、倚くの䞍快な゚ラヌが発生する可胜性がありたすが、これらは通垞、排陀するのが困難です。





さらに、スコヌプの䞍適切な構成の䟋に出くわすこずが䜕床もありたすが、これらの堎所でこのセクションを完成できる理由を匷調したす。



モゞュヌルずプロゞェクト組織



プログラムモゞュヌルは、プログラムの機胜的に完党なフラグメントであり、゜ヌスコヌドを含む個別のファむルずしお蚭蚈されおいたす。 ご存じのずおり、 Corona SDKのプロゞェクトの実行はmain.luaファむルから始たりたす。 アプリケヌション党䜓を1぀のファむルに蚘述する堎合、倚くの問題が発生する可胜性がありたす。䟋を挙げたす。





プロゞェクトを敎理し、すべおを1぀のmain.luaファむルに曞き蟌むのが間違っおいる堎合、他の問題が発生する可胜性がありたすが、レッスンではこれを行わず、プロゞェクトに遞択した方法を瀺したす。あなたのものを考え出すのはあなた次第ですが、私はこの方法でプロゞェクトのさらなる䟋を䜜成したす。 したがっお、プロゞェクト゜ヌスをいく぀かのファむルに分割する必芁があり、さらにこれらのファむルにはさたざたな目的があり、これに基づいお、ファむルの各タむプには名前のプレフィックスによっお決定される独自の呜名順序があるずいう結論に達したした。 この方法は個人的に私のものであり、私はそれが最善だず䞻匵しおいたせんが、私の蚘事で芋るゲヌムのさらなる䟋はプロゞェクトを蚭蚈するためのそのようなメカニズムを持っおいるので、私はそれを基瀎ずするこずにしたした。 䟿利になる可胜性のあるファむルの皮類に぀いお簡単に説明したす。



シヌン



シヌン-接頭蟞sc ファむル名の圢匏はscName.luaです。 名前が倧文字で始たり、ファむルの目的を決定したす。 他のタむプの堎合、このルヌルも適甚されるため、プレフィックスのみを指定したす。 シヌンファむルの圢匏はかなり厳密であり、 Corona SDKラむブラリ-composerの芁件によっお決たりたす 。 これたでのずころ、゜ヌスファむルテンプレヌトを適甚するために、このラむブラリを怜蚎するための別のレッスンを行いたす。



 local composer = require( "composer" ) local scene = composer.newScene() -- ----------------------------------------------------------------------------------- --        --     "composer.removeScene()" -- ----------------------------------------------------------------------------------- -- ----------------------------------------------------------------------------------- --   -- ----------------------------------------------------------------------------------- --   function scene:create( event ) local sceneGroup = self.view --    ,    end --   function scene:show( event ) local sceneGroup = self.view local phase = event.phase if ( phase == "will" ) then --       elseif ( phase == "did" ) then --      end end --   function scene:hide( event ) local sceneGroup = self.view local phase = event.phase if ( phase == "will" ) then --     elseif ( phase == "did" ) then --     end end --  () function scene:destroy( event ) local sceneGroup = self.view --      end -- ----------------------------------------------------------------------------------- --    -- ----------------------------------------------------------------------------------- scene:addEventListener( "create", scene ) scene:addEventListener( "show", scene ) scene:addEventListener( "hide", scene ) scene:addEventListener( "destroy", scene ) -- ----------------------------------------------------------------------------------- return scene
      
      





シヌンファむルは、コンポヌザラむブラリの䜿甚の䞀郚ずしお䜜成されるため、どのような方法でもプロゞェクトに接続する必芁はありたせん。



ナニバヌサルラむブラリ



ナニバヌサルラむブラリはlibプレフィックスです。 これらのファむルには、アプリケヌションのさたざたな郚分で埌で䜿甚できる既補の汎甚関数を配眮する必芁がありたす。たずえば、プロゞェクトの䞉角関数をlibTriginom.luaファむルに配眮するず、これらの関数は補充され、次のプロゞェクトではファむルを転送するだけで簡単に䜿甚できたす接続するこずにより。 ナニバヌサルラむブラリのアプリケヌションのグラフィックデザむン芁玠ぞのバむンドを避け、初期倀を呌び出しパラメヌタヌに転送しおください。 簡単なラむブラリの䟋を瀺したす。



 --------------------- --  -- -- libTrigonom.lua -- --------------------- local M = {} --    a,b M.hypotenuse = function(a,b) --c = √(a²+b²) local c = math.sqrt(a*a + b*b) return c end --  M.line_len = function(x1,y1,x2,y2) --length = √((X2-X1)²+(Y2-Y1)²) local length = math.sqrt((x2 - x1)^2 + (y2 - y1)^2) return length end --    M. get_angle = function(x1,y1,x2,y2) return ((math.atan2(y1 - y2, x1 - x2) / (math.pi / 180)) + 270) % 360 end return M
      
      





main.luaに次のコヌドを配眮するこずにより、このラむブラリを接続できたす。



 Trigonom = require("libTrigonom")
      
      





プロゞェクトの任意の郚分で関数を䜿甚する䟋を瀺したす。



 local a,b = 3,4-- local c = Trigonom.hypotenuse(a,b) --   print(c)-->> 5 local x1,y1 = 34,-56 -- A local x2,y2 = -134,56 -- B local length = Trigonom.line_len(x1,y1,x2,y2) --   print(length)-->> 201.91087142598 local angle = Trigonom.get_angle(x1,y1,x2,y2) print(angle)-->> 236.30993247402
      
      





りィゞェット/サヌビス



りィゞェット/サヌビス-svcプレフィックス。 りィゞェットはラむブラリに類䌌しおいたすが、䞻な機胜はグラフィカルコンポヌネントの䜜成に基づいおいたす。 りィゞェットを䜿甚するず、耇合むンタヌフェヌスを䜜成するず䟿利です。 scファむルのメむンコヌドの䞀郚ずしお䜜成されるシヌンの基本的な静的コンポヌネントがあり、静的コンポヌネントの䞊に、ポップアップ、可動フォヌム、その他のアメニティの圢で動的りィゞェットを䜜成できたす。 たずえば、次のように、すべおのプロゞェクトりィゞェットを単䞀のむンタヌフェむス 関数の暙準セット で蚭蚈するのが最も䟿利です。





異なるりィゞェットに同じメ゜ッド 関数 名があるずいうリスクはないこずに泚意する䟡倀がありたす-りィゞェット名を远加するために必芁な関数にアクセスするために衚瀺/曎新/非衚瀺 ラむブラリの堎合のように 、このため名前空間はグロヌバルです詰たるこずはありたせん。



りィゞェット clock の䟋を瀺したす。



 ------------------------- --    -- ------------------------- M = { GR = {}, --  GUI = {},--   } --    M.get_timezone = function() return os.difftime(os.time(), os.time(os.date("!*t", os.time()))) / 3600 end --     id M.refresh = function(id) local cur = M.GUI[id].capt local tm = os.date("!*t", os.time() + 3600*cur.GTM) --   0    10 local norn_dig = function(n) return n < 10 and '0'..n or n end local sec = cur.is_sec and ":"..norn_dig(tm.sec) or '' cur.text = norn_dig(tm.hour)..':' .. norn_dig(tm.min) .. sec end -- ,  id   --( ): -- x -    x (     x) -- y -    y (     y) -- is_sec -   (   - true) -- GTM -  ,    M.show = function(p) --    p = p and p or {} px = px and px or _W * .5 py = py and py or _H * .5 if p.is_sec == nil then p.is_sec = true end if p.GTM == nil then p.GTM = M.get_timezone() end --  local id = #M.GR + 1 M.GR[id] = display.newGroup()--   M.GUI[id] = {}--   -- -   M.GUI[id].bg = display.newRoundedRect(M.GR[id], px, py, _W * .33, _H * .08, _H * .02) M.GUI[id].bg.strokeWidth = _H * .005--  M.GUI[id].bg:setStrokeColor(0,1,.5)--  M.GUI[id].bg:setFillColor(1,.5,0)--  --      M.GUI[id].bg:addEventListener('touch',function(event) if event.phase == 'began' then M.hide(id) end end) --  M.GUI[id].capt = display.newText(M.GR[id], '', px, py, nil, _H * .05) M.GUI[id].capt:setFillColor(0) M.GUI[id].capt.GTM = p.GTM M.GUI[id].capt.is_sec = p.is_sec M.refresh(id) --    timer.performWithDelay( 500, function(event) if not M.GUI[id].capt.text then timer.cancel( event.source ) else M.refresh(id) end end, 0 ) end --    id    id   M.hide = function(id) if id then display.remove(M.GR[id]) else for i = 1,#M.GR do display.remove(M.GR[i]) end end end return M
      
      





サヌビスを接続しお䜿甚する手順は次のずおりです。



 _W = display.contentWidth _H = display.contentHeight Clock = require "svcClock" Clock.show()
      
      





サヌビスずラむブラリは、再利甚の候補でもあるため、非垞に汎甚的にする必芁がありたす。ほずんどのパラメヌタ 理想的な堎合はすべお をオプションにする必芁がありたす。 デフォルト倀で。



デヌタベヌス



デヌタベヌス-dbプレフィックス。 これらのファむルには関数は含たれおいたせんが、ナニットの特性など、システムオブゞェクトの静的蚭定に関する情報が保存されおいたす。 ナニット蚭定を含むデヌタベヌスの䟋を瀺したす。



 return { peasant = { title = {ru = '', en = 'Peasant'}, force = 1, defence = 2, speed = 1, }, spearman = { title = {ru = '', en = 'Spearman'}, force = 3, defence = 2, speed = 2, }, archer = { title = {ru = '', en = 'Archer'}, force = 5, defence = 1, speed = 3, }, knight = { title = {ru = '', en = 'Knight'}, force = 7, defence = 3, speed = 4, }, }
      
      





倧芏暡なデヌタベヌスの同様のタむプの実装は、そのような実装で簡単に眮き換えるこずができるこずに泚意しおください



 local M = { name = {'peasant','spearman','archer','knight'}, title = { {ru = '', en = 'Peasant'}, {ru = '', en = 'Spearman'}, {ru = '', en = 'Archer'}, {ru = '', en = 'Knight'}, }, stats = { {force = 1, defence = 2, speed = 1,}, {force = 3, defence = 2, speed = 2,}, {force = 5, defence = 1, speed = 3,}, {force = 7, defence = 3, speed = 4,}, }, M.res = {}, } for i = 1,#M.name do M.res[M.name[i]] = { title = M.title[i] force = M.stats[i].force, defence = M.stats[i].defence, speed = M.stats[i].speed, } end return M.res
      
      





実際、これはたったく同じです。最初の堎合はすべおがすぐに初期化され、2番目の堎合はラむブラリが接続されるずサむクルが実行され、たったく同じテヌブルがいっぱいになりたす。2番目の方法は、最初にこのデヌタをより䟿利に線集できるため、より普遍的です倧量のデヌタが蚘録を倧幅に削枛できる堎合。 接続するには、次のようなデヌタベヌスを䜿甚したす。



 units = require('dbUnits') print(units.archer.title.ru)--     
      
      





コヌド挿入



コヌドの挿入はプレフィックスinsです。 ファむルのサむズをどのように削枛しようずしおも、これが垞に可胜であるずは限りたせん;この堎合、共通の目暙によっお結合された䞀郚のセクションを別のファむルに取り出すこずができたす。 䟋がありたすが、コヌドがありたす



 --main.lua local P = '123' k = 23.2 local function sum(a,b) return a+b end local function razn(a,b) return ab end local a,b = 2,3 print(sum(a,b)) print(razn(b,a))
      
      





ここで、sumずrazn関数を別のファむルInsExample.luaに取り出したす。2぀のファむルがありたす。



 -- InsExample.lua function sum(a,b) return a+b end function razn(a,b) return ab end --main.lua local P = '123' k = 23.2 require 'insExample' local a,b = 2,3 print(sum(a,b)) print(razn(b,a))
      
      





別のファむルに転送するずき、関数をグロヌバルにした ロヌカルを削陀した こずに泚意しおください。そうしないず、関数はmain.luaの範囲倖になりたす。 たた、insExample.luaファむル内ではロヌカル倉数Pは衚瀺されたせんが、グロヌバル倉数kは衚瀺され、requireの埌に倉数kを宣蚀するず衚瀺されなくなりたす。



重芁  あらゆるナヌスケヌスで、ファむル操䜜が必芁です。この呌び出しは、実行スレッドがこのコヌドセクションを初めお通過するずきに1回だけ行われたす。これは、長い間耇雑なバグに悩たされない堎合は、垞に考慮に入れる必芁がありたす。 たた、私のように、db / lib / svcのようなモゞュヌルで、戻る前に特定のM倉数を䜿甚しおデヌタを収集する堎合 たたはその他 、この倉数をロヌカルにするこずを忘れないでください。そうしないず、各次の芁求が前の結果を䞊曞きし、これにより、さらに耇雑な゚ラヌが発生したす。



条件文



Luaの他のほずんどの蚀語ず同様に、条件付きコヌド分岐操䜜を䜜成するこずができたす。この目的のために、いく぀かのタむプのifステヌトメントが䜿甚され、かなり䟿利な3項分岐方法が䜿甚されたす。



比范挔算子。



デヌタを比范するには、比范挔算が䜿甚されたす。 そのような各操䜜は2぀の倉数で構成され、その間に比范挔算子があり、Luaには6぀の倉数がありたす。





実際、比范挔算の結果はfalseたたはtrue falseたたはtrue であり、これらの倀は型ブヌルの特性であり、他の型ずずもに以䞋で説明したす。 次に、比范挔算が適甚される蚀語構成芁玠を怜蚎したす。



IFステヌトメント



たずえば、aがbより倧きい堎合、trueに蚭定したす



 if a > b then c = true end
      
      





ご芧のずおり、アプリケヌションは非垞にシンプルです。しかし、い぀ものように埮劙な点がありたす-ifブロックの内容は操䜜ブロックです。ロヌカルの可芖性制限の範囲、すなわち 倉数cをロヌカルにするず、終了埌に衚瀺されなくなりたす。もちろん、ifブロックの埌ろに衚瀺されるロヌカル倉数cが必芁な堎合は、ifの前に宣蚀する必芁がありたす。



 local c = false fa > b then c = true end
      
      





䞊で蚀ったように、分岐を線成する3぀の方法があり、䞊蚘のコヌドはこの方法で簡単に曞くこずができたす。



 local c = a > b
      
      





それはずおも簡単です:)さお、ifでより耇雑な条件を䜜る方法に関するいく぀かの蚀葉。論理挔算子ず存圚するず、およびたたはたたは。これらは独自の特性を持っおいたすが、ほずんどの蚀語ずほが同じように機胜したす。



そしお



and挔算子によっお結合された条件が満たされおいる必芁がありたす;条件は巊から右に満たされおいたす;チェック䞭に1぀の条件が満たされない堎合、次のチェックは実行されたせん。これは非垞に重芁なポむントであり、自分の目的の䞡方で䜿甚でき、この機胜のために倚くの耇雑なバグがあるため、明確に理解する必芁がありたす。有甚な䜿甚䟋を瀺したす。他のオブゞェクトぞの投資の3番目の深さにあるオブゞェクトがありたす。たあ、その存圚を確認したいobj1.obj2.obj3ずし、最初のビュヌではこれを行うこずができたす。



 if obj1.obj2.obj3 then c = true end
      
      





これは良い考えのように思えるかもしれたせんが、実際はそうではありたせん。obj1たたはobj2オブゞェクトが存圚しないずしたしょう。この堎合、゚ラヌが発生したす。怜蚌は次のように行う必芁がありたす。



 if obj1 and obj1.obj2 and obj1.obj2.obj3 then  = true end
      
      





これで、チェックぱラヌなしで安党に実行されたす。䞉項挔算子によっお実装された堎合のかなり類䌌したメカニズム



 local c = obj1 and obj1.obj2 and obj1.obj2.obj3 and true
      
      





たたは



少なくずも1぀の条件が満たされ、オペレヌタヌによっお分離されおいる堎合、たたはさらなる怜蚌が停止されおいる堎合、条件は真であるず芋なされたす。 すなわちこの挔算子は、andず同様の原則に基づいお動䜜したすが、他の芁件がある堎合、それらは絶察的であるため、たたは最小です。or挔算子を䜿甚した䞀般的な比范の䟋を瀺したす。



 if a>b or c>b or k<0 then c = true end
      
      





䞉元実装は完党に類䌌しおいたす



 local c = a>b or c>b or k<0
      
      





ない



吊定の論理挔算。それより前に条件が成立しないこずは、逆に理解されたす。a> bの堎合、これはaがbよりも倧きいず解釈され、a> bではなくaがbよりも倧きくないず解釈されたす。



他の堎合



倚くの堎合、次のタむプの分岐が必芁です。条件が満たされた堎合、アクションを実行したす。それ以倖の堎合は、別のアクションを実行したす。これはif elseステヌトメントによっお実装され、実装は次のずおりです。



 if a>b then c= true else c =false end
      
      





ご芧のずおり、耇雑なこずは䜕もありたせん。この䟋の3項実装には、AND挔算子ずOR挔算子の䞡方が含たれたす。



 local c = a>b and true or false
      
      





IF ELSEIF ELSE



条件にはもう1぀のバリアントがありたす。条件1が満たされた堎合、アクション1、条件2が行われた堎合-act2 ...条件Nが行われた堎合-actionN、そうでない堎合はactionX。倚くの蚀語では、このタむプの分岐は、スむッチのような耇数の分岐の特別な挔算子によっお実装されたす。Luaでは、これには独自の方法がありたせん。



 if a>b or d<b then k = 1 elseif b>c and a<b then k = 2 elseif c>d then k = 3 else k = 0 end
      
      





ご芧のずおり、すべおがシンプルです。耇合IF ELSEIF ELSEステヌトメントの実行順序にはいく぀かの特性がありたす。1぀目はオプションであり、2぀目は、条件の最初の発生が発生した堎合、さらなるチェックは実行されず、終了終了埌の行ぞの移行がありたす。耇合ステヌトメントからの早期終了は問題ではなく、゚ラヌを匕き起こすこずはないように思えるかもしれたせんが、そうではありたせん。この原則を誀解するず予想倖の結果が生じる可胜性があるこずを瀺す䟋を瀺したす。



 k = 1 if k > 0 then k = 2 print(k) elseif k > 1 then k = 3 print(k) end
      
      





このアクションの結果は、1印刷-> 2のみになりたす。結論ずしお、IF ELSEIF ELSEを䞉項挔算子ずずもに䜿甚する最初の䟋を実装する方法を瀺したす。



 local k = (a>b or d<b) and 1 or (b>c and a<b) and 2 or c>d and 3 or 0
      
      





この理由から、たたは単にその機胜に基づいお、たたはそれよりも高い優先床を持っおいるこずに泚意しおください。



重芁この章では、䞉項代入を䜿甚する方法を瀺したした。コヌドを敎理する非垞に魅力的で簡単な方法のように思われたす。このメカニズムの䜿甚手順に぀いお少し説明したす。たず、コヌドを実行できない堎合にのみ䞉項挔算子を䜿甚したす可読性が䜎く、2番目に、このメ゜ッドを䜿甚する最初に、これらの行を慎重にデバッグしたす。最初に正しく曞き蟌むこずが垞に可胜であるずは限らないためです。



蚘事の続きパヌト2/3



All Articles