CODE Python RPG

独学でPythonでRPGを作成する(第58回)移動中のコマンド選択

投稿日:

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

前回は戦闘に関するバグ修正を行いました。

しばらく戦闘に関する修正が続いたので
移動中に関することを変更しようと思います。

今回は移動中のコマンドの「じゅもん」を選択した時に
キャラの名前が表示されるようにします。

目次

  1. じゅもんの選択
  2. 最後に

じゅもんの選択

移動中のコマンドで
「じゅもん」を選択したら
キャラの名前を表示するようにします。
※呪文を使うキャラを
 選択する画面です。

以下のような感じです。

 

 

グローバル変数の追加

コマンドの「じゅもん」の
位置でaキーを押下した時に
キャラの名前が
表示されるようにします。

最初にグローバル変数を追加します。

cmd_x = 0 # コマンド選択の時の"▶︎"のx位置
cmd_y = 0 # コマンド選択の時の"▶︎"のy位置
spell_flag = False # フィールドで呪文画面を表示するか
sel_p_y = 0 # コマンドのじゅもん選択時の"▶︎"のy位置(横には動かない)
spell_flag = False # フィールドで呪文画面を表示するか
sel_p_y = 0 # コマンドのじゅもん選択時の"▶︎"のy位置(横には動かない)

の2つを追加しました。

spell_flagがTrueの時
「じゅもん」が選択されたと
判断します。

sel_p_yの値が
「▶」の位置とします。

同時にリストplayerの
インデックスにします。

 

 

「▶」の位置

上下キーが押下された時に
sel_p_yの値を変更します。

def move_player(key, player, people): # 主人公の移動
(省略)

    global cmd_flag, cmd_x, cmd_y, spell_flag, sel_p_y # ←spell_flag, sel_p_yを追加
(省略)

    if not talk_flag: # 会話中でない時は動ける、会話できる
        if key[K_UP] == 1:
            if cmd_flag: # コマンド選択中
                if spell_flag: # じゅもん選択時
                    if sel_p_y > 0:
                        sel_p_y -= 1
                else: # どれでもない時はコマンドを選択
                    if cmd_y > 0:
                        cmd_y -= 1
            else:
(省略)

        elif key[K_DOWN] == 1:
            if cmd_flag: # コマンド選択中
                if spell_flag: # じゅもん選択時
                    if sel_p_y < len(player)-1:
                        sel_p_y += 1
                else: # どれでもない時はコマンドを選択
                    if cmd_y < 2:
                        cmd_y += 1
            else:
(省略)
global cmd_flag, cmd_x, cmd_y, spell_flag, sel_p_y # ←spell_flag, sel_p_yを追加

グローバル変数の為、
spell_flag, sel_p_yを追加しています。

if cmd_flag: # コマンド選択中

cmd_flagがTrueの時は
コマンドが表示されます。

※省略していますが、
 else(cmd_flagがFalse)の時は
 移動可能か確認して
 移動可能なら移動します。

if spell_flag: # じゅもん選択時
    if sel_p_y > 0:
        sel_p_y -= 1

今回追加したspell_flagですが
これがTrueの時は
「じゅもん」が選択されているので
sel_p_yの値を変更します。

上(↑)キーが押下された時は
-1にします。(最小値は0)

if spell_flag: # じゅもん選択時
    if sel_p_y < len(player)-1:
        sel_p_y += 1

下(↓)キーが押下された時は
+1にします。
※最大値はplayerの数-1です。
 sel_p_yはplayerのインデックスでもあり
 0始まりになるので、
 最大値はlen(player)-1になります。

なお、spell_flagがFalseの時は
コマンド選択中の状態です。

今はspell_flagのみですが、
今後「つよさ」や「どうぐ」の
機能を追加する時は
ここに条件を追加していきます。

 

次に左右キーが押下された時について
「じゅもん」選択時は
左右に「▶」が動くことはないので
動作は不要になります。

        elif key[K_LEFT] == 1:
            if cmd_flag: # コマンド選択中
                if spell_flag: # じゅもん選択時 
                    pass # 横には動かない
                else: # どれでもない時はコマンドを選択
                    if cmd_x > 0 :
                        cmd_x -= 1
            else:
(省略)

        elif key[K_RIGHT] == 1:
            if cmd_flag: # コマンド選択中
                if spell_flag: # じゅもん選択時 
                    pass # 横には動かない
                else: # どれでもない時はコマンドを選択
                    if cmd_x < 1:
                        cmd_x += 1
            else:
(省略)
if spell_flag: # じゅもん選択時
    pass # 横には動かない

無くても良いと思いますが
一応、明記しました。

 

 

決定と取消

「じゅもん」の位置で
aキーが押下されたら
決定(「じゅもん」選択)とします。

        elif key[K_a] == 1:
            if cmd_flag: # コマンド選択中
                if cmd_x == 1 and cmd_y == 0: # じゅもんの位置
                    spell_flag = True
            talk_flag, talk_mes = talk_judge(player, people)
            if not talk_flag:
                cmd_flag = True
