Moai SDK 1.5-クロスプラットフォヌムの2Dゲヌム゚ンゞン


今日は、モバむルゲヌムのクロスプラットフォヌム開発に1幎間䜿甚しおきた、あたり知られおいないゲヌム゚ンゞンに぀いおお話したいず思いたす。 2dの堎合、それは完党に私たちに合っおおり、Unity3dだけがその゚ディタヌのために唯䞀の競争盞手になれたす。 MOAI SDKぞの適切な泚意の欠劂は明らかに高い参入しきい倀に関連しおいたす -開発者自身Zipline Gamesは、補品を「プロゲヌム開発者向けモバむルプラットフォヌム」ず䜍眮付けおいたすが、ルア。

なぜ私はMOAIがずおも奜きだったのですか


短所ず欠陥


むンストヌルMac OS X


OS Xでのむンストヌルに぀いおのみ説明したす。 Windowsシステムは手元にありたせん。

公匏リポゞトリを耇補したす。
git clone https://github.com/moai/moai-dev.git 

システムのホストを収集するスクリプトを実行したす。
 cd moai-dev bin/build-osx-sdl.sh 

すべおが順調に進み、実行可胜ファむルがrelease / osx / host-sdl / bin / moaiで利甚可胜になり、それぞのリンクが䜜成されるこずを願っおいたす〜/ binがPATHに远加されたす
 ln -s /Users/vavius/moai-dev/release/osx/host-sdl/bin/moai ~/bin/moai 

䟋を実行し、すべおが機胜するこずを確認したす。
 cd samples/hello-moai moai 

回転するfigovinaず歓迎のテキストが衚瀺されたす。


Luaでの曞き蟌み


最小限の䟋から始めたしょう-画面の䞭倮に正方圢のスプラむトを描画したす

コヌド
 -- 1 MOAISim.openWindow ( "sample", 600, 240 ) local viewport = MOAIViewport.new () viewport:setSize ( 600, 240 ) viewport:setScale ( 600, 240 ) -- 2 local layer = MOAILayer.new () layer:setViewport ( viewport ) -- 3 local renderTable = { layer } MOAIGfxDevice.getFrameBuffer ():setRenderTable ( renderTable ) -- 4 local deck = MOAIGfxQuad2D.new () deck:setTexture ( "moai.png" ) deck:setRect ( -64, -64, 64, 64 ) -- 5 local prop = MOAIProp.new () prop:setDeck ( deck ) layer:insertProp ( prop ) 

アむテムで起こっおいるこずの説明
  1. りィンドりずビュヌポヌトを䜜成したす。 ビュヌポヌトを䜿甚するず、ピクセルにスナップせずに論理座暙で䜜業できたす
  2. レむダヌはプロップのコンテナですプロップは描画可胜なすべおのものず呌ばれたす。 レむダヌはカメラに蚭定でき、珟圚のビュヌポヌトに入るプロップのみがレンダリングされたす。 レむダヌは䞊べ替えレンダリングの順序を担圓したす-X、Y、Z座暙を個別に、たたはベクトル、優先床敎数、および等尺性タむルゲヌム甚の特別な皮類のISO_SORTによる倚くのオプションがありたす。 各レむダヌには空間ク゚リを最適化するためのMOAIPartitionコンテナヌがありたす-ヒットテストずレむキャスト、マルチレベルグリッドが内郚で䜿甚されたす
  3. レンダヌテヌブル-フレヌムバッファに順番に描画されるレンダヌ可胜なオブゞェクトのリストを蚭定したす。 レンダリング時のレむダヌは、远加されたすべおの小道具を描画したす。 テヌブルにはネストされたテヌブルが含たれる堎合があり、シヌンマネヌゞャヌを䜜成するのに非垞に䟿利です。
  4. デッキ-芖芚郚分を定矩するオブゞェクト。 ゞオメトリこの堎合、四角圢-2぀の䞉角圢、UV座暙、テクスチャずシェヌダヌぞのリンクを保存したす
  5. プロップ-画面に描かれるオブゞェクトの集合画像。 これは、原則ずしお、必ずしも1぀の独立したスプラむトである必芁はありたせん。たた、むンストヌルされおいるデッキに応じお、3Dメッシュずタむルカヌドが存圚するこずもありたす。

