pyxel ゲーム画面にアイテムを流す

前回はキャラが家に入ったらローディング画面を表示するところまで
pyxel ゲーム画面遷移+動きをつける

今回はゲーム画面にアイテム(オブジェクト?)を流してみる
すべてのコード+画像はこちら

お手本の記事はこちら
【Pythonでゲームを作ろう!】レトロな2Dゲームを作ってみた!

Pyxel Editorでアイテムを描く

某プログラミング言語のアイコンたち
  
このアイテムをたくさんゲットしてキャラのスキル(スコア)がアップしていくゲームにする予定

アイテムのクラスを定義

class Skill(Enum):  
    """ 画面に流れるオブジェクト """  
    Java = auto()  
    Python = auto()  
    Ruby = auto()  

    def __init__(self, num):  
        self.position = [(i * 60, randint(0, 104)) for i in range(4)]  

    def get_image(self, enum):  
        """ イメージバンクから切り出す座標を返す """  
        if enum == 'Java':  
            return 32, 80  
        elif enum == 'Python':  
            return 48, 80  
        elif enum == 'Ruby':  
            return 0, 96  

アイテムを追加したらEnumを追加する __init__()でアイテムのランダムに初期位置を設定

# ゲームのメインクラス  
def __init__(self):  
    self.skill = self.create_skill()  

def create_skill(self):  
    """ skillオブジェクト生成 """  
    num = len([obj.name for obj in Skill])  
    skills = [Skill(i) for i in range(1, num + 1)]  
    return skills  

ゲーム本体の初期化処理で全部のEnumクラスを生成してリストで保持している
self.skill = [Javaクラスオブジェクト, Pythonクラスオブジェクト...]

アイテムを画面に描画

def draw_object(self):  
    """ 流れてくるオブジェクトを描画 """  
    for enum in self.skill:  
        u, v = enum.get_image(enum.name)  
        for x, y in enum.position:  
            pyxel.blt(x, y, 0, u, v, 16, 16, 5)  

初期化処理で生成したself.skillから要素を1つずつ取り出してpyxel.blt()で描画する
上記のSkillクラスget_image()の引数にEnumクラス名を渡すと対応したアイテム画像の座標が
返ってくる

アイテムが流れるアニメーションをつける

# ゲームのメインクラス  
def update(self):  
    """ 画面のコントロール """  
    # キー操作でキャラ移動する処理なども書かれている  

    if self.game_mode == GameMode.Office:  
        for enum in self.skill:  
            for i, v in enumerate(enum.position):  
                enum.position[i] = self.update_object(*v)  

ここでもself.skillから取り出した各Enumクラスのposition属性に位置座標を追加する

def update_object(self, x, y):  
    """ オブジェクトのアニメーション """  
    x -= 2  
    if x < -40:  
        x += 240  
        y = randint(0, 104)  
    return x, y  

位置座標を引数のx座標 - 2して右→左に流れる座標リストが作れる(ここはお手本を写経)

キャラが会社に出勤してゲームスタート!