アクションの基本（Cocos Code IDE, Lua言語）


Cocos Code IDEを使ってLua言語で、アクションを扱う基本です。

|実行環境、IDE|Cocos2d-xバージョン|言語|
|:--|:--|:--|
|Cocos Code IDE Mac OS X 1.0.0-RC2|Cocos2d-x V3.2|Lua言語|

## サンプルコード

プロジェクトを新規作成で作成します。（FileメニューのNew->Cocos Lua Project...から作成できます。）
プロジェクト名は適当につけてください。画面は縦画面(portrait)を指定します。

main.luaファイルを修正します。

```lua:main.lua/26行目
cc.Director:getInstance():getOpenGLView():setDesignResolutionSize(320, 480, 0) -- 縦画面用に(480, 320, 0)から(320, 480, 0)に変更
```

```lua:main.lua/31行目
--gameScene:playBgMusic() --使わないのでコメントアウト
```

GameScene.luaを書き換えます。

```lua:GameScene.lua
require "Cocos2d"
require "Cocos2dConstants"

local GameScene = class("GameScene",function()
    return cc.Scene:create()
end)

function GameScene.create()
    local scene = GameScene.new()
    local visibleSize = cc.Director:getInstance():getVisibleSize()

    -- スプライトを作成
    local sprite = cc.Sprite:create("character.png")
    sprite:setPosition(0, 0)
    scene:addChild(sprite)

    -- アクションを実行
    local action = cc.MoveTo:create(3, cc.p(visibleSize.width/2, visibleSize.height/2))
    sprite:runAction(action)
    
    return scene
end

return GameScene

```

適当な画像をcharacter.pngのファイル名でresディレクトリに加えてください。
実行すると、(0,0)から画面中央まで3秒かけてスプライトが移動します。


## 移動系

Cocos2d-xにはいろいろなアクションが用意されています。ここでは移動に関するアクションの例を示します。

### 移動する

MoveTo、MoveByを使います。 MoveToはその座標まで、MoveByは現在の座標から指定した座標を加えて移動します。

```lua
local action = cc.MoveTo:create(3, cc.p(100, 100))
sprite:runAction(action)
```

### 回転する
RotateTo、RotateByを使います。RotateToは指定した角度まで最短方向で回転、RotateByでは現在の角度から値を加えて回転します。

```lua
local action = cc.RotateTo:create(3, 45) -- 3秒かけて45度回転
sprite:runAction(action)
```

ちなみにcreate(3, 720, 0)のように引数を3つにすると、3D座標でX軸中心の回転やY軸中心の回転を行えますが、ここでは割愛します。

### 拡大縮小
ScaleTo、ScaleByを使います。

```lua
local action = cc.ScaleTo:create(3, 2) -- 3秒かけて2倍に拡大
sprite:runAction(action)
```

### ジャンプ

JumpTo、JumpByを使います。
アクションの時間、移動先の座標、ジャンプの高さ、ジャンプの回数をcreateメソッドの引数に指定します。

```lua
local action = cc.JumpTo:create(3, cc.p(300, 300), 50, 5) -- 3秒間、(300,300)へ移動、高さ50、ジャンプ5回
sprite:runAction(action)
```

## アクションを連続で実行したり、同時に実行したり、繰り返す、停止する
ここでは複数のアクションを扱う方法や、アクションの停止などの例を示します。

### 連続してアクションを実行する

複数のアクションを連続して実行するには、Sequenceを使います。

```lua:
local action1 = cc.MoveTo:create(3, cc.p(100, 100))
local action2 = cc.RotateTo:create(3, 45) -- 3秒かけて45度回転
local sequence = cc.Sequence:create(action1, action2)
sprite:runAction(sequence)
```

この例では、（100,100)へ移動後に45度回転します。

### 同時並行でアクションを実行する

複数のアクションを同時並行で実行するには、Spawnを使います。

```lua:
local action1 = cc.MoveTo:create(3, cc.p(100, 100))
local action2 = cc.RotateTo:create(3, 45) -- 3秒かけて45度回転
local spawn = cc.Spawn:create(action1, action2)
sprite:runAction(spawn)

```

この例では(100,100)へ45度回転しながら移動します。

