GameDev、Indie、Corona SDK、GameJam 48h、DevConf、Go、Laser Flow

ご挚拶 すぐにその芋出しをおaびしたす-私はその䞭に倚くを䌝えたかったのですが、長すぎたした。



ストヌリヌは、Corona SDKを䜿甚しお䜜成された私のゲヌム iOS 、 Android 、クラりン自䜓ずその開発、「48時間でゲヌムを曞く」コンテスト、最近のDevConfおよびGo蚀語に぀いおです。



はじめに



私は長い間王冠のあるタワヌディフェンスゲヌムを開発しおきたしたが、ゲヌムが真の高品質になるには膚倧な時間を芁し、高品質のゲヌムは成功ぞの道の第1䜍です第2䜍は誰かがいなければマヌケティングのための倧金ですコヌス。 したがっお、私は長い間、小さなものではあるが、私のものであり、短時間で䜕かをしたいず思っおいたした。



「泚意ムノガブカブ」



ギグゞャム48



たた、5月䞊旬には、小さなスタゞオGlitch GamesずCorona Labsが48時間でゲヌムを開発するためのコンテストを開催したす。 Ludum Dareず同様、Corona SDKのみ。 私はパズルを䜜り、アむデアを開発し、2぀のほずんど眠れない倜を䜜りたかったので、私はゲヌムLaser Flow-Experiments with Lasersを䜜りたした。 その埌、単にレヌザヌ実隓ずも呌ばれたした。 そのようなゲヌムはほずんどなく、私のものは適切な制埡、色の混合が特城であり、目ず耳に心地よいこずを願っおいたす。 私自身、本圓に気に入っおいたす。 しかし、競争の結果によるず、残念ながら、私の意芋はju審員の意芋ず䞀臎したせん。 合蚈で玄35人の参加者から23のゲヌムがありたした。



ゲヌムのメむン画面を䜜成しお、審査員に少し感銘を䞎えたした。 ほずんどの時間は、ミラヌからのレヌザヌの反射ず1぀のセルを通過するレヌザヌの共同通過に関䞎するコヌドに費やされたので、レヌザヌは重なり合わず、䞀緒に歩きたす。 これを完党に回避するこずはできたせんでしたが、珟圚、いく぀かのレベルでは、異なるレヌザヌがオヌバヌラップするようにミラヌを配眮するこずが可胜です。 これでゲヌム党䜓が損なわれないこずを願っおいたす。



ゲヌムを送信した埌、結果の気たずい期埅が始たりたした。 日が過ぎたが、結果はなかった。 その埌、審査員が評䟡するのに数週間かかるず発衚され、暎動は#Corona IRCルヌムで始たりたした...

倧倉な時期でした。 結果は最終的に1か月以䞊埅たなければなりたせんでした。



ちなみに、これはゲヌムのスクリヌンショットで、コンテストに送信されおからどのように倉化したかを瀺しおいたす。




DevConf 2013



5月末に、DevConfオヌガナむザヌから連絡があり、レポヌトコンペぞの参加を申し出たした。 Corona SDKずGoの2぀のトピックを提案したした。 圌らは䞡方の報告を取りたしたが、私はずおも喜んでいたす。 無料の旅行、郚屋ず食事のために、これのための䞻催者に感謝したす。



䌚議甚のゲヌムを終了しおリリヌスし、すぐに実䟋に぀いお講矩し、人々がダりンロヌドしおプレむできるようにするこずは玠晎らしいこずだず思いたした。 たた、小さな競争を蚈画したした-他よりも早く秘密のレベルを決定し、ゲヌムのロゎアむコンが付いたTシャツを手に入れたした。 しかし、第䞀に、ショッピングバグのため、私のアプリケヌションは拒吊され、䌚議の2日目にのみリリヌスされたした。第二に、圌らは私が必芁ずする色特別なCMYKプロファむルのTシャツを印刷できたせんでした。 ずころで、Tシャツに20x20cmの写真を印刷するには、1024x1024ピクセルで十分です。



ゲヌムを終了するのに1か月以䞊かかりたした。



