Cocos2d-x:Luaで書く





良い一日。

そもそも、ハブでCocos2dとLuaのチュートリアルを見つけられなかったので、私は多くの苦労を強いられたので、間違いを繰り返さないように、投稿を書くことにしました。 この記事では、Cocos2d -x 、Cocos Code IDE、およびLuaを使用して簡単なゲームを作成する方法を説明します。 以前 、Love2dでゲームを作成することについてはすでに書いています。 この記事では、古いチュートリアルをココナッツに適合させ、アンドロイドで実行する方法を説明します(リンゴもポピーもありません)。



何が必要ですか?



重要なもののリスト:

Android用のゲームを作成する場合は、さらに2つをダウンロードする必要があります。

設置



まず、Java JDKとPythonを配置します。 cocos2d-xとCocos Code IDEを解凍した後(zipバージョンをダウンロードしていない場合は、インストールを実行してください)、便利な場所に置きます。 Android SDK、NDK、Apache Antも便利な場所に解凍します。 問題を回避するために、それらのパスにはスペースを含めないでください。 SDKでフォルダーを開き、SDKマネージャーを見つけます。 必要なAPIバージョンとToolsフォルダー全体を起動してインストールします。

Cocos Code IDEを起動します。 Window-> Preferences-> Cocosで、必要なパスを指定します。 私にとってはこのように見えます:



[Cocos]タブにある[Lua]タブをクリックして、cocos2d-xへのパスを選択します。



設定済み。

理論のビット



Cocos2d-x-C ++で記述されたクロスプラットフォームエンジンは、Cocos2dのコピーとして作成されました。 Cocos2dはObject Cを使用し、iOSでのみ使用できます。

次に、エンジンの基本的なメカニズムについて説明し、Love2Dと比較しましょう。 ココナッツでは、すべてのオブジェクトはレイヤーにあり、レイヤーはシーンにあります。 Love2Dにはレイヤーやシーンはありません。 シーンとレイヤーの利点は、それらを使用して、より簡単な方法で柔軟なアプリケーションを作成できることです。 欠点は、単純なゲームではかさばりすぎて不便になる可能性があることです。 ココナッツでは、すべてがオブジェクトによって表され、画面に表示される何かをシーンに追加する必要があり、love2dではすべてが単純な変数で表示され、画面に表示される何かはフレームごとに描画する必要があります。 これは長い間説明できるので、今結論を述べます。あなたは自分で違いを感じることができます。 Cocos2d-xは多くの機能を備えた大きなエンジンですが、それらへのアクセスは私たちが望むように行われないことがよくあります。 Love2dは、レスポンシブコミュニティを備えたシンプルで知識のないエンジンですが、後でユーザー自身が作成する多くの必要なものがありませんが、非常に成功しています。

そして今、コード自体



新しいプロジェクトを作成します。 そして、ソースにはhello2.luaとmain.luaの2つのファイルがあります。 中国のゲーム乙女の奇跡を見たくない場合は、最初のものをすぐに削除し、2番目のものをきれいにすることができます。 の能力を証明するように設計されて必要とします 。 main.luaを開き、luaの下でポートを使用する方法を理解するために必要なコードの束を確認します。 内容を確認するには、F11を押します。 いろいろと遊べます。 これは走る生き物であり、これは犬であり、あなたが考えるかもしれないリスではありません。 見て、遊んで、それで十分です。 hello2.luaとmain.luaのすべてのコードを削除し、resフォルダーをクリアします。 resフォルダーに画像を追加し、habr.pngと呼びます。 次に、mainで次のコードを記述します。