### アクションを繰り返す

アクションを繰り返すにはRepeat、RepeatForeverを使います。
Repeatは繰り返す回数を指定します。
RepeatForeverは無限に繰り返します。

```lua
local action = cc.RotateBy:create(1, 45) -- 1秒かけて45度回転
local repeatAction = cc.Repeat:create(action, 3) -- 3回繰り返す
sprite:runAction(repeatAction)
```

### アクションを停止する

アクションを止めるにはノードのstopAllActionsメソッドやstopActionメソッドを使います。

```lua
-- すべてのアクションを停止する
sprite:stopAllActions()
-- 特定のアクションを停止する
sprite:stopAction(action)
```

### 一時的にアクションを止めたり、再開する

アクションを一時的に止めたり、再開するにはノードのpauseメソッドやresumeメソッドを使います。

```lua
-- アクションを一時停止する
sprite:pause()
-- アクションを再開する
sprite:resume()
```

## その他
よく使いそうなその他のアクションです。

### フェードイン・フェードアウト

FadeIn、FadeOut、FadeToを使います。
FadeInは透明の状態から徐々に現れます。最初にスプライトを透明にしておく必要があります。
FadeOutは徐々に透明になります。
FadeToは指定した透明度へ変化します。

```lua
sprite:setOpacity(0)
local action = cc.FadeIn:create(3) -- 3秒かけて出現する
sprite:runAction(action)
```

### 画像の反転

X方向、またはY方向に画像を反転するには、FlipX、FlipYを使います。

```lua
local action = cc.FlipX:create(true)
sprite:runAction(action)
```

(通常は他のアクションと組み合わせて使います。アクションを使わずに、ただ反転するならsprite:setFlippedX(true)を使います。）

### 表示、非表示

Showを使うと表示、Hideを使うと非表示です。

```lua
local action = cc.Hide:create()
sprite:runAction(action)
```

ToggleVisibilityは表示・非表示を切り替えます。

```lua
local action = cc.ToggleVisibility:create()
sprite:runAction(action)
```

（これも通常は他のアクションと組み合わせて使います。）

### 逆方向のアクションを得る

作成したアクションの逆の動作を得るにはreverseメソッドを使います。
（すべてのアクションで、逆の動作を得られるわけではありません。）

```lua
local action = cc.RotateBy:create(3, 45) -- 3秒かけて45度回転
sprite:runAction(action:reverse())
```

### 一定時間待機する

何もしないで一定時間待機するには、DelayTimeを使います。Sequenceと組み合わせて使うことが多いです。

```lua
local action1 = cc.DelayTime:create(3) -- 3秒待機
local action2 = cc.RotateTo:create(3, 45) -- 3秒かけて45度回転
local sequence = cc.Sequence:create({action1, action2})
sprite:runAction(sequence)
```

### アクションの実行で、関数を呼び出す
CallFuncを使います。Sequenceと組み合わせて使うことが多いと思います。

```lua
-- 呼ばれる関数を準備
local function func(node)
    print("funcが呼ばれました。")
end

-- アクションを実行
local action = cc.RotateTo:create(3, 45) -- 3秒かけて45度回転
local callFunc = cc.CallFunc:create(func)
local sequence = cc.Sequence:create({action, callFunc})
sprite:runAction(sequence)

```

引数にテーブルのデータを渡すこともできます。

```lua
local function func(node, value)
end
    
local value = {}
local callFunc = cc.CallFunc:create(func, value)
```

### 自身を削除する

自身を削除するにはRemoveSelfを使います。これも単体で使うことはなく、他のアクションと組み合わせて使うことになります。

```lua
local action = cc.RotateTo:create(3, 45) -- 3秒かけて45度回転
local remove = cc.RemoveSelf:create()
local sequence = cc.Sequence:create({action, remove})
sprite:runAction(sequence)
```

この例では、3秒かけて45度回転した後、自身のスプライトを削除します。

---

## その他のアクション

その他、アクションについてこちらのサイトにまとめましたので、よかったら参考にしてください。
[アクションを利用する - Cocos Code IDEでゲームを作る 逆引き辞典for Lua](http://cocos2d-x-lua.senchan-office.com/action)