CODE Python RPG

独学でPythonでRPGを作成する(第26回)回復呪文を使う

更新日:

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

前回は呪文の説明と消費MPを表示するようにしました。
今回は一つのみですが、回復呪文を使えるように変更します。

目次

  1. 回復呪文
  2. 効果の設定
  3. 呪文発動
  4. 呪文の対象の選択
  5. 動画
  6. 最後に

回復呪文

呪文の効果はこちらのサイトを
参考にさせて頂きます。

ひとまず、今回使えるようにするのは
1つの呪文のみにします。

とにかく使えるようにすることが目的で、
細かいことは次回以降に修正していきます(^_^;)

回復呪文の名前はホイミで
回復量を30-40
消費MPを3
に設定します。

 

 

効果の設定

chara.pyのCharaクラスに
新たに関数hoimiを作ります。

この関数は回復量を返します。
(-1の時はMPが足りない)

class Chara():
(省略)
    def hoimi(self):
        if self.mp < 3:
            return -1 # mpが足りない
        else:
            self.mp -= 3 # 消費mp
            return random.randint(30, 40) # 30-40回復

消費MPが3なので
現在のMPが3未満の時は
-1を返します。
(ホイミを使えない)

if self.mp < 3:
  return -1 # mpが足りない

 

MPが足りていれば、
現在のMPから消費MP3を引いて
30-40の値(回復量)を返します。

回復する量は30-40の間で
ランダムの値にするので
randintを利用します。
randintの詳細はこちら

else:
  self.mp -= 3 # 消費
  mp return random.randint(30, 40) # 30-40回復

 

なお、関数hoimiはCharaクラスに作成したので
Charaクラスを継承しているMonsterクラスも
関数hoimiを使えます。

この為、モンスターもホイミを使えます。
実際にモンスターが使うのは
いつになるか分かりませんけど。。(^_^;)

関数hoimiは以上です。

 

 

呪文発動

先程、作成した関数hoimiを利用して
ホイミを使えるようにします。

battle.pyを変更します。

変更前

def main(screen, clock, font, fontS, player):
(省略)
        elif idx == 26: # 呪文発動
            idx = 24 # ターン確認

変更後

def main(screen, clock, font, fontS, player):
(省略)
    dmg = 0 # プレイヤーが与えるダメージ、受けるダメージ
    re_dmg = 0 # プレイヤーが回復するダメージ、モンスターが回復するダメージ
(省略)
        elif idx == 26: # 呪文発動
            draw_battle(screen, fontS, turn_obj, player)
            if turn_obj.mas_spell[sel_spell_i] == "ホイミ":
                if tmr == 1:
                    set_message(turn_obj.name + " は ホイミを となえた!")
                    re_dmg = turn_obj.hoimi()
                if 2 <= tmr and tmr <= 4:
                    pygame.draw.rect(screen, BLINK[tmr%6], [0, 0, screen.get_width(), screen.get_height()])
                if tmr == 5:
                    if re_dmg != -1:
                        player.hp += re_dmg
                        if player.hp > player.maxhp: # 最大HP以上になる場合
                            player.hp = player.maxhp # 現在のHPを最大HPと同じ値にする
                        set_message(player.name + " の キズが かいふくした!")
                    else:
                        set_message("しかし MPがたりない!")

                if tmr == 8:
                    init_message()
                    idx = 24 # ターンの確認
                    tmr = 0

 

呪文の発動はidxが26の時ですが
変更前は何もせずにターンが終わっていました。

elif idx == 26: # 呪文発動
  idx = 24 # ターン確認

 

このidx26にホイミの動作を追加しました。

まず、回復量を格納する変数re_dmgを用意しておきます。

使った呪文がホイミの時
関数hoimiを使って回復量を取得します。

ホイミ以外の呪文が選択された場合は
変更前と同じく何もせずにターンが終わります。

if turn_obj.mas_spell[sel_spell_i] == "ホイミ":
  if tmr == 1: set_message(turn_obj.name + " は ホイミを となえた!")
  re_dmg = turn_obj.hoimi()

 

ホイミを使うと画面全体を点滅させます。

if 2 <= tmr and tmr <= 4:
  pygame.draw.rect(screen, BLINK[tmr%6], [0, 0, screen.get_width(), screen.get_height()])

 

そして、HPを回復します。
ただし、最大HP以上は回復しないようにします。

if tmr == 5:
  if re_dmg != -1:
    player.hp += re_dmg
    if player.hp > player.maxhp: # 最大HP以上になる場合
      player.hp = player.maxhp # 現在のHPを最大HPと同じ値にする
    set_message(player.name + " の キズが かいふくした!")

 

関数hoimiの戻り値が-1の場合は
MPが足りないので、その旨のメッセージを表示して
HPは回復させずに終わります。

else:
  set_message("しかし MPがたりない!")

 

 

あとは呪文を決定できるようにします。

変更前

def spell_target_select(key, player):
(省略)
    if player.spell_target[sel_spell_i] == 0: # 呪文の対象が味方
        pass

変更後

def spell_target_select(bg, key, player): # 呪文の対象を選択
(省略)
    if player.spell_target[sel_spell_i] == 0: # 呪文の対象が味方
        if key[K_SPACE] or key[K_RETURN]: # 決定
            ent = True

 

ホイミの動作は以上です。

 

 

呪文の対象の選択

