CODE Python RPG

独学でPythonでRPGを作成する(第23回)呪文の表示の修正

更新日:

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

前回は戦闘のコマンドで
新たに特殊攻撃(呪文)を加えました。

今回は呪文の表示を修正して行きます。
1ページに表示する呪文の数を4つから8つに変更します。

 

目次

  1. 呪文の表示
  2. 「▶︎」の表示
  3. 「▶︎」の制御
  4. 最後に

呪文の表示

それでは呪文の表示を変えて行きます。
表示枠を少し狭くして、4行2列にします。

(変更前)

(変更後)

 

変更後、少し狭くして、右側を開けたのは
選択中の呪文の説明文を載せる為です。
そのうち・・・(^_^;)

そして、ソースです。
表示部分なので、draw_battle関数です。

(変更前)

def draw_battle(bg, fnt, obj, player):
(省略)
    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(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)

(変更後)

    elif idx == 21:
        # 呪文の表示
        x_i = 50 # x座標の開始位置
        x_w = bg.get_width()*0.7 - 50 # 幅(左端の50を引く)
(省略)

        for i, spell in enumerate(player.chara1_mas_spell):
            if i%2 == 0: # 1列目
                draw_text(bg, "{}".format(spell), x_i_t, y_i_t+y_h*int(i/2), fnt, col)
            else: # 2列目
                draw_text(bg, "{}".format(spell), x_i_t+int(x_w/2), y_i_t+y_h*int(i/2), fnt, col)
        if tmr%5 != 0:
            draw_text(bg, "▶︎", x_i_t-50+int(x_w/2)*sel_spell_x, y_i_t+y_h*sel_spell_y, fnt, col)

 

変更後の枠は以下のようになります。

 

呪文の並びは以下のようになります。
※呪文の覚える順番
 ホイミ、ベホイミ、ベホマラー、ベホマ、メラ、メラミ、メラゾーマ、ギラ

1列目はx座標の開始位置をx_i_t
2列目はx座標の開始位置をx_i_t+int(x_w/2)
にしています。(x_w/2は枠の横幅の半分)

if i%2 == 0: # 1列目
  draw_text(bg, "{}".format(spell), x_i_t, y_i_t+y_h*int(i/2), fnt, col)
else: # 2列目
  draw_text(bg, "{}".format(spell), x_i_t+int(x_w/2), y_i_t+y_h*int(i/2), fnt, col)

 
あと、「▶︎」を表示します。
tmrが5の倍数ではない時だけ表示することで点滅させます。

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

sel_spell_xとsel_spell_yをグローバル変数にして、
左右上下のキーを押下した時に変化させます。

 

 

「▶︎」の表示

左右上下のキーを押下した時の動きを作ります。
前回、作成だけはしていたspell_select関数を利用します。

def spell_select(key):
    global idx, sel_spell_x, sel_spell_y
    ent = False

    if key[K_UP] and sel_spell_y > 0: # ↑キー、0より大きければ上に移動
        sel_spell_y -= 1
    elif key[K_DOWN] and sel_spell_y < 3: # ↓キー、3より小さければ下に移動
        sel_spell_y += 1
    elif key[K_LEFT] and sel_spell_x > 0: # ←キー、0より大きければ左に移動
        sel_spell_x -= 1
    elif key[K_RIGHT] and sel_spell_x < 1: # →キー、1より小さければ右に移動
        sel_spell_x += 1
    elif key[K_SPACE] or key[K_RETURN]: # 決定
        ent = True
    elif key[K_b]: # キャンセル
        idx = 11
    return ent

 

以下を追加しています。
前回はpassにしていました。(^_^;)

if key[K_UP] and sel_spell_y > 0: # ↑キー、0より大きければ上に移動
  sel_spell_y -= 1
elif key[K_DOWN] and sel_spell_y < 3: # ↓キー、3より小さければ下に移動
  sel_spell_y += 1
elif key[K_LEFT] and sel_spell_x > 0: # ←キー、0より大きければ左に移動
  sel_spell_x -= 1
elif key[K_RIGHT] and sel_spell_x < 1: # →キー、1より小さければ右に移動
  sel_spell_x += 1

 

sel_spell_xとsel_spell_yを利用して「▶︎」を表示します。
draw_text(bg, "▶︎", x_i_t-50+int(x_w/2)*sel_spell_x, y_i_t+y_h*sel_spell_y, fnt, col)

 

 

「▶︎」の制御

先程、左右上下のキーを押下した時に
「▶︎」を移動するようにしましたが
呪文がない場所にも移動してしまいます。

 

なので、呪文が無い場所には
移動しないよう制御する為に
spell_select関数をもう少し変えます。

def spell_select(key, player):
    global idx, sel_spell_x, sel_spell_y
    ent = False
    tmp_sel_spell = sel_spell_x+sel_spell_y*2 # 今の「▶︎」の位置

    # 何ページ目かを取得する(左右の限界はそれ)
    if key[K_UP] and sel_spell_y > 0: # ↑キー
        sel_spell_y -= 1
    elif key[K_DOWN] and sel_spell_y < 3 and tmp_sel_spell+2 < len(player.chara1_mas_spell): # ↓キー  sel_spell_xとsel_spell_yの初期値は0(条件に=は入らない)
        sel_spell_y += 1
    elif key[K_LEFT] and sel_spell_x > 0: # ←キー
        sel_spell_x -= 1
    elif key[K_RIGHT] and sel_spell_x < 1 and tmp_sel_spell+1 < len(player.chara1_mas_spell): # →キー sel_spell_xとsel_spell_yの初期値は0(条件に=は入らない)
        sel_spell_x += 1
    elif key[K_b]: # キャンセル
        idx = 11
    return ent

 

今の「▶︎」の位置を取得して、これ以上は
下にも右にも移動しないようにします。
tmp_sel_spell = sel_spell_x+sel_spell_y*2

2列あるので、1つ下の位置は
tmp_sel_spellに2を足した位置になります。
その位置に覚えている呪文が存在すれば下に移動します。
len(player.chara1_mas_spell)
は覚えている呪文の数です。

elif key[K_DOWN] and sel_spell_y < 3 and tmp_sel_spell+2 < len(player.chara1_mas_spell):
  sel_spell_y += 1

 

右側の位置はtmp_sel_spellに1を足した位置です。
その位置に覚えている呪文が存在すれば右に移動します。

elif key[K_RIGHT] and sel_spell_x < 1 and tmp_sel_spell+1 < len(player.chara1_mas_spell):
  sel_spell_x += 1

 

これで呪文が無い位置に「▶︎」は
移動しないようになりました。

ので、今回は以上です!(`・ω・´)

 

 

最後に

今回は1ページに8つの呪文を表示するように
変更しました。

ただ、9つ以上の呪文は表示できないので、
次回は2ページ目、3ページ目に表示できるように
変更したいと思います。

まとめサイトへ

 

 

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

 

 

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

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