#!/usr/bin/python # -*- mode: python; Encoding: utf-8; coding: utf-8 -*- # Last updated: <2017/08/21 02:32:14 +0900> u""" cocos2d : sprite and action sample. アクションを自作して大量にスプライトを表示してみる版. """ import cocos from cocos.director import director import math import pyglet from pyglet import gl class MyAction(cocos.actions.Action): u"""スプライトに与えるアクション. 画面外に出たら速度を反転する。 """ def init(self, vec): u"""初期化処理. 速度をタプルで渡す.""" self.vec = vec def step(self, dt): u"""毎フレーム呼ばれる処理.""" wdw_w, wdw_h = director.get_window_size() wh = self.target.image.width / 2 hh = self.target.image.height / 2 x, y = self.target.position dx, dy = self.vec # 本来はdtを使って計算したほうがいいが # 処理落ち時に動作がおかしくなるのでdtは使ってない x += dx y += dy # 画面外にぶつかったら速度を反転 if x <= wh or x >= wdw_w - wh: dx *= -1 if y <= hh or y >= wdw_h - hh: dy *= -1 # 座標と速度を更新 self.target.position = (x, y) self.vec = (dx, dy) class MyLayer(cocos.layer.Layer): u"""メインとなるレイヤー. cocos.layer.Layerのサブクラス.""" def __init__(self): u"""初期化処理.""" super(MyLayer, self).__init__() # pygletで画像を読み込み image = pyglet.image.load('enemy_ball.png') # 拡大縮小時にボケないようにフィルタを指定。 gl.glBindTexture(image.texture.target, image.texture.id) gl.glTexParameteri(image.texture.target, gl.GL_TEXTURE_MIN_FILTER, gl.GL_NEAREST) gl.glTexParameteri(image.texture.target, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST) # batchノードを生成登録 self.batchnode = cocos.batch.BatchNode() self.add(self.batchnode) # sprite群を生成してbatchノードに登録 num = 160 spd = 3.0 a = 360.0 / num wdw_w, wdw_h = director.get_window_size() cx, cy = wdw_w / 2, wdw_h / 2 for i in range(num): sprite = cocos.sprite.Sprite(image.texture) sprite.position = (cx, cy) rad = math.radians(a * i) dx = spd * math.cos(rad) dy = spd * math.sin(rad) sprite.do(MyAction((dx, dy))) self.batchnode.add(sprite) def main(): u"""メイン処理.""" director.init() layer = MyLayer() scene = cocos.scene.Scene(layer) director.show_FPS = True director.run(scene) if __name__ == "__main__": main()