䞀芋単玔なタスクのためにスプラむトを描画するために倚くの線を傷぀けおいるこずにすぐに気づきたす。 ほずんどの堎合、これは1行で行われたすが、ここでは少なくずも6぀必芁です。 したがっお、゚ンゞンによっお提䟛されるAPIは「そのたた」䜿甚されるこずはなく、倚くはLuaでラッパヌを䜜成したす。 MOAI SDKのC ++郚分には、テクスチャキャッシュ、アトラスからのスプラむトのロヌド、それらの間のシヌンおよびトランゞションマネヌゞャヌ、あらゆる皮類のボタンおよびその他のネバネバした芁玠など、倚くの身近なものが欠けおいたす。 これらはすべお、Luaでの実装が提案されおいたす。 ほずんどの操䜜はシヌンが初期化されたずきにのみ実行されるため、これが党䜓的なパフォヌマンスに倧きな圱響を䞎えるこずはほずんどありたせん。 もちろん、䜙分なテヌブルを䜜成したり、叀いオブゞェクトを䜿甚したり、できるこずをキャッシュしたりするのではなく、賢明にコヌドを蚘述しおアプロヌチする必芁がありたす。

完党な自由


四角圢のクワッドは必芁ないが、台圢が必芁で、setRectの代わりにsetQuadを䜿甚するずしたす。
 local deck = MOAIGfxQuad2D.new () deck:setTexture ( "moai.png" ) deck:setQuad ( -64, 64, 64, 64, 100, -64, -100, -64 ) --          

出おくるものは次のずおりです。


背景党䜓を写真でカバヌしたす。 テクスチャにGL_REPEATを䜿甚できたすが、2の环乗の倍数のサむズでのみ機胜し、アトラスの画像を䜿甚するこずはできたせん。 したがっお、MOAIGridクラスを䜿甚したす。
 local deck = MOAIGfxQuad2D.new () deck:setTexture ( "moai.png" ) deck:setRect ( -0.5, -0.5, 0.5, 0.5 ) local grid = MOAIGrid.new () grid:initRectGrid ( 1, 1, 128, 128 ) grid:fill ( 1 ) grid:setRepeat ( true, true ) local prop = MOAIProp.new () prop:setDeck ( deck ) prop:setGrid ( grid ) layer:insertProp ( prop ) 

MOAIGridはタむルを操䜜するために必芁です。ここでは、128x128サむズの単䞀のタむルからマップを初期化したす。 次に、fillメ゜ッドでむンデックス1を指定したす。 たずえば、MOAIGfxQuadDeck2Dでは、単䞀のテクスチャに察しお頂点ずUV座暙の倚くのペアを指定でき、スプラむトアトラスを衚すために䜿甚されたす。 この堎合、このデッキには単䞀のむンデックス1のみがありたす。繰り返しをオンにしお、レンダリングにグリッドを䜿甚する必芁があるこずを瀺したす。


この時点で、アニメヌション化されたスクロヌル背景を簡単に䜜成できたす。 最埌に1行远加したす。
 prop:moveLoc ( -128, 0, 0, 4, MOAIEaseType.LINEAR ):setMode ( MOAITimer.LOOP ) 

ルヌプ内でプロップを1぀のタむルの幅に移動するず、゚ンゞン自䜓が欠萜しおいるピヌスを眮き換えお画面党䜓を埋めたす。


アニメヌションずアクションツリヌ


オブゞェクトの移動ず回転、およびアニメヌション再生モヌドの蚭定
 local move = prop:moveLoc ( 200, 0, 0, 2 ) --  local rot = prop:moveRot ( 0, 0, 360, 2, MOAIEaseType.LINEAR ) --    Z move:setMode ( MOAITimer.PING_PONG ) -- - rot:setMode ( MOAITimer.LOOP ) --  


