0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

pygameでRPGをつくってみる3 バトル画面

Last updated at Posted at 2024-10-03

記事全体の目次へ移動

GIF

ここをクリックしてください

無題の動画 ‐ Clipchampで作成 (2).gif

無題の動画 ‐ Clipchampで作成 (1).gif

キーハンドラー

何かキーが押されたとき、図形が表示されるコードです。

ここをクリックしてください
keyhandler

import pygame
from pygame.locals import *
import sys

pygame.init()
screen = pygame.display.set_mode((160,160))
pygame.display.set_caption("key_handler")
rect_show = False

while(1):
    screen.fill((0,0,0))
    if rect_show:
        pygame.draw.rect(screen,(255,255,255),(60,60,40,40))
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == KEYDOWN:
            rect_show = not rect_show

elif event.type == KEYDOWN:
何かキーが押された時だけ処理が実行されます。
rect_show = not rect_show
処理が実行されるたびにFalseとTrueが入れ替わります。

マウス操作

左クリックされたとき、図形が表示されます。

ここをクリックしてください

(ここをクリックしてください をクリックしても図形は表示されません。たまたま表現が被ってるだけです。)

mouse
import pygame
from pygame.locals import *
import sys

pygame.init()
screen = pygame.display.set_mode((160,160))
pygame.display.set_caption("mouse")
rect_show = False

while(1):
    screen.fill((0,0,0))
    if rect_show:
        pygame.draw.rect(screen,(255,255,255),(60,60,40,40))
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        mouse_pressed = pygame.mouse.get_pressed()
        if mouse_pressed[0]:
            rect_show = not rect_show

mouse_pressed = pygame.mouse.get_pressed()
マウスが押されたかどうかを判断します。
if mouse_pressed[0]:
左クリックされたかどうかを判断します。
[0]が左クリック

[1]がセンターボタン

[2]が右クリック

Zキーが押されたら数字が減る 

ここをクリックしてください

ダメージを極限まで簡略化させたものです。


import pygame
import sys
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((160, 160))
pygame.display.set_caption('down')
#ここにフォントのパスを貼り付ける
font = pygame.font.Font(パス, 30)        

hp = 50
damage = 0

while (1):
    screen.fill((0, 0, 0))
    text = font.render(str(hp), True, (255, 255, 255)) 
    screen.blit(text, (60,60))    
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type==KEYDOWN:
            if event.key==K_z:
                damage = 10
                hp -= damage

hp -= damage
he -= 10 でも良いわけですが、コードを読みやすくするためにこう書いています。

隅が丸い枠

ここをクリックしてください

スクリーンショット (663).png

隅が丸い枠
import pygame
import sys
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((160, 160))
pygame.display.set_caption("flame")

while True:
    screen.fill((0, 0, 0))
    # 四角形を描画
    pygame.draw.rect(screen, (255, 255, 255), (40, 50, 80, 60), 3, 5)
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

pygame.draw.rect(screen, (255, 255, 255), (40, 50, 80, 60), 3, 5)
(255, 255, 255)色の指定です。
(40, 50, 80, 60)座標と大きさです。(よこ、たて、幅、高さ)
3が枠の太さです。
5が角の丸みの半径です。

三角形の描画(カーソル風)

ここをクリックしてください

スクリーンショット (662).png

import pygame
import sys
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((80, 80))
pygame.display.set_caption('Draw Triangle')

while True:
    # 画面を黒で塗りつぶす
    screen.fill((0, 0, 0)) 
    # 三角形を描画
    pygame.draw.polygon(screen, (255, 255, 255), [(5, 5), (15, 10), (5, 15)])
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

pygame.draw.polygon(screen, (255, 255, 255), [(5, 5), (15, 10), (5, 15)])

[(5, 5), (15, 10), (5, 15)])
 図形の頂点の座標です。三角形なので3つあります。四角形なら4つですね。
 座標の順番には決まりがあるでしょうか。
 順番に決まりはありませんが、注意点があります。それは、図形が頂点を結んで描かれることです。三角形では頂点が交差しないので問題ありませんが、四角形からは気を付けなければなりません。

[(5, 5), (5, 45), (45, 45), (45, 5)]

正しい四角形.png

[(5, 5), (5, 45), (45, 5), (45, 45)]

予想外四角形.png

座標は同じでも、順番によって描かれる図形が変わります。

戦闘画面

ここをクリックしてください

スクリーンショット (665).png

import pygame
import sys
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((320, 320))
pygame.display.set_caption('battle')
#ここにフォントのパスを貼り付ける
font = pygame.font.Font(パス,15)

