Pygameド素人がRPGを作る　レベル2

前回→(https://qiita.com/Red-Jersey/items/195f413a86f6294c00c7)
# はじめに
こんにちは。赤ジャージです。
今回は前回に引き続きpygameでのRPG制作です。

### Pygameは挫折する要素が多すぎる!!!
プログラミング初心者が趣味で**最初に触れる言語は大体Python**(所説あり)で、その目的の大半はゲーム制作(???)です。その過程で大体の人がPygameを使うことになるのですが、初心者視点ではpygameは**魑魅魍魎が跋扈する極めて複雑怪奇な現代のラビリンス**です。とにかく難しい。挫折する。
僕もpygameを学び始めて早2年。全く使いこなせていません。╰(‘ω’ )╯三
もしつまずいたとしてもあまり気にせず行きましょう。(なぜ話したし)

## ゲーム制作とは(哲学)
僕にとってゲーム制作とは、**仮想世界の創造、つまり神への昇格**です。(厨二病)
生き物も、言語も、文化も、さらには概念、物理法則すら自分で作れます。あなたがゲームを作るということは、あなたは仮想世界の創造主足りうるのです(SSSS.GRIDMANみたいな)。そう思うと妙に愛着が湧いてきませんか？ゲームの制作意欲が湧いてきませんか？このPC上の自分だけの無限世界を、とことん可愛がってあげましょう(狂気)

# 今回の目標
前回、ウィンドウの表示まで行きました。
今回のテーマは、ズバリ、**テキストの表示**です！
Pygameのサポートされている機能には、テキストを描画する機能があります。ここら辺は難しくないので、今回はサクッと説明します。

# 文字創造
ゲームには、文字が必要です。何らかの説明書きがないと、自分や味方、敵のステータス、技の効果やストーリーまでもがわからずじまいです。
```python:テキストの表示1
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()
```
このコードを実行すると、こうなります
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3367669/63cb0be7-a663-e59e-d248-f983ced540f0.png)
ところで、文字というものにはフォントがありますよね？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/
コードとフォントファイルは**必ず同じフォルダまたは同じ作業スペース**に入れて下さい。そうしないと動きません。

## 日本語で押し通る
```python:テキストの表示2
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()
```
うまくいけばこうなるはずです。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3367669/989f8b33-6660-592c-a6d4-e8335b66e902.png)

### 関数変数キーワードの解説
`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