2017/08/20(日) [n年前の日記]
#2 [python][cocos2d] Python + cocos2d のアクションについて
cocos2d のアクションについては、ちょっと記述が長くなりそうなので、別記事にしてメモ。
◎ アクションについて。 :
スプライトやレイヤーを、移動、回転、拡大縮小したい時には、アクション(actions)てのが使えるらしい。例えば以下のような感じの指定ができる。
- 「(x, y) の位置まで○秒かけて移動しろ」
- 「xxx度まで、○秒かけて回転しろ」
- 「xxx倍まで、○秒かけて拡大または縮小しろ」
◎ 下準備。 :
アクションを使いたいときは、スクリプトソースの最初のほうに、以下のような行を書くと記述が楽になるらしい。
from cocos.actions import *
◎ アクションの指定の仕方。 :
アクションは、「.do()」で指定する。
移動、回転、拡大縮小のアクションは以下のような感じ。
更に、以下で囲むことで、動作の様子を変える(?)ことができる。
「〜To()」は絶対値の指定で、「〜By()」は相対値の指定、らしい。
# (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.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)実行すると、レイヤーがぐるりと回りつつ、レイヤーに登録されたスプライトとラベルが拡大縮小を繰り返す、みたいな。
[ ツッコむ ]
以上です。