私は自宅でレポヌト甚のスラむドを䜜成し始め、飛行機に乗り続け、ホテルですでに終了したした。 トリップiPadおよびAsus Eee Pc 701 4Gでlouboutaずずもに䜿甚されたす。 タッチスクリヌン、ブルヌトゥヌス、SD甚の远加スロットを備えたもの。 モデムを取り倖す必芁がありたした。 スラむド自䜓はLibreOfficeで䜜成されたした。



ゲヌムを再コンパむルし、予期しないリダむレクト埌にApp Storeに送信するためのMacBookを提䟛しおくれたルヌムメむトのPavelに感謝したす。 奇劙なこずに、今回はゲヌムが承認されるのに十分でした。



䌚議は間違いなく興味深いものでした。倚くの人がいお、いく぀かのレポヌトが非垞に倚くのリスナヌを集め、党員に十分な怅子がありたせんでした。 Mobiセクションは実際にはそれほど人気が​​ありたせんでした。



私のレポヌトはグリッド䞊で最埌であり、率盎に蚀っお、数人のリスナヌを集めたした。 時間の経過ずずもに怜蚌された埮劙さ、いく぀かのベストプラクティス、およびヒントを瀺す蚈算を含むクラりンに関するレポヌトを䜜成したした。これにより、レポヌトがサむトのメむンペヌゞずドキュメントのドラむリテヌルにならないように、レポヌトを本圓に䟿利にしたかったのです。 しかし、リスナヌの誰も王冠もルアも知りたせんでした。 事実に近いレポヌトを再構築し、クラりンが䜕ができるのかを瀺し、Luaに䜕らかの玹介をしなければなりたせんでした。



思いがけないこずに、冠に぀いお話しおいる間、䌚議の初日は終わりたした。 Goのレポヌトはただ開始しおいたせん。 簡単な䞖論調査では、聎衆はこの報告を埅っおいたこずがわかり、ホテルの1階に進むこずにしたした。 私たちはほずんどいたせんでした。倧画面のラップトップをくれたしたありがずう残念なこずに、プロゞェクタヌの代わりに、誰もが快適に座っおいるわけではなく、誰もが普通に芋えるわけではありたせんが、倧䞈倫です。 ダりンロヌドが必芁なすべおの人に、スラむドをサむトに投皿したした。 講挔の埌、Goに぀いお、その展望、私たち党員がどのように気に入っおいるか、そしおこの蚀語に関する本がリスナヌの1人に莈られたした私もしたい



2日目には、高負荷に関する非垞に興味深いレポヌトがありたした。



䌚議から、私はただ、DevConfのロゎ、ノヌト、ペン、バッゞ、ホテルのミニ歯ブラシが入った野球垜を持っおいたす。 DevConfのすべおです。 すごかった。



レポヌトのスラむドは、サむトからダりンロヌドできたす。 トピックの䞋郚にあるリンク。



コロナSDK



王冠は良いです。 これは、ゲヌム開発フレヌムワヌクを䜿甚するのが最も簡単で、最近無料版を取埗したため、慣れるのに非垞にお勧めです。 PythonずPHPを知っおいたので、Luaを習埗するのに数日かかりたした。たた、蚀語、OOP、コロナAPIの䞻芁郚分の抂念のほずんどを理解するのに1週間かかりたした。



Luaには䟿利な機胜がありたす。たずえば、論理挔算が機胜した最埌の芁玠を返したす。同様の構成を行うこずができたす。オブゞェクトが存圚する堎合はアクセスし、存圚しない堎合はデフォルト倀を指定したす。



local txt = a and a.text and a.text:lower() or 'default' -- : local txt = 'default' If a then if a.txt then txt = a.txt:lower() end end
      
      





圌らはコヌルバックを䜿甚するずきにしばしば間違いを犯したす。

 local function myFunc() print('Nya') end timer.performWithDelay(1000, myFunc(), 1)
      
      





この堎合、関数はタむマヌに枡されず、実行結果nilに枡されたす。 関数名の埌の括匧を削陀するだけです。

䞀床、指定された時間の埌だけでなく、今すぐにタむマヌを機胜を実行するように䌝える方法をIRCに尋ねたした。 答え-タむマヌを䜜成したのず同じ堎所のコヌドで呌び出しおください。



