見出し画像

【Pyxel】レトロRPG制作メモ(2023/7/4)

 前回の記事から4か月が経ってしまった…。
新しい案件が始まり、リリースも近づいてきてなかなかゲーム制作に時間を割けませんが、なんとか地道に作ってます^^;

1.前回記事からの進み具合

 主に剣による攻撃、敵の表示、効果音、HPなどのステータス表示を実装しました。

2.スプライトの状態管理

 攻撃、ノックバック、死亡のモーションを作ったので、各々の状態を管理する必要が出てきました。

 主人公や敵キャラなどのスプライトクラスには「移動」や「攻撃」、「死亡」などの状態を管理する変数「bcp(Battle Chara Phase)」を用意し、定数を定義するクラスには以下のように「bcp」「bcpMap」を定義しました。
(bcpの変数名は以前Javaで作ったRPGや格ゲーからそのまま持ってきてます)

■スプライトクラス

# バトルキャラフェーズ
bcp = CommonConst.BCP_NOTHING
■共通定数クラス

# バトルキャラフェーズ(BattleCharaPhase)
class bcp(Enum):
    MOVE = 0        # 移動
    ACT = 1         # 攻撃
    KNOCKBACK = 2   # ノックバック
    DOWN = 3        # ダウン
    DEATH = 4       # 死亡

# バトルキャラフェーズマップ(BattleCharaPhaseMap)
bcpMap = {
    bcp.MOVE: int(math.pow(2, 0)),
    bcp.ACT: int(math.pow(2, 1)),
    bcp.KNOCKBACK: int(math.pow(2, 2)),
    bcp.DOWN: int(math.pow(2, 3)),
    bcp.DEATH: int(math.pow(2, 4)),
}

 十字キーを押したときは「移動」状態となるため、以下のように「|=」(論理和の代入)とすることで現在の状態に「移動」の状態を付与します

■スプライトクラス

self.bcp |= CommonConst.bcpMap[CommonConst.bcp.MOVE]

 移動が終了した場合は以下のように「&=」(論理積の代入)と「~」(ビット反転)を組み合わせます。これにより現在の状態から「移動」を除きます

■スプライトクラス

self.bcp &= ~CommonConst.bcpMap[CommonConst.bcp.MOVE]

 以下のように「=」で直接代入すると、現在の状態が「移動」のみになります。こうすると「攻撃」などの状態を全てキャンセルする形になります。

self.bcp = CommonConst.bcpMap[CommonConst.bcp.MOVE]

 剣による攻撃には「斬り」と「突き」があり、斬りはニュートラルで攻撃ボタン、突きは十字キーを入力しながら攻撃ボタンで出します。

突き攻撃

 主人公の移動では、1歩につき8ドット移動したら停止します。たしか本家がそうなってたと思います。
 移動を開始した直後に攻撃ボタンを押すと「移動」と「攻撃」の状態になり、攻撃中は移動を中断するよう制御しています。今後 剣の必殺技(画面上を往復する必殺技)を実装する際は、「移動」と「攻撃」を同時に行う修正が必要になりそう。
 攻撃モーションが終わったら「攻撃」状態を解除し、「移動」状態であれば残りの移動を処理する流れです。これも本家の仕様に沿っています。

 また、現在の状態を判別するには以下のようにします。

def update(self, inputs, map):

    if (self.bcp & CommonConst.bcpMap[CommonConst.bcp.DEATH]) == CommonConst.bcpMap[CommonConst.bcp.DEATH]:
        return

    # 行動中の場合
    if (self.bcp & CommonConst.bcpMap[CommonConst.bcp.ACT]) == CommonConst.bcpMap[CommonConst.bcp.ACT]:
        pass
    # 移動中ではない場合
    if (self.bcp & CommonConst.bcpMap[CommonConst.bcp.MOVE]) != CommonConst.bcpMap[CommonConst.bcp.MOVE]:
        pass

3.終わりに

 次はマップ移動やメニュー表示をメインに進めたいと思います。

 ご覧いただき、ありがとうございました。

この記事が気に入ったらサポートをしてみませんか?