呪文の対象を選択する時に
名前を点滅するように変更します。

少し分かりにくいですが、名前が点滅します(^_^;)

 

変更前

def draw_battle(bg, fnt, obj, player):
(省略)
    draw_text(bg, "{}".format(player.name), x_i_t, y_i+6, fnt, col)

変更後

def draw_battle(bg, fnt, obj, player):
(省略)
    # 名前の表示(回復呪文の対象を選択中の時は点滅)
    if idx == 25 and player.spell_target[sel_spell_i] == 0: # 呪文の対象の選択中,呪文の対象が味方なら
        draw_text(bg, "{}".format(player.name), x_i_t, y_i+6, fnt, BLINK[tmr%6])
    else: # 呪文の対象の選択中でなければ
        draw_text(bg, "{}".format(player.name), x_i_t, y_i+6, fnt, col)

回復呪文など呪文の対象が味方の場合は
名前を点滅するようにします。

if idx == 25 and player.spell_target[sel_spell_i] == 0:
  draw_text(bg, "{}".format(player.name), x_i_t, y_i+6, fnt, BLINK[tmr%6])

変数spell_targetは前回に追加しました。
呪文の対象が味方かモンスターかを入れます。
※0:味方,1:モンスター

今は味方がいないので、対象は自分自身しかありませんが
そのうち味方を追加しようと思います(^_^)

 

また、今回追加するのは回復呪文のみですが
対象がモンスターとなる攻撃呪文の場合には
モンスターを点滅するようにします。

変更前

def draw_battle(bg, fnt, obj, player):
(省略)
        if display_flg:
            if monster[i] is obj: # 行動中のモンスターなら
                bg.blit(mon.img, [monster[i].x, monster[i].y+emy_step])
            else:
                bg.blit(mon.img, [monster[i].x, monster[i].y])

変更後

spell_target_i = 0 # 呪文の対象(添字)
(省略)

def draw_battle(bg, fnt, obj, player):
(省略)
        if display_flg:
            if monster[i] is obj: # 行動中のモンスターなら
                bg.blit(mon.img, [monster[i].x, monster[i].y+emy_step])
            else:
                # 呪文対象がモンスターの時、呪文対象を表示させない(点滅)
                if idx == 25 and i == spell_target_i and player.spell_target[sel_spell_i] == 1 and tmr%5 == 0:
                    pass # tmrが5の倍数のときは表示させない
                else:
                    bg.blit(mon.img, [monster[i].x, monster[i].y])

モンスターの場合は
呪文の対象を選択中(=spell_target_i)に
画像を点滅させます。
※グローバル変数spell_target_iは
 呪文の対象の添字を格納します。

if idx == 25 and i == spell_target_i and player.spell_target[sel_spell_i] == 1 and tmr%5 == 0:
  pass # tmrが5の倍数のときは表示させない

 

モンスターの場合、画像を選択するので
対象のモンスターを選択する場合は
左右のキーを押下します。

def spell_target_select(bg, key, player): # 呪文の対象を選択
    global idx, spell_target_i
    ent = False
    if player.spell_target[sel_spell_i] == 0: # 呪文の対象が味方
        if key[K_SPACE] or key[K_RETURN]: # 決定
            ent = True
    else: # 呪文の対象がモンスター
        if key[K_LEFT] and spell_target_i > 0: # ←キー
            spell_target_i -= 1
        elif key[K_RIGHT] and spell_target_i < len(monster)-1: # →キー
            spell_target_i += 1
        elif key[K_SPACE] or key[K_RETURN]: # 決定
            ent = True
    if key[K_b]: # キャンセル
        idx = 21 # 呪文の選択に戻る
    return ent

 

呪文の選択中の点滅は以上です。

表示について少し、
idxが25の時(呪文の対象を選択中)も
呪文の一覧を表示するようにします。

def draw_battle(bg, fnt, obj, player):
(省略)
    elif idx == 21 or idx == 25: # idx == 25を追加
        # 呪文の一覧の表示

idxが21は呪文の選択中です。
使う呪文を選択したら、25に移って
呪文の対象を選択します。

 

あと、idxが21の時(呪文の選択中)に
選択した呪文(sel_spell_i)と
呪文の対象(spell_target_i)を
リセットしておきます。

def main(screen, clock, font, fontS, player):
(省略)
    global sel_spell_i, spell_target_i
(省略)
        elif idx == 21: # コマンドで呪文を選択
            sel_spell_i = 0 # 追加
            spell_target_i = 0 # 追加
            draw_battle(screen, fontS, turn_obj, player)
            if spell_select(screen, key, player) == True:
                idx = 25
                tmr = 0

 

今後、攻撃呪文を追加するときは
この辺りも使っていきたいと思います。

 

 

動画

ご参考までにホイミを使って回復している様子と
ホイミを使うもMPが足りない様子を動画にしました。
動画はこちらに載せました。

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

 

 

最後に

今回はホイミの一つのみですが、
回復呪文を使えるように変更しました。

ただ、使えるようにしたのみで
修正の余地はたくさんありそうです。

前回、追加した消費MPを格納する
変数usempを使っていないですし、
elif idx == 26に全ての呪文のパターンを
記載するのもどうかと思いますし。。(^_^;)

次回も引き続き呪文を変更していこうと思います。

まとめサイトへ

 

 

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

 

 

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

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