if cmd_flag: # コマンド選択中
    if cmd_x == 1 and cmd_y == 0: # じゅもんの位置
        spell_flag = True

を追加しています。

cmd_x == 1、cmd_y == 0が
「じゅもん」の位置になるので
この時にaキーが押下されたら
spell_flagをTrueにします。
※「じゅもん」選択です。

COMMAND = (("はなす", "じゅもん"), ("つよさ", "どうぐ"), ("そうび", "しらべる"))
COMMAND[0][1] = "じゅもん"

 

bキーが押下された時は
取り消します。

変更前

        elif key[K_b] == 1:
            if cmd_flag:
                cmd_flag = False

変更後

        elif key[K_b] == 1:
            if cmd_flag:
                if spell_flag:
                    spell_flag = False
                    sel_p_y = 0
                else:
                    cmd_flag = False
                    cmd_x = 0
                    cmd_y = 0
if spell_flag:
    spell_flag = False
    sel_p_y = 0

「じゅもん」選択時に
bキーが押下されたら
spell_flagをFalseにします。

また、「▶」の位置も
一番上(sel_p_y = 0)に
戻します。

 

 

表示

「じゅもん」の位置で
aキーが押下されたら
キャラの名前を表示します。

def draw_para(bg, fnt, player): # 主人公の能力を表示
(省略)

    x_c_i = bg.get_width()*0.05 # x座標の開始位置
    x_c_w = bg.get_width()*0.4 # 横幅
    y_c_i = bg.get_height()*0.05 # y座標の開始位置
    y_c_h = bg.get_height()*0.25 # 高さ
    x_c_i_t = x_c_i + 50 # テキストのx座標の開始位置
    y_c_i_t = y_c_i + 30 # テキストのy座標の開始位置
    pygame.draw.rect(bg, BLACK, [x_c_i, y_c_i, x_c_w, y_c_h], 0, 5) # コマンド枠
    pygame.draw.rect(bg, col, [x_c_i, y_c_i, x_c_w, y_c_h], 2, 5) # コマンド枠

    for i in range(3): # コマンド表示
        for j in range(2):
            draw_text(bg, COMMAND[i][j], x_c_i_t+j*x_c_w/2, y_c_i_t+i*50, fnt, col)
    if tmr%5 != 0:
        draw_text(bg, "▶︎", x_c_i_t-50+cmd_x*x_c_w/2, y_c_i_t+cmd_y*50, fnt, col)

#####追加#####
    if spell_flag:
        y_c_h = 50 * (1+len(player)) + 30 # 高さ 1+は「じゅもん」 50=30(枠内の開始位置or文字間隔)+20(文字の大きさ) 30=最後の間隔
        pygame.draw.rect(bg, BLACK, [x_c_i+x_c_w/2, y_c_i, x_c_w/2, y_c_h], 0, 5) # 枠
        pygame.draw.rect(bg, col, [x_c_i+x_c_w/2, y_c_i, x_c_w/2, y_c_h], 2, 5) # 枠
        pygame.draw.line(bg, col, [x_c_i+x_c_w/2, y_c_i+65], [x_c_i+x_c_w, y_c_i+65], 2) # 線 65=30(枠内の開始位置)+20(文字の大きさ)+15(文字間隔の半分)
        draw_text(bg, COMMAND[cmd_y][cmd_x], x_c_i_t+cmd_x*x_c_w/2, y_c_i_t+cmd_y*50, fnt, col) # cmd_x=1,cmd_y=0
        for i, p in enumerate(player):
            draw_text(bg, p.name, x_c_i_t+cmd_x*x_c_w/2, y_c_i_t+(i+1)*50, fnt, col) # i=0は「じゅもん」
        if tmr%5 != 0:
            draw_text(bg, "▶︎", x_c_i_t-50+x_c_w/2, y_c_i_t+(sel_p_y+1)*50, fnt, col) # 名前の左に▶︎

#####追加#####
より下を追加しています。

spell_flagがTrueなら
「じゅもん」を表示して
spell_flagがFalseなら
「じゅもん」を表示しない
ようにします。

枠は以下のような感じです。

高さは
y_c_h = 50 * (1+len(player)) + 30
としています。

「じゅもん」「キャラ1」〜「キャラ4」
のように
「じゅもん」+キャラの人数分を
表示するので(1+len(player))
としています。

あとはコメントをご参考にして頂ければと
思います・・・(^_^;)

50とか30とか定数にして
格納したほうが良いのでしょうが・・
今回は以上です!(`・ω・´)

 

 

最後に

今回は移動中のコマンド「じゅもん」を選択すると
キャラの名前が表示されるようにしました。

この後、呪文を使うキャラを選択して
使う呪文を選択して
対象のキャラを選択して
呪文を使う
といった流れにしたいと思っています。

というわけで、次回もコマンド「じゅもん」に
手を加えていきたいと思います。

まとめサイトへ

 

 

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

 

 

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

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