hp = 39
while (1):
    screen.fill((0, 0, 0))
    #HP枠
    pygame.draw.rect(screen,(255,255,255),(20,10,100,100),3,5)
    #コマンド枠
    pygame.draw.rect(screen,(255,255,255),(20,210,100,100),3,5)
    #モンスター名枠
    pygame.draw.rect(screen,(255,255,255),(130,210,180,40),3,5)
    #線
    pygame.draw.line(screen,(255,255,255),(20,35),(116,35),1)
    #ステータス表示
    text = font.render("ゆうしゃ",True,(255,255,255))
    screen.blit(text,(40,13))
    text = font.render("H  " + str(hp),True,(255,255,255))
    screen.blit(text,(35,38))
    text = font.render("M  0",True,(255,255,255))
    screen.blit(text,(35,58))
    text = font.render("ゆ: 1",True,(255,255,255))
    screen.blit(text,(35,78))
    #コマンド表示
    text = font.render("ゆうしゃ",True,(255,255,255))
    screen.blit(text,(40,213))
    text = font.render("たたかう",True,(255,255,255))
    screen.blit(text,(40,243))
    text = font.render("モンスター  一匹",True,(255,255,255))
    screen.blit(text,(150,218))
    pygame.draw.line(screen,(255,255,255),(20,235),(116,235),1)
    #カーソル
    pygame.draw.polygon(screen, (255, 255, 255), [(25,250), (35, 255), (25, 260)])

    pygame.display.update()
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

枠の点滅

ここをクリックしてください

Zキーを押したら枠が点滅します。

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

pygame.init()
screen = pygame.display.set_mode((160, 160))
pygame.display.set_caption('flame_flash')
damage_flash = True
flash = 0
while (1):
    screen.fill((0, 0, 0))
    if damage_flash:
        pygame.draw.rect(screen, (255,255,255), Rect(60,60,40,40), 3)
    pygame.display.update()
    #枠点滅
    if flash > 0:
        damage_flash = not damage_flash
        flash -= 1
        time.sleep(0.15)
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            if event.key == K_z:
                damage_flash = False
                flash = 3
                time.sleep(0.5)

'if damage_flash:
pygame.draw.rect(screen, (255,255,255), Rect(60,60,40,40), 3)'

if分をつけることで条件を満たさないときに、枠が消えるようにしています。

if event.type == KEYDOWN:
if event.key == K_z:
damage_flash = not damage_flash
flash = 3
time.sleep(0.5)

if event.type == KEYDOWN:
if event.key == K_z:

 Zキーが押されたとき,処理を実行します。

'damage_flash = not damage_flash'

 damage_flashをFalseにします。
damage_flash = Falseと書いても同じことです。

flash = 3 点滅の回数のためにあります。

pygame.display.update()
#枠点滅
if flash > 0:
damage_flash = not damage_flash
flash -= 1
time.sleep(0.15)

 このコードで一番大事なところです。

if flash > 0:

 0でなければ、処理を実行します。flashが3でしたから、3回実行します。キーハンドラーで1回実行してますから、合計4回です。消えて、現れて、消えて、現れて。
 キーハンドラーのところのflashが偶数だと消えたままになるので注意が必要です。

flash -= 1

flashを減らします。

time.sleep(0.15)

点滅の速さのためにあります。数字が大きければ遅く、小さければ早くなります。

 このコードのどこが大事なのでしょうか。
 ぼくは枠を点滅させるためにいろいろ考えましたが、完成させられずに早々にあきらめました。
 Copilotに聞いたところ、このコードを返したのですが、ぼくが最初に考えたのとほとんどおんなじです。何が違うのか詳しく見ると、pygame.display.update()の下にありました。何かを描画する際は必ずpygame.display.update()の上に書くものという先入観があったので盲点でした。ちなみに、pygame.display.update()の上だとうまくいきません。

モンスター画像の点滅

ここをクリックしてください

Zキーを押したらモンスター画像が点滅します。


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

pygame.init()
screen = pygame.display.set_mode((160, 160))
pygame.display.set_caption('monster_flash')
#ここにモンスター画像のパスを貼り付ける
img = pygame.image.load(パス)
damage_flash = True
flash = 0
while (1):
    screen.fill((0, 0, 0))
    #モンスター画像の表示
    if damage_flash: 
        screen.blit(img, (25,25))  
    pygame.display.update()
    if flash > 0:
        damage_flash = not damage_flash
        flash -= 1
        time.sleep(0.15)
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            if event.key == K_z:
                damage_flash = False
                flash = 3
                time.sleep(0.5)

ここをクリックしてください


0
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?