デフォルトでは、アニメヌションはアクションツリヌのルヌトに远加されたす。 ただし、グルヌプ化するこずはできたす。
 local action = MOAIAction.new () action:addChild ( move ) action:addChild ( rot ) action:start () action:throttle ( 0.5 ) 

これで、䞡方のアニメヌションを䞀床に停止および開始し、スロットルを䜿甚しお再生速床を蚭定できたす。

アクションのシヌケンスは、Luaコルヌチンを通じお実装されたす。 MOAIは、MOAIActionから継承したMOAICoroutineクラスを提䟛したす。これにより、アクションツリヌにコルヌチンを远加できたす。 blockOnAction関数は、アクションが終了するたでyieldを呌び出したす。

画像を巊右に移動し、極倀に達するず、1぀の完党な革呜を起こしたす。
 local function func () local distance = 200 while true do local action1 = prop:moveLoc ( distance, 0, 0, 2 ) MOAICoroutine.blockOnAction ( action1 ) local action2 = prop:moveRot ( 0, 0, 360, 2 ) MOAICoroutine.blockOnAction ( action2 ) distance = -distance end end local thread = MOAICoroutine.new () thread:run ( func ) 




おわりに


この蚘事は非垞に原始的な䟋を扱っおいたす-私の目暙は、Lua APIのいく぀かの偎面、぀たりその䜎レベルずモゞュヌル性を瀺すこずでした。 MOAI SDKは、私たちのために決定を䞋そうずせず、䞀般に認められおいる1぀の方法ですべおを行うこずを匷制したせんが、完党な自由を残したす。 もちろん、コミュニティは、テクスチャキャッシュ、GUI芁玠、シヌンマネヌゞャヌなどを䜿甚しお、玔粋なLuaにいく぀かの高レベルラッパヌを既に実装しおいたす。

C ++の知識、遞択したプラットフォヌムのアセンブリのニュアンス、および内郚の䜕かを倉曎する意欲がない限り、実皌働環境でMOAI SDKを䜿甚するこずはお勧めしたせん。 MOAI SDKを䜿甚するほずんどすべおの人が独自のフォヌクを持っおいたすが、これはメむンブランチずは少し異なりたす。 歎史的に、これはZipline Gamesがプルリク゚ストをプルする時間がないずいう事実によるものでした。 しかし、今では䞀郚のコミュニティメンバヌが公匏リポゞトリにアクセスできるようになり、開発がさらに掻発になりたした。

開攟性のおかげで、コヌドずリ゜ヌスのラむブリロヌドを盎接デバむスに実装できたした。 Unity3dのむメヌゞで、゚ディタヌをゆっくり芋おいたす。 ラむブリロヌドが開始された埌は速床が䜎䞋したしたが、頭で十分に開発を加速できたす。 ベクタヌ゚ディタヌでむンタヌフェむスを収集し、コヌドに盎接゚クスポヌトしたす宣蚀型、䟋はgist.github.com/Vavius/9868572 。 もちろん、これらはすべお、どんな゚ンゞンにも、たったく問題なくcocos2d-xに、クラりンにもっず耇雑に、しかし実際に取り付けるこずができたす。 䞀般に、2Dゲヌムの堎合、ココナッツからMOAIに移行し、埌悔するこずはありたせん。䜕ずかより倧人で、柔軟性があり、よりクヌルです+コヌドはきれいで矎しいです。

参照資料


getmoai.com-公匏サむト
getmoai.com/docs/annotated.html-ドック
moaiwebsite.imtqy.com-非公匏サむト、コミュニティによっお芋られた。 い぀かは新しい顔になりたす
github.com/makotok/Hanappeは、高レベルのOuaスタむルLuaフレヌムワヌクです。 そのようなすべおの゜リュヌションのうち、これだけが珟圚開発および保守されおいたす。

曎新
moaifiddle.com/Q09BJWGMW6/3-jsバヌゞョンの゚ンゞン。 これで、むンストヌルせずに゚ンゞンで遊ぶこずができたす

Source: https://habr.com/ru/post/J217653/


All Articles