さらに倚くのLuaには砂糖が付属しおいたす。

 object.property -> object['property'] local function nya() -> local nya = function() object:method(params) -> object.method(object, params) someFunction{name = 'Someone'} -> someFunction({name = 'Someone'})  .
      
      





LuaのOOP


OOPは、メタメ゜ッドPHPの魔法のメ゜ッドの類䌌物を䜿甚しお、擬䌌クラスに基づいお線成できたす。 たたは、単玔なテヌブルに基づいお構築された非垞に良いかもしれたせん。 さらに、プラむベヌトでもパブリックでも、保護されおいおも、問題なく線成できたす。

OOPコヌドを衚瀺
空のオブゞェクトを䜿甚した最も簡単なオプション

 local function newObject() local object = {} return object end local myObject = newObject()
      
      





パブリック倉数を远加したす。

 local function newObject() local object = {} object.somePublicVar = 100 return object end local myObject = newObject() print(myObject.somePublicVar)
      
      





次に、メ゜ッドを远加したす。

 local function newObject() local object = {} object.somePublicVar = 100 function object:setName(name) self.name = name end return object end local myObject = newObject() myObject:setName('Nyashka') print(myObject.name)
      
      





コロンの䜿甚に泚意しおください。 この堎合、特別な倉数selfが関数メ゜ッド内に衚瀺されたす。これは、オブゞェクト自䜓ぞの参照です。 このようなメ゜ッドは、コロンたたは1぀のドットで呌び出す必芁がありたすが、最初の匕数ずしおオブゞェクトを指定したす。



moneyなどのプラむベヌト倉数を远加したす。

 local function newObject() local object = {} object.somePublicVar = 100 local money = 0 function object:setName(name) self.name = name end function object:addMoney(amount) money = money + amount end return object end local myObject = newObject() myObject:setName('Nyashka') myObject:addMoney(50) print(myObject.money) -- nil
      
      





ポむントを介しおお金にアクセスしようずするず、この倉数はテヌブルオブゞェクト自䜓ではなく、このオブゞェクトを䜜成した関数のスコヌプ内にあるため、nilになりたす。 したがっお、この倉数はaddMoneyメ゜ッドで衚瀺されたす。



継承

 local function newObject() local object = {} object.somePublicVar = 100 local money = 0 function object:setName(name) self.name = name end function object:addMoney(amount) money = money + amount end return object end local function newChild() local object = newObject() return object end local myChild = newChild()
      
      





この堎合、オブゞェクトは空のテヌブル{}によっおではなく、別のベヌスオブゞェクトによっお䜜成されたす。 したがっお、newChild関数では、オブゞェクトのプロパティずメ゜ッドを远加したり、それらを再定矩したりできたす。



Protectedはもう少し興味深い実装です。 すべおの保護された倉数を配眮するプラむベヌトテヌブルを䜜成し、returnを介しお䜜成されたオブゞェクトず䞀緒に返したす。 盞続によっおお金を転送したいずしたす。

 local function newObject() local object = {} object.somePublicVar = 100 local protected = {money = 0} function object:setName(name) self.name = name end function object:addMoney(amount) protected.money = protected.money + amount end function object:getMoney() return protected.money end return object, protected end local function newChild() local object, protected = newObject() function object:spendMoney(amount) protected.money = protected.money - amount end return object end local myChild = newChild() myChild:addMoney(100) myChild:spendMoney(60) print(myChild:getMoney()) -- 40
      
      





メ゜ッドをオヌバヌラむドする必芁がある堎合は、たったく同じ方法で宣蚀されたす。 新しいものは叀いものを消去したす。 ラッパヌを䜜成する必芁がある堎合、叀いメ゜ッドが最初に倉数に保存され、次に新しいメ゜ッドから呌び出されたす。

 local function newObject() local object = {} object.somePublicVar = 100 local protected = {money = 0} function object:setName(name) self.name = name end function object:addMoney(amount) protected.money = protected.money + amount end function object:getMoney() return protected.money end return object, protected end local function newChild() local object, protected = newObject() function object:spendMoney(amount) protected.money = protected.money - amount end local parent_setName = object.setName function object:setName(name) name = 'Mr. ' .. name parent_setName(self, name) end return object end local myChild = newChild() myChild:setName('Nyashka') print(myChild.name) -- Mr. Nyashka
      
      





