【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.終わりに
次はマップ移動やメニュー表示をメインに進めたいと思います。
ご覧いただき、ありがとうございました。
この記事が気に入ったらサポートをしてみませんか?