金子邦彦研究室プログラミングPythonCocos2d を使ってみる

Cocos2d を使ってみる

Cocos2d は2次元ゲームのフレームワーク.Python で動く. (Cocos2d から派生した Cocos2d-x は iOS や Android でも動き、普及している.)

このWebページでは、次の基本的なことを、見本プログラムで演習する.

関連する資料:Cocos2d の概要 [PDF], [パワーポイント]

関連する資料:ゲームエンジン[PDF], [パワーポイント]

関連する資料:Cocos2d のイベントハンドラ、アクション

関連する外部ページhttp://python.cocos2d.org/doc.html

謝辞

Cocos2d の作者に感謝します.

前準備

Python のインストール,pip と setuptools の更新,Python 開発環境のインストール

手順は,別ページ »で説明

インストールを行わず,Google Colaboratory を利用することもありえる. Google Colaboratory の使い方などは, 別ページ »で説明

cocos2d, pyglet のインストール

Cocos2d を用いて画面を開き,テキストを表示

  1. Python プログラムの実行

    Python プログラムの実行

    【サイト内の関連ページ】 Python のまとめ: 別ページ »

    import random
    import cocos
    from cocos import scene
    from cocos.layer import Layer, ColorLayer
    from cocos.director import director
    import pyglet
    from pyglet.window import key
    from time import sleep
    
    class MyActor(cocos.text.Label):
        def __init__(self, text, x, y, size, rgba):
            super(MyActor, self).__init__(
                text, 
                font_name = "Times New Roman", 
                font_size = size, 
                anchor_x = 'center', 
                anchor_y = 'center', 
                color = rgba 
            )
            self.position = cocos.euclid.Vector2(x, y) 
    
    class Layer00(Layer):
        is_event_handler = True
        def __init__(self):
            super(Layer00, self).__init__()
            self.myactor = MyActor("Hello,World!", 400, 240, 32, (0, 200, 255, 255))
            self.add(self.myactor)
    
    director.init(width=640, height=480)
    director.run( scene.Scene( Layer00() ) )
    
    [image]
  2. 結果を確認したら,右上の「x」をクリックして終了. 
    [image]

* 演習問題: 「Hello World!」のところを書き換えて、表示されるテキストを変えてみなさい.実行ボタンを押して確認すること

* 演習問題: 「font_size = 32」のところを書き換えて、フォントサイズを変えてみなさい.実行ボタンを押して確認すること

Cocos2d でのキーボードのイベント

キーボードのキーが押されたり、離されたりするというイベントが起きると、 self.keys_being_pressedに「いま押されているキー(複数可)」の情報を入れる

  1. spyder で次の Python プログラムを実行

    エディタの画面にコピー&ペーストして,実行ボタンをクリック.

    import random
    import cocos
    from cocos import scene
    from cocos.layer import Layer, ColorLayer
    from cocos.director import director
    import pyglet
    from pyglet.window import key
    from time import sleep
    
    class MyActor(cocos.text.Label):
        def __init__(self, text, x, y, size, rgba):
            super(MyActor, self).__init__(
                text, 
                font_name = "Times New Roman", 
                font_size = size, 
                anchor_x = 'center', 
                anchor_y = 'center', 
                color = rgba 
            )
            self.position = cocos.euclid.Vector2(x, y) 
    
    class Layer00(Layer):
        is_event_handler = True
            
        def __init__(self):
            super(Layer00, self).__init__()
            self.myactor = MyActor("Hello,World!", 400, 240, 32, (0, 200, 255, 255))
            self.keys_being_pressed = set()
            self.update_text()
            self.add(self.myactor)
    
        def update_text(self):
            key_names = [key.symbol_string(k) for k in self.keys_being_pressed]
            self.myactor.element.text = "Keys: " + ", ".join(key_names)
    
        def on_key_press(self, key, modifiers):
            self.keys_being_pressed.add(key)
            self.update_text()
    
        def on_key_release(self, key, modifiers):
            self.keys_being_pressed.remove(key)
            self.update_text()
    
    director.init(width=640, height=480)
    director.run( scene.Scene( Layer00() ) )
    
    [image]
  2. キーボードを押したり、離したりしてみる.同時に複数のキーを押してみる.
    [image]
  3. 結果を確認したら,右上の「x」をクリックして終了.
    [image]