画面に衚瀺されるオブゞェクトの堎合、グラフィックオブゞェクトを返すCorona SDK APIから関数を呌び出しおオブゞェクトを䜜成するずきに、空のテヌブル{}を眮き換えるだけで十分です。 display.newImage、display.newRect、たたはほずんどの堎合display.newGroupグルヌプを䜿甚できたす。 グルヌプを䜿甚する堎合、そのようなオブゞェクトは他のグラフィック芁玠で非垞に簡単に展開できたす。 ただし、グルヌプの数が倚すぎるずパフォヌマンスが䜎䞋するため、コヌドの速床が䜎䞋し始める堎合は、できるだけグルヌプを䜿甚しないようにしおください。



モゞュヌルはテヌブルでもあり、オブゞェクトでもありたす。 OOPず同じ原則に埓うこずができたす。 以前は、モゞュヌルはキヌワヌド/汎甚モゞュヌルを䜿甚しお蚘述されおいたした。 圌女には䜜成䞭のモゞュヌルの名前が䞎えられ、スクリプト環境を自分のロヌカルに眮き換えたため、「ロヌカル」の束を曞く必芁がなく、すべおの倉数ず関数はこのロヌカル空間に眮かれたした。 そしお、すべおがうたくいきたすが、同時にモゞュヌル内では、印刷などのグロヌバル機胜にアクセスできたせんでした。 その埌、圌らは、モゞュヌル関数の2番目の匕数ずしお特別な関数を远加するず、すべおのグロヌバルなものがどこにあるか_G内で怜玢されるずいうアむデアを思い぀きたした。 この特別な関数package.seeallがこれを担圓したした。 しかし、実際には、すべおのグロヌバル関数ず倉数がすべおのモゞュヌル内に衚瀺されるだけでなく、モゞュヌルはモゞュヌル関数によっお䜜成され、グロヌバル名前空間に配眮されたす。 おridge。 月のおpor。 グロヌバルムヌンポリッゞ。



サンプルモゞュヌルをpastebinで挿入したす

モゞュヌル
 local _M = {} -- module table _M.someProperty = 1 -- class properties local function createText() -- local function are still valid, but not seen from outside - "private" end local privateVar -- so do local variables _GLOBAL_VAR -- without local it's global function _M.staticMethod(vars) -- this is class method like function (dot) -- there is no "self" end function _M:someMethod(vars) -- this is object method like function (colon) -- there is "self" end function _M:newBaseObject() -- Here goes constructor code local object = display.newImage(...) -- could be a display object or an empty table {} object.vars = 'some vars' object.name = 'BaseObject' object.property = self.someProperty -- from module function object:sign(song) print(self.name .. ' is singing ' .. song) end function object:destroy() -- optional destructor, you can override removeSelf() as well self.vars = nil self:removeSelf() end return object end -- Now inheritance function _M:newChildObject() local object = _M:newBaseObject() -- override any methods or add new object.name = 'ChildObject' function object:tell(story) print(self.name .. ' is telling ' .. story) end return object end return _M -- return this table as a module to require()
      
      





モゞュヌルテヌブルを䜜成し、ハンドルのある内容を内郚に配眮したす。 すべおが䟿利で、すべおが玠晎らしいです。

ファむルの最埌に、必ずreturn _Mを蚘述したす。 そうでない堎合、モゞュヌルはrequireを介しおロヌドされたせん。



Corona SDKのその他


3぀のドット...は、珟圚の関数の可倉匕数リストを意味するこずを知っおいたすか これにより、ラッパヌたたは倉数関数を簡単に䜜成できたす。



 local function my_warning_print(...) print('Warning:', unpack(arg)) end
      
      







Luaの速床はCの玄20倍遅くなりたす。LuaJITは数倍遅いだけですが、iOSでのリアルタむムコンパむルは犁止されおいたす。 ピカルカ。 Androidでコンパむルできたすが、クラりンではこれは実装されおいたせん。 幞いなこずに、Luaがボトルネックになるこずはほずんどありたせん。 集䞭的な蚈算のみ。



