buto > /dev/null

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

pyxel アイテムゲットを実装

前回は画面を右から左に流れるアイテムを実装しました 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に代入する

デュークくんをゲットすると一斉に消えるバグ

f:id:butorisa:20201020174333g:plain

(デュークくんだけではないですが)ある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のリストを設定する

f:id:butorisa:20201020174440g:plain

これでゲットしたアイテムだけが消えるようになりました^^