CODE Python RPG

初心者がPythonでRPGを作成する(第9回)新戦闘コマンドを選択する

更新日:

こんにちは。
「Pythonでつくる ゲーム開発 入門講座」のChapter11,12(本格RPGを作ろう!全編・後編)を基にRPGを作っていきます。

前回は戦闘コマンドの表示を変えました。
ただ、表示を変えただけで選択はできないので、今回は新しい戦闘コマンドから選択できるようにします。

目次

  1. 矢印表示
  2. 矢印の位置
  3. 矢印の点滅
  4. 「こうげき」と「にげる」
  5. 最後に

矢印表示

最初にどのコマンドを選択しているかを明示するする為に矢印を表示します。
元々のコマンドのように選択中の色を変えるのも良いですけど、ここでは矢印にします。
以下のような感じです。

変更前

 

変更後

 

○っぽく見えていますが、実際は「▶︎」です。
なんかおかしいですが、これはこれで行きます。

 

 

矢印の位置

それでは変更して行きます。
まずは矢印の位置を決める為に、変数を用意します。

btl_cmd = 0 # バトルコマンド(1:攻撃 2:ポーション 3:blaze 4:逃げる)
btl_cmd_x = 0 # 追加
btl_cmd_y = 0 # 追加

COMMAND = ["[A]ttack", "[P]otion", "[B]laze gem", "[R]un"] 
COM = [["こうげき", "どうぐ"], ["じゅもん", "そうび"], ["ぼうぎょ", "にげる"]] # 前回追加 3行2列

変更前のコマンドはbtl_cmdの1つですが、変更後は3行2列なので変数を2つ用意しました。
btl_cmd_xに列、btl_cmd_yに行の値を入れます。

COM = [["こうげき", "どうぐ"],
    ["じゅもん", "そうび"],
    ["ぼうぎょ", "にげる"]]

COM[btl_cmd_x][btl_cmd_y]
という使い方になります。

例えば
btl_cmd_x=0,btl_cmd_y=1の時はCOM[0][1]になり「じゅもん」
btl_cmd_x=1,btl_cmd_y=2の時はCOM[1][2]になり「にげる」
を選択することになります。

 

次はこのbtl_cmd_xとbtl_cmd_yの値を変える関数です。
矢印キーを押すと値が変わるようにします。

def battle_command(bg, fnt, key): # コマンドの入力と表示
    global btl_cmd
    global btl_cmd_x, btl_cmd_y # 追加
    ent = False # Trueで返すと選択したコマンド(btl_cmd)を実行する
    if key[K_a]: # Aキー
        btl_cmd = 0
        ent = True
    if key[K_p]: # Pキー
        btl_cmd = 1
        ent = True
    if key[K_b]: # Bキー
        btl_cmd = 2
        ent = True
    if key[K_r]: # Rキー
        btl_cmd = 3
        ent = True

###追加ここから###
    if key[K_UP] and btl_cmd_y > 0: # ↑キー
        btl_cmd_y -= 1
    if key[K_DOWN] and btl_cmd_y < 2: # ↓キー
        btl_cmd_y += 1
    if key[K_LEFT] and btl_cmd_x > 0: # ←キー
        btl_cmd_x -= 1
    if key[K_RIGHT] and btl_cmd_x < 1: # →キー
        btl_cmd_x += 1
###追加ここまで###

    if key[K_SPACE] or key[K_RETURN]:
        ent = True
    for i in range(4):
        c = WHITE
        if btl_cmd == i:
            c = BLINK[tmr%6]
        draw_text(bg, COMMAND[i], 20, 160+i*60, fnt, c)
    return ent

btl_cmd_xとbtl_cmd_yはグローバル変数なので
global btl_cmd_x, btl_cmd_y
を追加します。

「↑」「↓」キーを押すと矢印「▶︎」を上下に移動するので行の値であるbtl_cmd_yを変更して、
「→」「←」キーを押すと矢印「▶︎」を左右に移動するので列の値であるbtl_cmd_xを変更します。

また、2つの変数には範囲があり、それぞれ
0 <= btl_cmd_x <= 1
0 <= btl_cmd_y <= 2
です。
(再掲)

この為、btl_cmd_yは0より小さくできないので、以下のif文になっています。
※「↑」キーを押し、かつbtl_cmd_yが0より大きい時

if key[K_UP] and btl_cmd_y > 0: # ↑キー
  btl_cmd_y -= 1

「btl_cmd_y > 0」はbtl_cmd_yが1か2の状態なので、1を引くことができます。
0の時はそれ以上は小さく出来ないので、1を引くことが出来ません。
その他のif文も同様にして、変数の範囲を超えないようにしています。

これで矢印の位置をbtl_cmd_x、btl_cmd_yの2つの変数に格納することが出来ました。

 

 

矢印の点滅

矢印の位置を取得できるようになったので、それを表示します。
コマンドとほぼ同じ位置に表示するので、前回のコマンド表示とほぼ同じです。
※「▶︎」と指定していますが、最初にお伝えした通り、実際の画面では○っぽくなります。

def draw_battle(bg, fnt): # 戦闘画面の描画
(省略)
        for i in range(3):
            for j in range(2):
                draw_text(bg, COM[i][j], x_i+50+j*x_w/2, y_i+70+i*60, fnt, col)
        draw_text(bg, "▶︎", x_i+btl_cmd_x*x_w/2, y_i+70+btl_cmd_y*60, fnt, col) # 追加