開発速床は非垞に重芁です。 そしお、そのためだけに王冠を蚱すこずができたす。



ロヌカルではないものはすべおグロヌバルです。 䟿宜䞊、倉数をテヌブルに保存したす。

サヌビスの可芖性テヌブルで倉数を怜玢するのに倚くの時間が費やされたす。 たず、珟圚のブロックたたは関数の可芖性、次にチェヌンを_G自䜓に移動したす。 これは、グロヌバル倉数の堎合に発生したす。 したがっお、圌らは遅いです。 特定の堎所でパフォヌマンスを向䞊させるために、すべおの倉数ず関数をロヌカルにキャッシュしたす。 しかし、無理をしないでください。 ほずんどのコヌドでは、このようなキャッシュを䜿甚しおも速床が目立っお向䞊するこずはありたせん。 非垞に頻繁に呌び出される堎所のみを最適化したす。 無限タむマヌ内の関数、たたはフレヌムごずに呌び出されるむベントハンドラヌenterFrameを指定できたす。 Luaが珟圚のフレヌムのすべおのコヌドの凊理を完了するたで、Coronaはレンダラヌを起動したせん。 パラメヌタxを倉曎した堎合、関数内で画面䞊の画像を䜕床も倉曎するず、最埌の倀のみが画面に反映されたす。



math.random、table.insert、ipars、pair、その他の組み蟌み関数などもキャッシュしたす。



グロヌバルな可芖性の分野でごみを捚おないでください、䜕かを壊すこずができたす。 たたは、単にメモリリヌクが発生したす。



_Gにあるすべおを再定矩するこずは可胜ですが、これは確かに掚奚されたせん。 そこにあるものを芋るには、その䞊にある印刷物を芋おください。 衚瀺された倉数を芚えお、決しお䜿甚しないでください。 決しお_Gに䜕も入れないず蚀う人もいたす。 しかし、これは倚すぎたす。 モゞュヌルのテヌブル名前空間、たずえば「app」など、構成、たたは単に組み蟌みモゞュヌルのように、各シヌンに必芁なものをたくさん曞かなくおもよいように、いく぀かの芁玠を自分で持぀こずはグロヌバルな可芖性においお非垞に普通です。



パフォヌマンスに぀いお考えるずき、FPS、テクスチャメモリ、およびLuaメモリを監芖するためのモゞュヌルを远加したす。 そのようなモゞュヌルの远加埌初めお、誰もが「そのようなメモリリヌクはどこから来たのか」パニックに陥りたした。 実際、メモリ消費のスムヌズな増加は暙準であり、1秒あたり最倧玄10kBです。 ガベヌゞコレクタヌが次に呌び出されるず、メモリは最小倀に戻りたす。 ガベヌゞコレクタヌは、アルゎリズムに煩わされる堎合に構成できたす。 たずえば、蚈算が遅くならないように、蚈算の完了埌に自分で実行したす。



実際のLuaメモリヌは、数メガバむトを超えたせん。 䞻なボリュヌムはテクスチャです。 それらを最適化するこずが望たしい。 ビデオチップ内では、すべおのテクスチャ任意の画像を意味するは2の环乗で敎列されたす。 したがっお、最良の結果を埗るには、ファむルの2のべき乗を厳守しおください。



コロナでは、1秒あたりのフレヌムレヌトが30たたは60に蚭定されおいたす。垞に60を䜿甚するようにしおください。アプリケヌションのむンタヌフェむスがはるかに滑らかで芋やすくなりたす。



すべおをアニメヌション化したす。 アプリケヌションの蚭蚈で適切なルヌルを順守しおいる堎合、これを実珟するのは非垞に簡単です。 すべおにオブゞェクトを䜿甚したす。 少なくずもラッパヌは、newImageなどの暙準関数に察しおも機胜したす。この堎合、オブゞェクトのゞェネレヌタヌでアニメヌションを1回远加するだけで、アプリケヌション党䜓にすぐに衚瀺されたす。 ただ、圌らず行き過ぎないでください。 ナヌザヌを埅たせるずいう意味での茻茳たたは抑制は、アプリケヌションの党䜓的な゚クスペリ゚ンスに悪圱響を及がしたす。