--   require "Cocos2d" --   require "Cocos2dConstants" --    cclog = function(...) print(string.format(...)) end --     function __G__TRACKBACK__(msg) cclog("\n----------------------------------------") cclog("LUA ERROR: " .. tostring(msg)) cclog(debug.traceback()) cclog("----------------------------------------") return msg end collectgarbage("collect") --    collectgarbage("setpause", 100) collectgarbage("setstepmul", 5000) --        "src"  "res" cc.FileUtils:getInstance():addSearchResolutionsOrder("src"); cc.FileUtils:getInstance():addSearchResolutionsOrder("res"); --       SCREEN_WIDTH = cc.Director:getInstance():getWinSize().width SCREEN_HEIGHT = cc.Director:getInstance():getWinSize().height local function main() print("Resolution: " .. SCREEN_WIDTH .. "x" .. SCREEN_HEIGHT) --   require "mainScene.lua" end --  main local status, msg = xpcall(main, __G__TRACKBACK__) if not status then error(msg) end
      
      







main関数では、mainScene.luaファイルを呼び出します。 ゲームのメインシーンが含まれています。 それを作成し、そこに次のコードを記述します。

 --  local NONE = 0 local ROTATION = 1 local SCALLING = 2 local MOVING = 3 --  local state, rotation, scale, ox, oy, delta, habrImage, moving --         local function onTouchBegan(touch, event) --    state = (state + 1) % 4 --      resetVariables() end --    ,   dt    --  .  dt == 1.0,      --   local function update(dt) if state == ROTATION then --  rotation = rotation + delta * dt elseif state == SCALLING then -- scale = scale + dt * delta elseif state == MOVING then --  ,    : --     moving,  --         --     moving = moving + delta * dt local radius = 50 ox = radius * math.sin(moving) oy = radius * math.cos(moving) end --  love2d       --           --   --   habrImage:setScale(scale) --   habrImage:setRotation(rotation) --   habrImage:setPosition(cc.p(SCREEN_WIDTH / 2 + ox, SCREEN_HEIGHT / 2 + oy)) end local function init() print("Creating main scene") --   local mainScene = cc.Scene:create() --      --           --      2        -- . 1)  C++   cc.c4b(r,g,b,a)    -- ,      C++  ,   -- cocos2d-x-js, ..     cocos2d-x-lua --          C++,     -- JavaScript ,       local gameLayer = cc.LayerColor:create(cc.c4b(255, 255, 255, 255)) --   habrImage = cc.Sprite:create("res/habr.png") --     habrImage:setAnchorPoint(0.5, 0.5) --     habrImage:setPosition(cc.p(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2)) --    gameLayer:addChild(habrImage) state = 0 resetVariables() --   update    ,    --  cc.Director:getInstance():getScheduler():scheduleScriptFunc(update, 0, false) --    .   ,    --     . local listener = cc.EventListenerTouchOneByOne:create() --  ,           listener:registerScriptHandler(onTouchBegan, cc.Handler.EVENT_TOUCH_BEGAN ) --     local eventDispatcher = gameLayer:getEventDispatcher() eventDispatcher:addEventListenerWithSceneGraphPriority(listener, gameLayer) --    mainScene:addChild(gameLayer) --    -    if cc.Director:getInstance():getRunningScene() then cc.Director:getInstance():replaceScene(mainScene) else cc.Director:getInstance():runWithScene(mainScene) end end function resetVariables() rotation = 0 scale = 1 ox = 0 oy = 0 delta = 20 moving = 0 end --  init()
      
      







答えを見つけるのに役立つことについて少し説明します。 最初:luaのポートはC ++とほぼ同じであり、主な違いはここにあります 。 第二に、先ほど書いたように、C ++ポートに何も見つからない場合は、JSエンジンでこの問題を探してみてください。 luaよりも人気がありますが、多くの違いがありますが、非常によく役立ちました。 出てきたものを開始するには、F11を押します。 Androidで起動するには、[構成のデバッグ]ボタンをクリックして[Android]を選択します。 実行するには、カスタマイズされたadbが必要ですが、それについては非常に多くの記事があるため、ここでは説明しません。 読んでくれてありがとう(:



結果は次のとおりです。








All Articles