前回は画面を右から左に流れるアイテムを実装しました pyxel ゲーム画面にアイテムを流す
今回のソースコードはこちら https://github.com/butorisa/pretty-hopper/tree/debug
アイテムゲット時の動きを実装
キャラが流れてくるアイテムと衝突したら「衝突したアイテムが消える」ようにする
class Skill(Enum): """ 画面に流れるオブジェクト """ Java = auto() Python = auto() Ruby = auto() def __init__(self, num): self.active = True self.position = [(i * 60, randint(0, 104)) for i in range(4)]
アイテムオブジェクトのクラス 衝突時に self.active
をFalseにすれば消える
def switch_active(self, obj_x, obj_y, target_x, target_y, is_activate): """ オブジェクトが重なったら一方を非表示にする """ if not is_activate: return False if abs(obj_x - target_x) < 10 and abs(obj_y - target_y) < 10: if self.game_mode == GameMode.Town: self.player.position = [8, 104] elif self.game_mode == GameMode.Office: self.score += 10 return False else: return True
衝突判定(ここのゲームモードはOffice)戻り値のbooleanをself.activeに代入する
デュークくんをゲットすると一斉に消えるバグ
(デュークくんだけではないですが)ある1つのアイテムをゲットすると画面上にあるすべてのアイテムが消えてしまいました
画面に流れるアイテムが何なのかを分かっていないとこんなバグが生まれます
1つのアイテム = リストの1要素
アイテムは self.skill
に格納している この中身が複雑だった…(自分が作ったが)
self.skill:[Java, Python, Ruby] Enumクラスのリスト ┃ ┗ Java:Enumクラス ┃ ┗ self.state:デュークくんリスト リストの長さ=デュークくんオブジェクト数 ┃ ┗ self.stateの1要素:( x座標, y座標, 表示フラグ )
画面上の1つのデュークくんは上記のself.stateの1要素
バグの原因は「Enumクラス自体に表示フラグを付けていた」こと キャラがアイテムと衝突した時に表示フラグをFalseにすると、Enumクラス以下が非表示になるので self.state にいる「アイテムオブジェクトすべて」が消えてしまっていた
1デュークくんごとに表示フラグを設定
バグを解消するには self.state の要素ごとに表示フラグを設定する
class Skill(Enum): """ 画面に流れるオブジェクト """ Java = auto() Python = auto() Ruby = auto() def __init__(self, num): # [x, y, is_active] self.state = [(i * 60, randint(0, 104), True) for i in range(4)]
__init__()
で ( x座標, y座標, 表示フラグ )
を持つ長さ4のリストを設定する
これでゲットしたアイテムだけが消えるようになりました^^