mieki256's diary



2017/08/20() [n年前の日記]

#2 [python][cocos2d] Python + cocos2d のアクションについて

cocos2d のアクションについては、ちょっと記述が長くなりそうなので、別記事にしてメモ。

アクションについて。 :

スプライトやレイヤーを、移動、回転、拡大縮小したい時には、アクション(actions)てのが使えるらしい。例えば以下のような感じの指定ができる。
  • 「(x, y) の位置まで○秒かけて移動しろ」
  • 「xxx度まで、○秒かけて回転しろ」
  • 「xxx倍まで、○秒かけて拡大または縮小しろ」
コレ、便利なのか不便なのか、ちょっとよくわからん…。

下準備。 :

アクションを使いたいときは、スクリプトソースの最初のほうに、以下のような行を書くと記述が楽になるらしい。
from cocos.actions import *

アクションの指定の仕方。 :

アクションは、「.do()」で指定する。
# (400, 300) の座標まで3秒かけて移動しろ、というアクション
move = MoveTo((400, 300), 3)

# スプライトにアクションを指示
sprite.do( move )

移動、回転、拡大縮小のアクションは以下のような感じ。
  • 移動 : MoveTo((x, y), 秒)
  • 回転 : RotateBy(角度, 秒)
  • 拡大縮小 : ScaleBy(倍率, 秒)

更に、以下で囲むことで、動作の様子を変える(?)ことができる。
  • 逆の動作 : Reverse() で囲む
  • 永久に繰り返し : Repeat() で囲む。

「〜To()」は絶対値の指定で、「〜By()」は相対値の指定、らしい。
  • 「最終的に、この座標値/角度/倍率にしろ」てな時は、「〜To()」で指示。
  • 「今現在の座標値/角度/倍率から、これぐらい変化させろ」てな時は、「〜By()」で指示。
てな感じの認識で合ってるのだろうか…? よくわからんですが。

アクションの複数指定。 :

各アクションは、繋げて(連続して?)指示したり、同時に指示したりできる。

繋げる時は、「+」を使う。
scale = ScaleBy(3, 2)   # 3倍まで2秒かけて拡大

sprite.do(scale + Reverse(scale))
この例だと、2秒かけて3倍拡大した後、2秒かけて1/3に縮小する。( Reverse() で囲んでるので、逆の動きをする。つまり元の大きさに戻る)。

同時に指示する時は「|」を使う。
scale = ScaleBy(3, 2)         # 3倍まで2秒かけて拡大
move = MoveTo((400, 100), 2)  # (400,100)の位置に2秒かけて移動

sprite.do(scale | move)
この例だと、2秒かけて3倍拡大しつつ、同時に、(400,100)の位置まで移動する。

サンプルソース。 :

_Writing a cocos2d application - cocos v0.6.4 documentation の内容に細かく日本語コメントをつけたソースを一応置いときます。というか貼っときます。

_cocos2d_actions.py
_enemy_ball.png
"""
cocos2d : actions sample.

http://python.cocos2d.org
"""

# cocos2D を使うときは import cocos を最初のあたりに書く
import cocos
from cocos.actions import *

# pygletも使う
import pyglet


class MyLayer(cocos.layer.ColorLayer):
    u"""メインのレイヤー.

    カラーレイヤー(cocos.layer.ColorLayer)のサブクラス.
    """

    def __init__(self):
        u"""初期化処理."""
        # カラーレイヤーを青色で初期化
        super(MyLayer, self).__init__(64, 64, 224, 255)

        # labeを作成。
        # cocos.text.Label は pyglet.text.Label のラッパー。
        # CocosNode の利点を持つ。
        label = cocos.text.Label(
            'cocos.text.Label',
            font_name='Times New Roman',
            font_size=24,
            anchor_x='center', anchor_y='center',
            position=(400, 200)
        )

        # ラベルをレイヤーに登録。デフォルトのz値は0
        self.add(label)

        # pygletを使って画像を読み込み
        image = pyglet.image.load('./enemy_ball.png')

        # 拡大縮小時にボケないようフィルタを指定。
        pyglet.gl.glBindTexture(image.texture.target, image.texture.id)
        pyglet.gl.glTexParameteri(image.texture.target,
                                  pyglet.gl.GL_TEXTURE_MIN_FILTER,
                                  pyglet.gl.GL_NEAREST)
        pyglet.gl.glTexParameteri(image.texture.target,
                                  pyglet.gl.GL_TEXTURE_MAG_FILTER,
                                  pyglet.gl.GL_NEAREST)

        # spriteを生成
        # cocos.sprite.Sprite は pyglet.sprite.Sprite のラッパー
        sprite = cocos.sprite.Sprite(image.texture, position=(400, 400))

        # スプライトのスケール(拡大縮小率)を指定。デフォルトは1
        sprite.scale = 6

        # スプライトをレイヤーに登録。z値を1に
        self.add(sprite, z=1)

        # スケール変化のアクションを用意する。6倍まで1.5秒かけて変化
        scale = ScaleBy(6, duration=1.5)

        # ラベルにアクションを指定。スケール変化(拡大→縮小)を繰り返す
        label.do(Repeat(scale + Reverse(scale)))

        # スプライトにアクションを指定。スケール変化(縮小→拡大)を繰り返す
        sprite.do(Repeat(Reverse(scale) + scale))


if __name__ == "__main__":
    # directorの初期化は pyglet.window と同じ引数を取る
    cocos.director.director.init(width=800, height=600)

    # レイヤーを作成
    layer = MyLayer()

    # 回転アクションをレイヤーに対して指定
    layer.do(RotateBy(360, duration=4))

    # hello_layer レイヤーを含んだシーンを作成
    scene = cocos.scene.Scene(layer)

    # メインシーンを director に渡して実行
    cocos.director.director.run(scene)
実行すると、レイヤーがぐるりと回りつつ、レイヤーに登録されたスプライトとラベルが拡大縮小を繰り返す、みたいな。

以上です。

過去ログ表示

Prev - 2017/08 - Next
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project