* 演習問題: 上の手順を行いなさい

Cocos2d でのマウスのイベント

  1. spyder で次の Python プログラムを実行

    エディタの画面にコピー&ペーストして,実行ボタンをクリック.

    import random
    import cocos
    from cocos import scene
    from cocos.layer import Layer, ColorLayer
    from cocos.director import director
    import pyglet
    from pyglet.window import key
    from time import sleep
    
    class MyActor(cocos.text.Label):
        def __init__(self, text, x, y, size, rgba):
            super(MyActor, self).__init__(
                text, 
                font_name = "Times New Roman", 
                font_size = size, 
                anchor_x = 'center', 
                anchor_y = 'center', 
                color = rgba 
            )
            self.position = cocos.euclid.Vector2(x, y) 
    
    class Layer00(Layer):
        is_event_handler = True
            
        def __init__(self):
            super(Layer00, self).__init__()
            self.position_x = 0
            self.position_y = 0
            self.myactor = MyActor("Hello,World!", 0, 0, 32, (0, 200, 255, 255))
            self.add(self.myactor)
    
        def update_text(self, mouse_x_pos, mouse_y_pos):
            self.myactor.element.text = 'Mouse is at %d,%d' % (mouse_x_pos, mouse_y_pos)
            self.myactor.x = self.position_x
            self.myactor.y = self.position_y
    
        def on_mouse_motion(self, x, y, dx, dy):
            self.update_text(x, y)
    
        def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers):
            self.update_text(x, y)
    
        def on_mouse_press(self, x, y, buttons, modifiers):
            self.position_x, self.position_y = director.get_virtual_coordinates(x, y)
            self.update_text(x, y)
    
    director.init(width=640, height=480)
    director.run( scene.Scene( Layer00() ) )
    
    [image]
  2. マウスを動かしたり、ボタンを押したりしてみる
    [image]
  3. 結果を確認したら,右上の「x」をクリックして終了.
    [image]

* 演習問題: 上の手順を行いなさい

Cocos2d での画面切り替え(画面のレイヤ分け)

  1. spyder で次の Python プログラムを実行

    エディタの画面にコピー&ペーストして,実行ボタンをクリック.

    import random
    import cocos
    from cocos import scene
    from cocos.layer import Layer, ColorLayer
    from cocos.director import director
    import pyglet
    from pyglet.window import key
    from time import sleep
    
    class MyActor(cocos.text.Label):
        def __init__(self, text, x, y, size, rgba):
            super(MyActor, self).__init__(
                text, 
                font_name = "Times New Roman", 
                font_size = size, 
                anchor_x = 'center', 
                anchor_y = 'center', 
                color = rgba 
            )
            self.position = cocos.euclid.Vector2(x, y) 
    
    class Layer00(ColorLayer):
        is_event_handler = True
            
        def __init__(self):
            super(Layer00, self).__init__(155, 89, 182, 1000)
            self.myactor = MyActor("Layer00", 400, 240, 32, (0, 200, 255, 255))
            self.add(self.myactor)
                
        def on_key_press(self, key, modifiers):
            director.replace(scene.Scene(Layer01()))
    
    class Layer01(ColorLayer):
        is_event_handler = True
            
        def __init__(self):
            super(Layer01, self).__init__(231, 76, 60, 1000)
            self.myactor = MyActor("Layer01", 400, 240, 32, (0, 200, 255, 255))
            self.add(self.myactor)
                
        def on_key_press(self, key, modifiers):
            director.replace(scene.Scene(Layer00()))
    
    director.init(width=640, height=480)
    director.run( scene.Scene( Layer00() ) )
    
    [image]
  2. キーボードのキーを押すと画面が切り替わるので確認する
    [image]
    [image]
  3. 結果を確認したら,右上の「x」をクリックして終了.
    [image]

* 演習問題: 上の手順を行いなさい