こんにちは。
「Pythonでつくる ゲーム開発 入門講座」のChapter11,12(本格RPGを作ろう!全編・後編)を基にRPGを作っていきます。
前回は戦闘メッセージやプレイヤーのパラメータの表示位置を変えました。
今回はパラメータの表示方法をもう少しと、戦闘コマンドを変えてみます。
目次
全角・半角の変換
最初に、数字とかは半角で表示されますが、全角で表示させたいので、全角・半角を変換するモジュール「mojimoji」を使います。
こちらを参考にさせて頂きました。
インストール方法、使い方とかオプションとか紹介されています。
import mojimoji # 半角⇄全角変換
パラメータの表示
それではパラメータの表示を変えます。
前回のパラメータの表示は名前の文字数やhpなどの桁数が変わると表示が崩れてしまうので、ここを修正します。
以下のような感じにします。
変更前

変更後

最初にテキストの開始位置を少し左にします。
# (変更前)
x_i_t = x_i+x_w/2-25 # テキストのx座標の開始位置
# (変更後)
x_i_t = x_i+x_w/2-50 # テキストのx座標の開始位置
hpの桁数によって「H」とhpの間に空白を入れて行きます。
桁数はlen関数を使って取得しますが、int型には使えないので、str型に型変換(型キャスト)してlen関数を使います。
3桁を最大にしているので、hpの最大は「999」想定です。
※mojimoji.han_to_zenは半角を全角に変えます。
def draw_battle(bg, fnt): # 戦闘画面の描画
(省略)
draw_text(bg, "{}".format(player.name), x_i_t, y_i+6, fnt, col)
if len(str(player.hp)) == 3: # 3桁の時
draw_text(bg, mojimoji.han_to_zen("H{}".format(player.hp)), x_i_t, y_i+36, fnt, col)
elif len(str(player.hp)) == 2: # 2桁の時
draw_text(bg, mojimoji.han_to_zen("H {}".format(player.hp)), x_i_t, y_i+36, fnt, col)
elif len(str(player.hp)) == 1: # 1桁の時
draw_text(bg, mojimoji.han_to_zen("H {}".format(player.hp)), x_i_t, y_i+36, fnt, col)
同じようにmpとlvも変えます。
lvの最大値は「99」です。
if len(str(player.mp)) == 3:
draw_text(bg, mojimoji.han_to_zen("M{}".format(player.mp)), x_i_t, y_i+66, fnt, col)
elif len(str(player.mp)) == 2:
draw_text(bg, mojimoji.han_to_zen("M {}".format(player.mp)), x_i_t, y_i+66, fnt, col)
elif len(str(player.mp)) == 1:
draw_text(bg, mojimoji.han_to_zen("M {}".format(player.mp)), x_i_t, y_i+66, fnt, col)
if len(str(player.lv)) == 2:
draw_text(bg, mojimoji.han_to_zen("L:{}".format(player.lv)), x_i_t, y_i+96, fnt, col)
elif len(str(player.lv)) == 1:
draw_text(bg, mojimoji.han_to_zen("L: {}".format(player.lv)), x_i_t, y_i+96, fnt, col)
1桁

2桁

3桁

パラメータについては、こんな感じです。
名前は左側に揃えます。
戦闘コマンド
続いて、戦闘コマンドを変えます。
今回変えるのは表示のみで機能はそのままなので、変更前のコマンドも残します。
※まだ変更前のコマンドから選択する為。
変更前

変更後

