0
1

More than 1 year has passed since last update.

PygameでRPG制作 ーーそれっぽい画面を作ってみよう④ 各アクションのでの動作とHP機能の実装

Posted at

この記事は、岩手県八幡平市のプログラミング教室「アクセルキャンプ」の公開教材です。
アクセルキャンプ(フリースペースプラウド)のリンク
教材の作成依頼等も承っております。ご意見等は、リンク先の問い合わせ欄からお願いします。
教材の転用・利用等は自由です


寒い!起きれない!ネムイ(´・ωゞ)

布団から出られません。先生、最近朝4時起きしてるんですが、外は氷点下です。起きねぇっすマジムリっす。 アルバイトを募集します。朝4時に先生の家まで来て先生を起こすだけの簡単なお仕事です。応募はフリースペースプラウドまで。

前回までのコード

import pygame
from pygame.locals import *
import sys

# 効果音を再生する関数
def sound_effect(sound):
    pygame.mixer.music.load(sound)
    pygame.mixer.music.play(1)


    /*中略*/
    # 効果音
    select_sound = "sound/select_sound.mp3"

    while (1):
        /*中略*/
        # イベント処理
        for event in pygame.event.get():
            if event.type == QUIT:  # 閉じるボタンが押されたら終了
                pygame.quit()  # Pygameの終了(画面閉じられる)
                sys.exit()

            elif event.type == KEYDOWN:
                if event.key == K_UP:
                    if action_number == 0:
                        action_number = 2
                    else:
                        action_number -= 1
                     
                    # 再生
                    sound_effect(select_sound)
                elif event.key == K_DOWN:
                    if action_number == 2:
                        action_number = 0
                    else:
                        action_number += 1
                    # 再生
                    sound_effect(select_sound)


if __name__ == "__main__":
    main()

前回はsound_effect関数を作成し、選択肢を変えるたびに音を鳴らしていましたね。

