前回はキャラが家に入ったらローディング画面を表示するところまで 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
して右→左に流れる座標リストが作れる(ここはお手本を写経)
キャラが会社に出勤してゲームスタート!