こんにちは。
「Pythonでつくる ゲーム開発 入門講座」の
Chapter11,12(本格RPGを作ろう!全編・後編)を基にRPGを作っていきます。
前回はプログラム(ソースコード)が長くなってきたので
分割(モジュール化)しました。
今回から戦闘のコマンドで
新たに特殊攻撃を加えていきます。
目次
特殊攻撃
特殊攻撃は色々ありますが、こちらのページにある
呪文を利用させて頂きます。
日本一といっても良いくらい有名な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つ以上になると画面から出てしまうので
表示されません。。(;^ω^)
まだまだ改善の余地がありますが、、
今回は以上です。!(`・ω・´)
最後に
今回は特殊攻撃である呪文を表示させるようにしました。
次回以降も呪文の表示・動作を変えていこうと思います。
【ご注意】
プログラムやデータなどは著作権法により保護されています。
著作者の許諾を得ずに、プログラムおよびデータそのものまたは改変したものを
配布したり販売したりすることはできません。
また、これらを利用して発生した損害などに関して、著作者は一切責任を負いません。