これが暙準のnewImageのラッパヌです。 画面䞊の䜍眮を1行で蚭定しお、グルヌプに远加できたす。

newImageず䟿利な小さなものをラップ
 local _M = {} _W = display.contentWidth _H = display.contentHeight _T = display.screenOriginY -- Top _L = display.screenOriginX -- Left _R = display.viewableContentWidth - _L -- Right _B = display.viewableContentHeight - _T-- Bottom _CX = math.floor(_W / 2) _CY = math.floor(_H / 2) _COLORS = {} _COLORS['white'] = {255, 255, 255} _COLORS['black'] = {0, 0, 0} _COLORS['red'] = {255, 0, 0} _COLORS['green'] = {0, 255, 0} _COLORS['blue'] = {0, 0, 255} _COLORS['yellow'] = {255, 255, 0} _COLORS['cyan'] = {0, 255, 255} _COLORS['magenta'] = {255, 0, 255} function _M.setRP (object, ref_point) ref_point = string.lower(ref_point) if ref_point == 'topleft' then object:setReferencePoint(display.TopLeftReferencePoint) elseif ref_point == 'topright' then object:setReferencePoint(display.TopRightReferencePoint) elseif ref_point == 'topcenter' then object:setReferencePoint(display.TopCenterReferencePoint) elseif ref_point == 'bottomleft' then object:setReferencePoint(display.BottomLeftReferencePoint) elseif ref_point == 'bottomright' then object:setReferencePoint(display.BottomRightReferencePoint) elseif ref_point == 'bottomcenter' then object:setReferencePoint(display.BottomCenterReferencePoint) elseif ref_point == 'centerleft' then object:setReferencePoint(display.CenterLeftReferencePoint) elseif ref_point == 'centerright' then object:setReferencePoint(display.CenterRightReferencePoint) elseif ref_point == 'center' then object:setReferencePoint(display.CenterReferencePoint) end end function _M.newImage(filename, params) params = params or {} local w, h = params.w or _W, params.h or _H local image = display.newImageRect(filename, w, h) if params.rp then _M.setRP(image, params.rp) end image.x = params.x or _CX image.y = params.y or _CY if params.g then params.g:insert(image) end return image end function _M.setFillColor (object, color) if type(color) == 'string' then color = _COLORS[color] end local color = table.copy(color) if not color[4] then color[4] = 255 end object:setFillColor(color[1], color[2], color[3], color[4]) end function _M.setTextColor (object, color) if type(color) == 'string' then color = _COLORS[color] end local color = table.copy(color) if not color[4] then color[4] = 255 end object:setTextColor(color[1], color[2], color[3], color[4]) end function _M.setStrokeColor (object, color) if type(color) == 'string' then color = _COLORS[color] end local color = table.copy(color) if not color[4] then color[4] = 255 end object:setStrokeColor(color[1], color[2], color[3], color[4]) end function _M.setColor (object, color) if type(color) == 'string' then color = _COLORS[color] end local color = table.copy(color) if not color[4] then color[4] = 255 end object:setColor(color[1], color[2], color[3], color[4]) end return _M
      
      







pastebin.com/GWG3sJLZの画面サむズに぀いおもう少し


たた、非垞に䟿利なsetRP関数が含たれおおり、アンカヌポむントに長い倀を曞き蟌む必芁がありたせん。 たた、オブゞェクトの色を名前で蚭定する方法。



Androidで戻るボタンをサポヌトするには、main.luaに次のコヌドを远加するだけです

 Runtime:addEventListener('key', function (event) if event.keyName == 'back' and event.phase == 'down' then local scene = storyboard.getScene(storyboard.getCurrentSceneName()) if scene and type(scene.backPressed) == 'function' then return scene:backPressed() end end end);
      
      





そしお、このボタンぞの反応が必芁な各シヌンで、関数を定矩したす

 function scene:backPressed() storyboard.gotoScene('scenes.menu', 'slideRight', 200) return true end
      
      





「終了したす」ダむアログボックスを远加し、native.requestExitを呌び出すこずを忘れないでくださいAndroidのみ、iOSの堎合-os.exit。



デバむスの断片化のためのconfig.lua䞇胜薬


動的スケヌリングは問題ありたせん。 ほが。

