Cocos2d-xのLuaプロジェクトの作成

「Cocos2d-x Advent Calendar 2014」の8日目は @zukkun が担当します。

Cocos2d-xのLuaプロジェクトをコマンドラインから作る流れを紹介します。

環境はMac OS X 10.9.5です。

## Cocos2d-xをダウンロード

[Download Cocos2d-x Cocos2d-html5 Cocos Studio | Cocos2d-x](http://www.cocos2d-x.org/download)

上記ページからCocos2d-xの「Download v3.2」を選び、Cocos2d-xをダウンロードします。

![cocos2d-x-download.png](https://qiita-image-store.s3.amazonaws.com/0/636/dfe407e4-6e90-32d3-3995-c70763af822c.png)

ダウンロードしたzipファイルを好きな場所に展開します。

## セットアップ

コマンドラインで、その展開したディレクトリに移動し、`setup.py`を実行します。

```bash
$ cd <Cocos2d-x path>
$ ./setup.py
```

途中でAndroid NDKとAndroid SDKのパスを聞かれますが、今回はスキップします。


使用しているシェルの設定ファイルに設定が追加された旨言われますので、指示に従い`source`コマンドで実行を行います。(自分の環境では`~/.zshrc`になりました)

```bash
Please execute command: "source <使用しているシェルの設定ファイル>" to make added system variables take effect
```

```bash
$ source <使用しているシェルの設定ファイル>
```

`cocos`コマンドが使えるようになっているのを確認します。

```bash
$ cocos -v
0.7
```

## プロジェクトファイルの作成

プロジェクトディレクトリを作りたい場所に移動し、`cocos new`コマンドを使ってプロジェクトを作成します。今回、使用するディレクトリは`/Users/zukkun`を例として進めます。

ここでは、例としてプロジェクト名「HogeLua」として作成を行います。

```bash
$ cd /Users/zukkun/
$ cocos new HogeLua -p com.your_company.hogelua -l lua -d .
```

`cocos new`コマンドのパラメータとして、最初に`HogeLua`としている部分がプロジェクト名です。

次に、`-p com.your_company.hogelua`としているところがアプリパッケージ名で、iOSアプリ、Androidアプリなどをビルドする際に使用されます。

`-l lua`としているところが「どのプロジェクトテンプレートを使用するか」という指定で、今回はLuaとしています。Luaでのゲームロジックの実装がすぐにできる状態でのプロジェクトが生成されます。他に`cpp`を指定してC++での開発のためのテンプレートを使用することもできます。

上記コマンドを実行し、以下のように表示されたらプロジェクトファイルの作成の成功です。

```bash
Running command: new
> Copy template into /Users/zukkun/HogeLua
> Copying files from template directory...
> Copying cocos2d-x files...
> Rename project name from 'HelloLua' to 'HogeLua'
> Replace the project name from 'HelloLua' to 'HogeLua'
> Replace the project package name from 'org.cocos2dx.hellolua' to 'com.your_company.hogelua'
```

## ディレクトリ構造

作成されたプロジェクトファイルのディレクトリ構造は以下のようになっています。

```bash
├── frameworks
│   ├── cocos2d-x -> こちらの内容のディレクトリ構造は省略
│   └── runtime-src
│       ├── Classes
│       ├── proj.android
│       ├── proj.ios_mac
│       ├── proj.linux
│       └── proj.win32
├── res
│   └── fonts
├── runtime
│   └── ios
└── src
```

## frameworks/cocos2d-xをシンボリックリンクで対応する

`frameworks/cocos2d-x`は、ダウンロードしてきて展開したCocos2d-xのディレクトリへのシンボリックリンクでも代用できますので、バージョン管理する際はそうしておいた方がいいかもしれません。

今回、念のためそうしておきましょう。

まず、元のディレクトリをまるっと消してから、シンボリックリンクを貼ります。

```bash
$ cd /Users/zukkun/HogeLua
$ rm -rf frameworks/cocos2d-x
$ ln -s <Cocos2d-x path> framewoks/cocos2d-x
```

## ビルドを試す

上記のシンボリックリンクが正しく行われているかどうかの確認も含め、プロジェクトのビルドを試します。

ビルドには`cocos compile`コマンドを使用します。

```
$ cd /Users/zukkun/HogeLua
$ cocos compile -p mac
```

`-p mac`は、ビルド対象のプラットフォームの指定で、今回Macで動作するもののビルドを試します。

※Mac, iOS向けのビルドにはXcodeがインストールされている必要があります

ビルドを実行すると、Cocos2d-xのエンジン全体のコンパイルが行われますので、ビルドに時間を要します。マシンのCPUファンが唸りを上げると思います。

最後に以下のような表示がされたら、ビルド成功です。

```bash
** BUILD SUCCEEDED **

build succeeded.
```

## 実行する

ビルドができたら`cocos run`コマンドで実行してみます。

```bash
$ cocos run -p mac
```

`-p mac`は、`cocos compile`の時と同じ対象プラットフォームの指定になります。

上記の実行を行いますと、新たにウィンドウが開かれ、プロジェクトテンプレートに入っているままのサンプルが動作します。

![cocos-lua-sample.png](https://qiita-image-store.s3.amazonaws.com/0/636/0d8b768f-5d23-7a8c-ec95-776fe4cf881a.png)

陽気な音楽と共に、リスらしき生命体が延々と歩き出します。

## ソースを読む

このテンプレートのサンプルのゲームロジックに相当するプログラムは、`src/main.lua`に記述されています。

ゲームロジックを書いていく場合、こちらのファイルを触ることになります。

## 実行されるLuaのファイルを変更する

プロジェクトテンプレートとして`src/main.lua`が実行されるようになっているのは、C++側で`src/main.lua`が実行されるように記述されているからで、それを変更することで、実行されるLuaのファイルを変えることができます。

Luaが実行される記述がされているファイルは`frameworks/runtime-src/Classes/AppDelegate.cpp`になります。

こちらのファイルに以下のような記述があります。

```cpp:frameworks/runtime-src/Classes/AppDelegate.cpp
bool AppDelegate::applicationDidFinishLaunching()
{
    auto engine = LuaEngine::getInstance();
    ScriptEngineManager::getInstance()->setScriptEngine(engine);
    if (engine->executeScriptFile("src/main.lua")) {
        return false;
    }

    return true;
}
```

上記の`engine->executeScriptFile("src/main.lua")`がLuaの実行部分なので、ここを改変することが可能です。

また、プロジェクトテンプレートとしては、ゲームロジックすべてをLuaで書くことを想定しているような印象ですが、上記のようにC++側で任意にLuaを実行することが可能ですので、一部のゲームロジックのみLuaで記述したり、イベントスクリプトのような用途でのみLuaで記述する、といったことも可能ですが、比較的テクニカルな領域になりますので、さくっとゲームを作りたい、という場合は、ゲームロジックはすべてLuaで書く、という使用方法を選択するのが良さそうです。

## サンプルの内容

`src/main.lua`の内容の読み解きとその解説もしようと思っていましが、けっこう時間を要しそう＆長くなりそうなので、今回は割愛します。

## Cocos2d-xの書籍

Cocos2d-xと言えば @giginet さんですが、そんなgiginetさんがCocos2d-xの本を出します！2014年12月24日発売予定です。

[『cocos2d-xではじめるスマートフォンゲーム開発』という本を出版します - 5.1さらうどん](http://giginet.hateblo.jp/entry/2014/11/26/185855)

書籍には、Luaに関する解説は無いようですが、Luaから実行できるCocos2d-xのAPIは、C++のものと同じですので、本書はLuaでの開発にも生かせると思います。私も買います。


明日は @kyokomi さんです。