サーセン(๑´ڤ`๑)テヘ♡

前回の記事で、間違いがありました。「え?うまく動いてんじゃん」って思うかもしれませんが、結構大きな間違い💦

前回は音楽ファイルを「BGMとして」再生していました。本来は「効果音として」再生したいです。sound_se関数を、以下のように修正してください

"""修正前
def sound_effect(sound):
    pygame.mixer.music.load(sound)
    pygame.mixer.music.play(1)
    time.sleep(0.2)
    pygame.mixer.music.stop()
"""

# 修正後
def sound_effect(sound):
    se = pygame.mixer.Sound(sound)
    se.play()

time.sleep()で、わざわざプログラムを0.2秒止めて音楽を再生していたんですね。選択音のような短いファイルならなんとかごまかせそうですが、少し長めのファイルになると、問題が出てきます。pygame.mixer.Sound()をつかうことで、効果音として、プログラムを止めることなく再生できます。

選択肢によって効果音を変えよう

「たたかう」「じゅもん」「にげる」選択肢を選んでいる状態でエンターキーを押すと、それに合った効果音が再生される、というのを実装していきます。

まず、音楽ファイルを用意しましょう。今回は効果音ラボのサイトから音源を持ってきます。

ダウンロードできたら、それぞれのファイルをsoundフォルダに移します。

image.png

それでは、コードでそれぞれの音がなるようにしていきましょう。

「エンターキーを押すと」音が鳴る、というようにしたいので、event.type == KEYDOWNのあたりをいじっていけばよさそうですね。前回も「↓」を押したときに音が鳴る、としたので、それをマネしてみましょう。

elif event.type == KEYDOWN:
    if event.key == K_DOWN:
        if action_number == 2:
            action_number = 0
        else:
            action_number += 1
        sound_effect("sound/select_se.mp3")
    elif event.key == K_RETUREN:
        sound_effect("sound/battle.mp3")

音は再生されましたか?うまくいってないときは、エラー文をよく見た上で、ファイルのパス(sound/spell.mp3)のスペルなどを確認してみてください。
現在はどこでもエンターキーを押すと攻撃用bgmが流れてきてしまうので、これを条件分岐を使ってじゅもん、にげるでも音が出るように改良しましょう。条件分岐わすれちゃったぜ!という人は、ここで再確認してみてください

elif event.type == KEYDOWN:
    if event.key == K_DOWN:
        if action_number == 2:
            action_number = 0
            
        else:
            action_number += 1
        sound_effect("sound/select_se.mp3")
        
    elif event.key == K_RETUREN:
        
        # たたかう
        if action_number == 0:
            sound_effect("sound/battle.mp3")
            
        # じゅもん
        elif action_number == 1:
            sound_effect("sound/spell.mp3")
            
        # にげる
        elif action_number == 2:
            sound_effect("sound/run.mp3")
    

HP機能の実装

今の状態では、ただスライムに攻撃したら、攻撃の音がするだけ担っているので、実際にHPを減らすことができるようにしましょう。

以下のように要件定義をします。

①スライムの体力は530,000
②攻撃の威力は10.000から30,000までのランダムな数字
③HPがゼロになったら、「”リッキーを たおした! けいけんちを 100 てにいれた”」と表示

①スライムの体力は530,000

〇リーザ様ですね。これは最初から決まっている値なので、メインループが始まる前に変数を作りましょう

hit_point == 530000

②攻撃の威力は10.000から30,000までのランダムな数字

pythonでランダムな数字を得るためにはいくつかの手段があります。python自体にはランダム機能は含まれているのですが、デフォルトの状態ではその機能を使えるようになっていません。なので、pygame同様に,「random」をimportする必要があります。
今回は小数ではなく整数のランダムな値にしたいので、randomモジュールのなかのrandint()関数を使います。引数として、ランダムの範囲(〇から×までのランダムな整数の場合、〇と×)の2つの整数を引数に取ります。

import random
"""
中略
"""
attack = random.randint(10000, 30000)

attackですが、どこに書いたいいかわかりますか?キーボードのボタンが押されたとき → そのキーがエンターキーだったとき → 「たたかう」が選択されていた時(action_numberが0だったとき) に、攻撃をしたいわけですので、しかるべきところに書いていきましょう。 ついでに、Hit_Pointからattackを引き算しちゃいましょう。

elif event.type == KEYDOWN:
    if event.key == K_DOWN:
        if action_number == 2:
            action_number = 0
        else:
            action_number += 1
        sound_effect("sound/select_se.mp3")

    # エンターキーが押されたとき
    elif event.key == K_RETURN:
        # 「たたかう」のBGM
        if action_number == 0:
            sound_effect("sound/battle.mp3")
            
            #10000から30000までのランダムな整数 
            attack = random.randint(10000, 30000)
            hit_Point -= attack

③HPがゼロになったら、「”リッキーを たおした! けいけんちを 100 てにいれた”」と表示

ここまで来れたらもう簡単。if文で残りHPを判定して、printするだけですね。

if action_number == 0:
    sound_effect("sound/battle.mp3")
    attack = random.randint(10000, 30000)
    hit_point -= attack
    if hit_point <= 0:
        print("りっきーを たおした! けいけんちを 10000 てにいれた!")
    else:
        print(hit_point)

コード全体を見てみましょう。

import pygame
from pygame.locals import *
import sys
import time
import random

"""修正前
def sound_effect(sound):
    pygame.mixer.music.load(sound)
    pygame.mixer.music.play(1)
    time.sleep(0.2)
    pygame.mixer.music.stop()
"""

# 修正後
def sound_effect(sound):
    se = pygame.mixer.Sound(sound)
    se.play()
def main():
    pygame.init()  # Pygameの初期化
    screen = pygame.display.set_mode((800, 600))  # 400 x 300の大きさの画面を作る
    pygame.display.set_caption("いけめんがつくったげえむ")  # 画面上部に表示するタイトルを設定

    rect_x = 20  # 長方形左上のx座標
    rect_y = 400  # 長方形左上のx座標
    rect_width = 800 - (rect_x * 2)  # 長方形の幅
    rect_height = 600 - (rect_y + 20)  # 長方形の高さ
    slyme_image = pygame.image.load("image/slyme.png")

    font = pygame.font.Font("font/DragonQuestFC.ttf", 30)

    action_number = 0  # 選択肢の番号
    white = (255, 255, 255)
    yellow = (255, 255, 0)

    # 効果音
    pygame.mixer.init()

    # HP
    hit_point = 530000


    while (1):

        """
        一度全部白にしてから、指定の部分だけ黄色にする
        """
        # リスト:
        colors = [white, white, white]
        colors[action_number] = yellow

        screen.fill((0, 0, 0))  # 画面を黒色に塗りつぶし
        screen.blit(slyme_image, (400 - (400 / 2), 0))

        pygame.draw.rect(screen, (255, 255, 255), Rect(rect_x, rect_y, rect_width, rect_height), 10)
        text = font.render("りっきーが あらわれた!", True, (255, 255, 255))

        """
        colorsリストから、それぞれの文字の色を取得する
        """
        battle_text = font.render("たたかう", True, colors[0])
        spell_text = font.render("じゅもん", True, colors[1])
        run_text = font.render("にげる", True, colors[2])

        screen.blit(text, (40, 420))
        screen.blit(battle_text, (45, 450))
        screen.blit(spell_text, (45, 480))
        screen.blit(run_text, (45, 510))

        pygame.display.update()  # 画面を更新
        # イベント処理
        for event in pygame.event.get():
            if event.type == QUIT:  # 閉じるボタンが押されたら終了
                pygame.quit()  # Pygameの終了(画面閉じられる)
                sys.exit()

            elif event.type == KEYDOWN:
                if event.key == K_DOWN:
                    if action_number == 2:
                        action_number = 0
                    else:
                        action_number += 1
                    sound_effect("sound/select_se.mp3")


                # エンターキーが押されたとき
                elif event.key == K_RETURN:
                    # 「たたかう」のBGM
                    if action_number == 0:
                        sound_effect("sound/battle.mp3")
                        attack = random.randint(10000, 30000)
                        hit_point -= attack
                        if hit_point <= 0:
                            print("りっきーを たおした! けいけんちを 10000 てにいれた!")
                        else:
                            print(hit_point)


                    # 「じゅもん」のBGM
                    elif action_number == 1:
                        sound_effect("sound/spell.mp3")
                    # 「にげる」のBGM
                    elif action_number == 2:
                        sound_effect("sound/run.mp3")

if __name__ == "__main__":
    main()

image.png

現在はログが出ているだけなので、次回はこれをしっかり画面に反映させていきましょう。


今回はここまで!来週の内容ですが、実は今までの内容の応用のみで実装可能です。 四角を表示して、HPの表示をしますが、ポイントはどういうときに四角を表示して、どういうときに非表示にするかです。
ぜひ、前の記事を確認しながら、挑戦してみてください!

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1