コンテンツは珟圚の画面サむズに調敎され、アプリケヌションの仮想郚分通垞は320x480が芋えるようにし、任意の2぀の端に沿っおスペヌスを远加したすレタヌボックス。 画面の隅、偎面の䞭倮、画面党䜓の䞭倮など、芁玠を配眮したす。 スケヌリングする必芁がある芁玠を䜿甚しないようにしおください。 異なる画面でコントロヌルが少し小さくたたは倧きく芋える堎合-倧したこずはありたせん。 䞻なこずは、それらを十分に倧きくするこずです。 ボタンには少なくずも32ピクセル。 より良い64たたは少なくずも48。コンテンツの角があり、画面自䜓の角がありたす。これは、画面の仮想領域ず実際の領域の違いです。



config.luaでコヌドを蚘述できるこずを知っおいる人はほずんどいたせん。 コンテンツ領域を動的に割り圓おるこずができたす。 䜕のために ほずんどのデバむスでピクセル完璧なグラフィックスを実珟したす。 そうしないず、画像が少しがやけお、完璧な倖芳が倱われたす。



ファむルをサブフォルダに入れたす-ラむブラリ甚のラむブラリ、シヌン甚のシヌン、ストヌリヌボヌド、写真甚の画像、サりンド、そしおおそらく音楜。 ファむルシステムで倧文字ず小文字を区別するファむルのダりンロヌドを避けるため、ファむルには垞に小文字を䜿甚しおください。



bitbucket.comを䜿甚しお、アプリケヌションのバックアップずバヌゞョン管理を行いたす。 数人のチヌムで構成されるプラむベヌトプロゞェクトでは無料です。



soundcloud、indiegamemusic、googleでゲヌムの音楜を怜玢できたす。 Garabeバンド、FrootyLoops、Audacity、bfxrを忘れないでください。



8ビットのシンセサむザヌを備えたガレヌゞバンドでは、優れたモダンなオヌルドスクヌルサりンドを埗るこずができたす。 ゚フェクトずむコラむザヌを䜿甚したす。



button._view._onReleasを介しおボタンりィゞェットのonReleaseを呌び出すこずができたす。



暙準機胜に぀いおは、ラむブラリを泚意深く参照しおください。 王冠がiosnative.showPopu 'twitter'の䞋でtwitterクラむアントをサポヌトしおいるこずを知っおいる人はほずんどいたせん。 たたは、アプリケヌションからマヌケットペヌゞを盎接衚瀺できるこず。



マルチタッチを䜿甚するず、2本の指でボタンを2回抌すこずができたす。 連続しお䜕床も開始できない䜕かが発生した堎合は、ボタン内にアクティブ化されお抌せないフラグを蚭定したす。



Flurryを䜿甚しお、ゲヌムのどこが悪いのか、どのように改善するのかを理解し、より倚くのナヌザヌが掚奚するようにしたす。



Corona SDKのIDEずしお、Zero Brane Studioを遞択したした。これは、クロスプラットフォヌムのLua + wxWidgetsで蚘述されたロシア語を話すオヌプン゜ヌスの開発者です。 他のIDEもありたすが、これは䞀般的に優れおいたす。



行く



かっこいい。 すべおに䜿甚する。



私はその䞊に別のゲヌム泚文のサヌバヌ郚分を曞きたしたが、本圓に気に入っおいたす。 開発の速床ず利䟿性はC / C ++よりも速く、実行速床はわずかに遅いか同じです。 珟圚、蚀語の広範なコミュニティがあり、かなり倚くの異なるラむブラリが登堎しおいたす。



レヌザヌフロヌ



ゲヌムは6月15日にApp Storeでリリヌスされたした。 この日は、3,000回のダりンロヌドず10回の賌入がありたした。 おそらくゲヌムは耇雑すぎお、ゲヌムのファンだけのためになったのかもしれたせん。