(省略)

j → btl_cmd_x(列)
i → btl_cmd_y(行)
です。
あとはコマンドの少し左に「▶︎」を表示するので、50を消しました。
x_i+50+j*x_w/2 → x_i+btl_cmd_x*x_w/2(「▶︎」のx座標)

 

これで「▶︎」は表示されましたが、点滅させたいので一つif文を加えます。

        for i in range(3):
            for j in range(2):
                draw_text(bg, COM[i][j], x_i+50+j*x_w/2, y_i+70+i*60, fnt, col)
        if tmr%5 != 0:
            draw_text(bg, "▶︎", x_i+btl_cmd_x*x_w/2, y_i+70+btl_cmd_y*60, fnt, col)

tmrが5の倍数ではない時だけ表示させることで、点滅させます。

 

 

「こうげき」と「にげる」

新しいコマンドで選択できるようになったので選択した時の動作を追加します。
今回は「こうげき」と「にげる」です。(「じゅもん」や「どうぐ」などは徐々に・・です)

def main():
(省略)
        elif idx == 11: # プレイヤーのターン(入力待ち)
            player.re_defense() # ぼうぎょを元に戻す(ぼうぎょ効果を消す)(呪文効果が残っているか確認)
            draw_battle(screen, fontS)
            if tmr == 1:
                set_message(player.name + " のターン")
            if battle_command(screen, font, key) == True:
                # if btl_cmd == 0: # 元々のコマンドの選択は削除
                if COM[btl_cmd_y][btl_cmd_x] == "こうげき": # 追加
                    idx = 12
                    tmr = 0
(省略)
                # if btl_cmd == 3: # 逃げる
                if COM[btl_cmd_y][btl_cmd_x] == "にげる": # 追加
                    idx = 14
                    tmr = 0

if btl_cmd == 0:
if btl_cmd == 3:
は使わなくなりますので、削除します。

「こうげき」は
if btl_cmd_x == 0 and btl_cmd_y == 0:
でも同じことですが、
if COM[btl_cmd_y][btl_cmd_x] == "こうげき":
の方が、何をやっているか分かりやすいのでこっちにしました。

COM = [["こうげき", "どうぐ"],
    ["じゅもん", "そうび"],
    ["ぼうぎょ", "にげる"]]
なので、
if btl_cmd_x == 0 and btl_cmd_y == 0:
の時は「"こうげき"」
if btl_cmd_x == 1 and btl_cmd_y == 2:
の時は「"にげる"」
になります。

これで「こうげき」「にげる」を選択してSPACEかRETURNキーを押すと行動に移ります。
※SPACEかRETURNキーを押すとbattle_command(screen, font, key)の戻り値が「True」になる。

def battle_command(bg, fnt, key): # コマンドの入力と表示
(省略)
    if key[K_SPACE] or key[K_RETURN]:
        ent = True

 

あともう一つ、コマンドを選択した後は「▶︎」の位置を「こうげき」の戻します。
「にげる」などのコマンドを選択した後に「こうげき」の位置に戻します。

def main(): # メイン処理
    global speed, idx, tmr, floor, fl_max, welcome
    global pl_a, food, potion, blazegem
    global emy_life, emy_step, emy_blink, dmg_eff
    global btl_cmd_x, btl_cmd_y # 追加
(省略)
            if battle_command(screen, font, key) == True:
                # if btl_cmd == 0: # 攻撃
                if COM[btl_cmd_y][btl_cmd_x] == "こうげき":
                    idx = 12
                    tmr = 0
(省略)
                # if btl_cmd == 3: # 逃げる
                if COM[btl_cmd_y][btl_cmd_x] == "にげる": # 追加
                    idx = 14
                    tmr = 0

                # コマンドの位置のリセット
                btl_cmd_x = 0
                btl_cmd_y = 0

グローバル変数のbtl_cmd_x、btl_cmd_yの値を変えるので
global btl_cmd_x, btl_cmd_y
を追加します。

コマンドが選択された後(battle_command(screen, font, key)の戻り値が「True」になったら)
btl_cmd_x = 0
btl_cmd_y = 0
で、位置をリセットします(「こうげき」の位置に戻します)。

「にげる」を選択

「▶︎」が「こうげき」に戻る

 

という感じで、今回は以上です!(`・ω・´)

 

 

最後に

「こうげき」「にげる」について、新しい戦闘コマンドから選択して行動に移せるようにしました。
次回は「ぼうぎょ」を選択できるようにします。
また、「こうげき」のダメージの計算方法を変えてみようと思います。
現在はダメージに影響あるのは攻撃力のみですが、受ける側の防御力も考慮した計算に変えます。

まとめサイトへ

 

 

【ご注意】
プログラムやデータなどは著作権法により保護されています。
著作者の許諾を得ずに、プログラムおよびデータそのものまたは改変したものを
配布したり販売したりすることはできません。
また、これらを利用して発生した損害などに関して、著作者は一切責任を負いません。

 

 

-CODE, Python, RPG
-, , , , ,

Copyright© kerublog , 2023 All Rights Reserved Powered by STINGER.