CODE Python RPG

独学でPythonでRPGを作成する(第22回)特殊攻撃を追加する

更新日:

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

前回はプログラム(ソースコード)が長くなってきたので
分割(モジュール化)しました。

今回から戦闘のコマンドで
新たに特殊攻撃を加えていきます。

 

目次

  1. 特殊攻撃
  2. パラメータの変更
  3. 呪文を覚える
  4. コマンド「じゅもん」を選択
  5. 最後に

特殊攻撃

特殊攻撃は色々ありますが、こちらのページにある
呪文を利用させて頂きます。

日本一といっても良いくらい有名なRPGですね。
東京オリンピックの入場行進で
テーマ曲が流れた時は鳥肌が立ちました(^^♪

 

さて、この呪文ですが、今までも
戦闘コマンドに表示だけはさせていました。

表示のみで選択はできなかったので、
これを選択できるように変更して行きます。

今回は「じゅもん」を選択したら
覚えた呪文を表示させます。

 

 

パラメータの変更

最初にスプレッドシートに呪文を加えて
それをchara.pyで読み込ませます。

スプレッドシートのM列に各レベルで
覚える呪文を加えます。
※ひとまず、覚える呪文は適当です。。(;^ω^)

該当のレベルに達したら
その呪文を覚え、使えるようにします。

chara.py

(省略)
chara1_quick = ws_chara.col_values(9) # I列
chara1_atk = ws_chara.col_values(10) # J列
chara1_dfs = ws_chara.col_values(11) # K列
chara1_exp = ws_chara.col_values(12) # L列
chara1_spell = ws_chara.col_values(13) # M列 ←覚える呪文

(省略)

class Brave(Chara):
    def __init__(self):
(省略)
        self.exp = 0

        self.chara1_mas_spell = [] # 覚えた呪文
        if chara1_spell[self.lv] != "": # レベル1で覚える呪文があるなら
            self.chara1_mas_spell.append(chara1_spell[self.lv])
(省略)

    def master_spell(self):
        if chara1_spell[self.lv] != "": # レベルアップして覚える呪文があるなら
            self.chara1_mas_spell.append(chara1_spell[self.lv])
            return chara1_spell[self.lv]
        return ""

変数chara1_spellに各レベルで
覚える呪文(M列)を全て入れます。

レベルが上がって呪文を覚えたら
変数chara1_mas_spellに入れていきます。

1レベルの時から覚える呪文があれば
それを入れます。
if chara1_spell[self.lv] != "":
  self.chara1_mas_spell.append(chara1_spell[1])

今回の場合、スプレッドシートの1レベルにある「ホイミ」が
chara1_mas_spellに入ります。

 

また、レベルアップした時に覚える呪文があれば
chara1_mas_spellに入れますが、
その為のメソッドがmaster_spellです。

戻り値として、覚える呪文があればそれを返して
無ければ空で返します。
※理由はこの後です。

 

chara.pyは以上です。

 

 

呪文を覚える

呪文は戦闘で使いますので、
変更するのはbattle.pyです。
※移動中にも使えるようにしますが、
 だいぶ先です。。(;^ω^)

まず、レベルアップした時に
覚える呪文があれば覚えるようにします。

def main(screen, clock, font, fontS, player):
(省略)

        elif idx == 17: # レベルアップ
(省略)
            if tmr == 38:
                tmp_spell = player.master_spell()
                if tmp_spell != "":
                    set_message(tmp_spell + " を覚えた")
            if tmr == 40:
                if player.exp >= player.lv_exp:
                    idx = 17
                    tmr = 0
            if tmr == 45:
                idx = 22 # 戦闘終了

先ほど作成したメソッドmaster_spellを使って、
覚える呪文があれば覚えます。

覚えた呪文があれば、その呪文が返ってくるので
変数tmp_spellに入れます。

その呪文を戦闘メッセージに表示させます。
set_message(tmp_spell + " を覚えた")

これで呪文を覚えました。

 

 

コマンド「じゅもん」を選択

コマンド「じゅもん」を選択した時の
動作を加えます。

def draw_battle(bg, fnt, obj, player): # 戦闘画面の描画 obj:戦闘で行動中のオブジェクト
(省略)
    if idx == 11 or idx == 19: # コマンド選択 or モンスター選択

(省略)
    elif idx == 21: # 「じゅもん」選択
        # 呪文の表示
        x_i = 50 # x座標の開始位置
        x_w = bg.get_width() - 100 # 幅(両端の50を引いたのが幅)
        y_i = bg.get_height()*0.6 + 40 # 6割+40のところからメッセージ枠を出す
        y_h = bg.get_height()*0.1 - 10 # 高さ(一個分の高さ)
        x_i_t = x_i + 50 # テキストのx座標の開始位置
        y_i_t = y_i + 21 # テキストのy座標の開始位置 20+21+21=62の21
        pygame.draw.rect(bg, col, [x_i, y_i, x_w, y_h*4], 2, 5)
        for i, spell in enumerate(player.chara1_mas_spell):
            draw_text(bg, "{}".format(spell), x_i_t, y_i_t+y_h*i, fnt, col) # font:20(20+21+21=62)
        if tmr%5 != 0:
            draw_text(bg, "▶︎", x_i_t-50, y_i_t+y_h*0, fnt, col)

(省略)

def spell_select(key):
    global idx
    ent = False
    if key[K_UP]: # ↑キー
        pass
    elif key[K_DOWN]: # ↓キー
        pass
    elif key[K_LEFT]: # ←キー
        pass
    elif key[K_RIGHT]: # →キー
        pass
    elif key[K_SPACE] or key[K_RETURN]: # 決定
        ent = True
    elif key[K_b]: # キャンセル
        idx = 11
    return ent

def main(screen, clock, font, fontS, player):
(省略)

                if COMMAND[btl_cmd_y][btl_cmd_x] == "じゅもん":
                    idx = 21 # 呪文の選択
                    tmr = 0
(省略)

        elif idx == 21: # コマンドで「じゅもん」を選択
            draw_battle(screen, fontS, turn_obj, player)
            if spell_select(key) == True:
                player.act = 25 # get_battle_turnの戻り値idxを25
                idx = 23
                tmr = 0

「じゅもん」を選択した場合、idx21に移動します。
if COMMAND[btl_cmd_y][btl_cmd_x] == "じゅもん":
  idx = 21 # 呪文の選択
  tmr = 0

関数spell_selectは覚えた呪文を選択する時に
「▶︎」を左右上下に移動させます。
※実際の動作は次回にするので今回はpassにしています(;^ω^)

関数spell_selectでSPACEかRETURNを押下すると
idx23に移動してターンをセットします。

 

idx21の時にdraw_battle関数で
覚えた呪文を表示させています。

枠や文字の開始位置は以下の通りです。

 

覚えた呪文chara1_mas_spellを
enumerateを使って表示させています。
※enumerateについてはこちら

for i, spell in enumerate(player.chara1_mas_spell):
  draw_text(bg, "{}".format(spell), x_i_t, y_i_t+y_h*i, fnt, col)

その後に「▶︎」を点滅させる為に
tmrが5の倍数の時は表示させず
それ以外の時に表示させるようにしています。

if tmr%5 != 0:
  draw_text(bg, "▶︎", x_i_t-50, y_i_t+y_h*0, fnt, col)

 

これで覚えた呪文が表示されるようになりました。
複数の呪文がある時は以下のようになります。

5つ以上になると画面から出てしまうので
表示されません。。(;^ω^)

まだまだ改善の余地がありますが、、
今回は以上です。!(`・ω・´)

 

 

最後に

今回は特殊攻撃である呪文を表示させるようにしました。

次回以降も呪文の表示・動作を変えていこうと思います。

まとめサイトへ

 

 

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

 

 

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

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