レベルゞェネレヌタヌずレベル゚ディタヌに぀いおお話したす。 ゜リュヌション怜玢アルゎリズムを曞いおいる数日を殺したした。 さたざたな゜ヌト条件、異なる終了条件、すべおのコヌド最適化、およびLuaJITを䜿甚するず、結果は悲惚なものになりたした-レベルの解決は非垞に遅いです。 最短経路探玢アルゎリズムに基づいたアルゎリズムを開発する必芁がありたすが、これは簡単ではありたせん。 圌はゞェネレヌタヌからフィヌルドゞェネレヌタヌのみを残し、それをランダムのアビスず呌びたした。



゚ディタヌはもっず面癜いです。 ゲヌム自䜓の内郚でそれを行うこずを遞択したしたが、コントロヌルの䞍䟿さがありたす-たくさんのボタンを配眮する堎所を把握する必芁がありたす。隠しパネルを䜜成するず、非垞に䞍䟿になりたす。 別のオプションは、個別のデスクトップアプリケヌションを䜜成するこずです。 キヌボヌドの力を持っおいたすが、開発は事実䞊れロからです。



最埌に、私は結合するこずにしたした。 Python䞊のMac OSのキヌロガヌず、珟圚アクティブなりィンドりを決定するスクリプトをGoogleで怜玢したした。 したがっお、コロナシミュレヌタが珟圚アクティブな堎合は、UDPを介しおプレヌンテキストでキヌストロヌクを送信したす。 私たちが盎接競技堎のあるシヌンにいる堎合、UDPサヌバヌは王冠に䞊がり、コマンドをリッスンしたす。



その結果、単玔なキヌストロヌクで、フィヌルドに芁玠を远加し、それを再生成し、保存し、レヌザヌの色を倉曎し、タヌゲットセルを配眮するこずができたす。 すべおが非垞に䟿利でした。 1日で140レベル。



さらに3぀のボヌナスレベルがゲヌム自䜓に隠れおおり、簡単に芋぀けるこずができたす。



キヌロガヌコヌド
 from AppKit import NSWorkspace from Cocoa import * from Foundation import * from PyObjCTools import AppHelper import socket sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) class AppDelegate(NSObject): def applicationDidFinishLaunching_(self, aNotification): NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSKeyDownMask, handler) def handler(event): if NSWorkspace.sharedWorkspace().activeApplication()['NSApplicationName'] == 'Corona Simulator': s = unicode(event).split(' ') if s[8]: s = s[8][-2:-1] if (s >= 'a' and s <= 'z') or s == '`' or s == '[' or s == ']': sock.sendto(s, ('127.0.0.1', 5000)) def main(): app = NSApplication.sharedApplication() delegate = AppDelegate.alloc().init() NSApp().setDelegate_(delegate) AppHelper.runEventLoop() if __name__ == '__main__': main()
      
      







Luaのサヌバヌコヌド
 local udp = socket.udp() udp:setsockname('127.0.0.1', 5000) udp:settimeout(0.001) local char, ip, port timer.performWithDelay(200, function () char, ip, port = udp:receivefrom() if char then local scene = storyboard.getScene(storyboard.getCurrentSceneName()) if type(scene.keyboardPressed) == 'function' then scene:keyboardPressed(char) end end end, 0)
      
      





同じ原則を䜿甚しお、ゲヌムから盎接スクリヌンショットを保存するボタンを䜜成しお、さたざたなアプリケヌションストアにダりンロヌドできたす。 display.save関数を䜿甚する必芁がありたす。



ハブで公開する前に、ロシア語のサポヌトを远加し、最初にレベルを簡単に利甚できるようにし、分析を远加し、すべおのレベルの賌入を割匕しおGoogle Playに投皿したした。



Corona SDKずGoの䞡方のIRCで通信したす。 freenode.net#coronaおよびgo-nuts。

Goプレむダヌは、自分のチャンネル#goにアクセスしお、プログラミングに関する質問を読み蟌んでいるず非垞に気分を害したす。



参照資料



レヌザヌフロヌ

iOS itunes.apple.com/us/app/laser-flow/id647540345?ls=1&mt=8

Android play.google.com/store/apps/details?id=com.spiralcodestudio.laserflow



䌚議スラむド Corona SDK 、 Go Language 。



Corona SDK coronalabs.com

Go蚀語golang.org



ご枅聎ありがずうございたした ご質問がある堎合は、コメントでお答えしたす。



PMに接皮ず䞍正確さを送るようお願いしたす。



All Articles