最初にコマンドをリストに入れます。
3行2列の多次元にします。
COM = [["こうげき", "どうぐ"], ["じゅもん", "そうび"], ["ぼうぎょ", "にげる"]]
COMMAND = ["[A]ttack", "[P]otion", "[B]laze gem", "[R]un"]
コマンドの表示で、枠を作ります。
プレイヤーのターンの時に表示するので、idxが11の時です。
def draw_battle(bg, fnt): # 戦闘画面の描画
(省略)
if idx == 11:
# コマンド表示
x_i = 50 # x座標の開始位置
x_w = bg.get_width()*0.4 # 幅
y_i = bg.get_height()*0.6 + 40 # y座標の開始位置
y_h = bg.get_height()*0.4 - 40 # 高さ
if len(player.name) <= 2:
x_i_t = x_i+x_w/2-25 # テキストのx座標の開始位置
else:
x_i_t = x_i+x_w/2-50 # テキストのx座標の開始位置
pygame.draw.rect(bg, col, [x_i, y_i, x_w, y_h], 2, 5)
pygame.draw.line(bg, col, [x_i, y_i+33], [x_i+x_w-1, y_i+33], 2) # -1がないと少し出る
draw_text(bg, "{}".format(player.name), x_i_t, y_i+6, fnt, col)
幅は画面の4割、高さは画面の約4割です。
x_w = bg.get_width()*0.4 # 幅
y_h = bg.get_height()*0.4 - 40 # 高さ
draw.rectは前回も出ましたが、
pygame.draw.rect(bg, 色, [x座標, y座標, 横幅, 高さ], 線の太さ, 四隅の丸み)
ですね。枠なので線の太さなどを指定します。
詳しくはこちら。
draw.lineは
pygame.draw.rect(bg, 色, 始点[x座標, y座標], 終点[x座標, y座標], 線の太さ)
です。詳しくはこちら。
どちらも今後も出てきそうです。
あと、コマンドに表示する名前は真ん中に表示するので、文字数によって少し位置を変えています。
2文字以下の時(if len(player.name) <= 2:)とそうでない時(else:)です。
そしてコマンドの表示です。
draw_text(bg, "{}".format(player.name), x_i_t, y_i+6, fnt, col)
# COM = [["こうげき", "どうぐ"],
# ["じゅもん", "そうび"],
# ["ぼうぎょ", "にげる"]]
for i in range(3): # 3行
for j in range(2): # 2列
draw_text(bg, COM[i][j], x_i+50+j*x_w/2, y_i+70+i*60, fnt, col)
idxが11ではない時は戦闘メッセージを表示します。
elseに入れただけで、elseの中は前回と同じです。
else: # idx==11 ではない時
# 戦闘メッセージ表示
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.4 - 40 # 高さ
pygame.draw.rect(bg, col, [x_i, y_i, x_w, y_h], 2, 5)
for i in range(5): # 戦闘メッセージの表示
# draw_text(bg, message[i], 600, 100+i*50, fnt, WHITE)
draw_text(bg, message[i], x_i+10, y_i+10+i*40, fnt, col)
コマンド選択時(再掲)

コマンド選択後は戦闘メッセージ

今回は見た目だけ変更です。
敗北条件
あと1つ変えます。
敗北条件が今は以下のようになっています。
player.hp = player.hp - dmg
if player.hp < 0:
player.hp = 0
idx = 15 # 敗北
tmr = 0
if player.hp < 0:
ですと、0の時も大丈夫になります。
※0になってもまだ負けていない。

0は負けたことにする為、<=0に変更します。
player.hp = player.hp - dmg
if player.hp <= 0: # 「<」から「<=」に変更
player.hp = 0
idx = 15 # 敗北
tmr = 0
もう1箇所
if food > 0:
food = food - 1
if player.hp < player.maxhp:
player.hp = player.hp + 1
else:
player.hp = player.hp - 5
if player.hp <= 0: # 「<」から「<=」に変更
player.hp = 0
pygame.mixer.music.stop()
idx = 9
tmr = 0
今回は以上です!(`・ω・´)
最後に
表示だけですが、コマンドを変更しました。
次回は今回追加したコマンドから選択するように変更しようと思っています。
【ご注意】
プログラムやデータなどは著作権法により保護されています。
著作者の許諾を得ずに、プログラムおよびデータそのものまたは改変したものを
配布したり販売したりすることはできません。
また、これらを利用して発生した損害などに関して、著作者は一切責任を負いません。