前回→(https://qiita.com/Red-Jersey/items/195f413a86f6294c00c7)
はじめに
こんにちは。赤ジャージです。
今回は前回に引き続きpygameでのRPG制作です。
Pygameは挫折する要素が多すぎる!!!
プログラミング初心者が趣味で最初に触れる言語は大体Python(所説あり)で、その目的の大半はゲーム制作(???)です。その過程で大体の人がPygameを使うことになるのですが、初心者視点ではpygameは魑魅魍魎が跋扈する極めて複雑怪奇な現代のラビリンスです。とにかく難しい。挫折する。
僕もpygameを学び始めて早2年。全く使いこなせていません。╰(‘ω’ )╯三
もしつまずいたとしてもあまり気にせず行きましょう。(なぜ話したし)
ゲーム制作とは(哲学)
僕にとってゲーム制作とは、仮想世界の創造、つまり神への昇格です。(厨二病)
生き物も、言語も、文化も、さらには概念、物理法則すら自分で作れます。あなたがゲームを作るということは、あなたは仮想世界の創造主足りうるのです(SSSS.GRIDMANみたいな)。そう思うと妙に愛着が湧いてきませんか?ゲームの制作意欲が湧いてきませんか?このPC上の自分だけの無限世界を、とことん可愛がってあげましょう(狂気)
今回の目標
前回、ウィンドウの表示まで行きました。
今回のテーマは、ズバリ、テキストの表示です!
Pygameのサポートされている機能には、テキストを描画する機能があります。ここら辺は難しくないので、今回はサクッと説明します。
文字創造
ゲームには、文字が必要です。何らかの説明書きがないと、自分や味方、敵のステータス、技の効果やストーリーまでもがわからずじまいです。
import pygame
from pygame.locals import *
import sys
pygame.init()
screen = pygame.display.set_mode((640,480))
pygame.display.set_caption("Hello, world!")
font = pygame.font.SysFont(None, 80)
text1 = font.render("Hello, world!", False, (0,0,0))
text2 = font.render("Hello, world!", True, (255,0,0))
text3 = font.render("Hello, world!", True, (255,0,0), (255,255,0))
while True:
screen.fill((255,255,255))
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
screen.blit(text1, (20,50))
screen.blit(text2, (20,150))
screen.blit(text3, (20,250))
pygame.display.update()
このコードを実行すると、こうなります
ところで、文字というものにはフォントがありますよね?pygameではまずフォントを指定し、テキストを作成、表示しています。
関数変数キーワードの解説
・pygame.font.Sysfont(None,80)
: pygame.font
でpygameのfontライブラリにアクセスし、Sysfont()
でシステムフォントを指定します。この場合、None
と選択しているのでデフォルトのフォントが使われます。また、Sysfont
の第二引数は文字の大きさになっていて、この場合80なので80ピクセルの文字が使われます。まあこだわりがないなら何も考えずにpygame.font.Sysfont(None,サイズはお好みで)
と入力すればOKです。
・text = font.render()
: このメソッドはテキストを作るためのものです。引数が多いので箇条書きで。
・第一引数: テキストの本文を入力します。
・第二引数: 文字を滑らかにするか(アンチエイリアシング)を決めます。基本的にはTrue。
・第三引数: 文字本体の色をRGBで指定します。
・第四引数: 文字の背景の色をRGBで指定します。(デフォルトではなし)
・screen.blit(text,(x座標,y座標))
: 文字をスクリーンに表示します。第一引数は表示する変数、第二引数は表示する座標です。(指定した座標がテキストの左上の座標になります。)
転生勇者は英語を話せない
ここで、ある問題が発生します。pygameはデフォルトで日本語非対応!!!
というものです。日本語でtextを作っても、バグって文字化けします。これは、pygameに日本語のフォントがないことに由来します。なので、こっちで用意しなければなりません。僕はipaxeg.ttfファイル(ipaexゴシック)を使っています。
窓の社で無料でダウンロードできるので、オススメです。
☟これです。
https://forest.watch.impress.co.jp/library/software/ipaexfont/
コードとフォントファイルは必ず同じフォルダまたは同じ作業スペースに入れて下さい。そうしないと動きません。
日本語で押し通る
import pygame
from pygame.locals import *
import sys
pygame.init()
screen = pygame.display.set_mode((640,480))
pygame.display.set_caption("日本語で押し通る")
font = pygame.font.Font("ipaexg.ttf", 80)
text1 = font.render("こんにちは!", False, (0,0,0))
text2 = font.render("こんにちは!", True, (255,0,0))
text3 = font.render("こんにちは!", True, (255,0,0), (255,255,0))
while True:
screen.fill((255,255,255))
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
screen.blit(text1, (20,50))
screen.blit(text2, (20,150))
screen.blit(text3, (20,250))
pygame.display.update()
関数変数キーワードの解説
font = pygame.font.Font("ipaexg.ttf",80)
: 今回は、SysFontではなくFontを使っています。システムフォントではなく、外部のフォントを使うときはpygame.font.Font
を使います。
フォントファイルの拡張子は、.ttfが一般的です。
まとめ
フォントを用意(font = pygame.font.SysFont or Font(フォント名,大きさ)
)
↓
テキストを作成(text = font.render(テキスト,True,(R,G,B))
)
↓
テキストを表示(screen.blit(text,(x座標,y座標))
)
こんな感じで文字をウィンドウに表示させています。
Result
今回は、文字を表示できるようにしました。文字はゲームにおいて極めて重要な役割を持つので、極めて重要な役割を持ちます(大事なことなので2回言いました)
外部ファイルを使ってコードを書くとバグることがよくあります。僕の場合vscodeで画像を読み込ませるのが難しかったり、日本語を表示させようとして何回もバグったりします(おま環)
バグって上手くいかなくても根気よくやりましょう。そのうちできます。
参考文献
この記事はこのブログを嚙み砕いて説明しております...(そのうちオリジナルRPGを作るようになるんだよね?ね??)
https://aidiary.hatenablog.com/entry/20080507/1269694935