buto > /dev/null

だいたい急に挑戦してゴールにたどり着かずに飽きる日々です

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

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

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

f:id:butorisa:20201020173612g:plain

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

Pyxel Editorでアイテムを描く

プログラミング言語のアイコンたち

f:id:butorisa:20201020173656p:plain f:id:butorisa:20201020173719p:plain f:id:butorisa:20201020173730p:plain

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

アイテムのクラスを定義

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して右→左に流れる座標リストが作れる(ここはお手本を写経)

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

f:id:butorisa:20201020173748g:plain