pygameチートシート



## タイトル：基本のテンプレート
日付：2021/06　修正：2022/10/08
分類：Python　pygame


--------------サンプル--------------
とりあえず画面を出して丸を描画、四角、線を描画

```py
import pygame
from pygame.locals import *
import sys
def main():
    pygame.init()                                 # Pygameの初期化
    screen = pygame.display.set_mode((800, 600))  # 800*600の画面
    px=120
    py=100
    while True:
        screen.fill((255,255,255))                                    # 背景を白
        pygame.draw.circle(screen,(10,10,10),(px,py),50)              # ●
        pygame.draw.rect(screen, (255,0,0), Rect(10,100,50,50), 1)    # ■
        pygame.draw.line(screen, (0,255,0), (0,200), (100,300), 2)    # 線
        pygame.display.update()                                       # 画面更新

        # イベント処理
        for event in pygame.event.get():  # イベントを取得
            if event.type == QUIT:        # 閉じるボタンが押されたら
                pygame.quit()             
                sys.exit()                # 終了
if __name__ == "__main__":
    main()
```

### 基本のテンプレートの変形
--------------サンプル--------------
黒い円が動きます
```py
import pygame
from pygame.locals import *
import sys

def event():
    # イベント処理
    for event in pygame.event.get():  # イベントを取得
        if event.type == QUIT:        # 閉じるボタンが押されたら
            pygame.quit()             
            sys.exit()                # 終了


pygame.init()                                 # Pygameの初期化
screen = pygame.display.set_mode((800, 600))  # 800*600の画面
px=120
py=100
while True:
    screen.fill((255,255,255))                                     # 背景を白に
    pygame.draw.circle(screen,(10,10,10),(px,py),50)               # ●
    px += 1
    pygame.display.update()                                        # 画面更新
    event()

```

### 初期化
--------------サンプル--------------
800x600ピクセルのスクリーンを準備します

```py
import sys 
import pygame 
from pygame.locals import *
pygame.init()
sc = pygame.display.set_mode(( 800, 600))  # window設定
```

### キー入力
イベントキューをgetして、仕分けします
--------------サンプル--------------
```py
for event in pygame.event.get(): 
    if event. type == QUIT: 
        pygame.quit() 
        sys. exit()
    elif event.type == KEYDOWN: 
        if event.key==K_LEFT:
          pvx -=5  # 横方向の速度
        elif event.key==K_RIGHT:
          pvx +=5  # 横方向の速度
```

### マウス入力
--------------サンプル--------------
ボタンが押されたときだけマウスの座標を表示

```py
for event in pygame.event.get():
    if event.type == QUIT:
        pygame.quit() 
        sys.exit()
    elif event.type == MOUSEBUTTONDOWN:
        btn = event.button
        x, y = event.pos
        print(x,y,btn)
```


### マウス入力２
--------------サンプル--------------
マウスを動かしたら、座標を表示

```py
for event in pygame.event.get():
    if event.type == QUIT:
        pygame.quit() 
        sys.exit()
    elif event.type == MOUSEMOTION:
        x, y = event.pos
        print(x,y)
```

### スプライト　１点
1つの画像を表示する場合

--------------書式--------------
screen.blit( ①, ② )

①　オブジェクト
②　矩形の左上の座標と幅、高さをpygame.Rectで指定


--------------サンプル１--------------

```py
gPng = pygame.image.load("python/rpg/hero.png").convert_alpha()   #画像を読み込む
screen.blit(gPng ,Rect(hx,hy,50,50))#オブジェクトを指定の座標に表示
```

### マップチップからスプライト
マップチップ（複数の画像をまとめたファイル）から１つ選択して表示
--------------書式--------------
screen.blit( ①, ②, ③ )

①　オブジェクト
②　先：出力先の位置(x,y)
③　元：取り込み元の位置(x,y,w,h)

--------------サンプル--------------

```py
gPng = pygame.image.load("sprite.png").convert_alpha()   
screen.blit(gPng ,(mx,my),(0,0,64,128))
#　mx,myがスクリーン上に出すときの座標
#　(0,0,64,128)がマップチップ左上の座標と幅、高さ
```




### 画像の拡大縮小

--------------サンプル--------------

```py
gPng = pygame.image.load("sprite.png").convert_alpha()   
gPng = pygame.transform.scale(gPng, (200, 200)) #200x200に画像を拡大
screen.blit(gPng ,(mx,my),(0,0,64,128))
```





### フレームレート調整
    ck = pygame.time.Clock()

whileループの中に以下を書く

```py
ck.tick(30) #1秒間で30フレームになるように33msecのwait
```


### 四角形を描く
--------------書式--------------
pygame.draw.rect( ①, ②, ③, ④ )

 ①　screen
 ②　図形の色(R,G,B)で指定
 ③　矩形の左上x,yとw,h（pygame.Rectで指定）
 ④　線の太さ   （省略すると塗りつぶされる）

--------------サンプル--------------

```py
pygame.draw.rect(screen, (255,0,0), Rect(10,10,300,200), 5)
#上の例の場合、左上の座標が(10,10)、幅が300、高さが200
```

### 円を描画

--------------書式--------------
pygame.draw.circle(①,②,③,④,⑤ )
①　screen
②　図形の色(R,G,B)
③　中心(x,y)
④　半径r
⑤　線の太さ   （省略すると塗りつぶされる）

--------------サンプル--------------

```py
pygame.draw.circle(screen, (255,0,0), (320,240), 100, 5)
```

### 楕円を描画

--------------書式--------------
pygame.draw.ellipse(①,②,③,④ )
①　screen
②　図形の色(R,G,B)
③　左上の座標
④　幅、高さ

--------------サンプル--------------

```py
pygame.draw.ellipse(screen, (255,0,255), (400,300,200,100))
```

### 直線描画

--------------書式--------------
pygame.draw.line( ①, ②, ③, ④ ,⑤　)
 ①　screen
 ②　図形の色(R,G,B)
 ③　左上の座標
 ④　右下の座標
 ⑤　線幅　省略すると幅1の線

--------------サンプル--------------

```py
pygame.draw.line(screen, (255,255,255), (0,0), (640,480), 8)　
```


### テキスト描画
３段階でテキストを描画します
　①フォントの準備
　②テキストを画像化する
　③画像をスクリーン上に描画（screen.blit参照）

#### ①フォントの準備
font = pygame.font.Font(None, 55)               # フォントの設定(55px)
　ただし pygame.init() のあとに書くこと 
　Noneのところにフォントファイル名を指定できるが、 NoneだとPygameの既定フォントを読み込む 

#### ②テキストの画像化
--------------書式--------------
① = ②.render( ③, ④, ⑤, ⑥ )
　①　オブジェクト
　②　準備で指定したオブジェクト
　③　文字列
　④　アンチエイリアス（なめらかにするかどうか）
　⑤　文字の色
　⑥　背景の色（指定しないと透明）

#### ③画像をスクリーン上に描画
screen.blitで解説しているのでそちらを参照


--------------サンプル--------------

```py
font = pygame.font.Font(None, 55)              # 準備 フォントの設定(既定フォント,55px)
                                               # pygame.init() のあとに書くこと 


gTxt = font.render("TEST", True, (255,255,255)) # 描画する文字列を画像にする
screen.blit(gTxt, [20, 100])                    # 画像を表示
```
参考　http://westplain.sakuraweb.com/translate/pygame/Font.cgi

### サウンド
*wavのみ　mp3はだめ
（mp3をwavに変換するサイト　https://convertio.co/ja/wav-mp3/）

--------------準備--------------
import pygame
pygame.mixer.init()
--------------書式--------------
② = pygame.mixer.Sound(①)

 ①　ファイル名
 ②　オブジェクト

--------------サンプル--------------

```py
import pygame
pygame.mixer.init()
.....
sd_hit = pygame.mixer.Sound("psh.wav")
sd_hit.play()  # サウンドhit
```

### CSV書き出し
--------------準備--------------
import csv
--------------書式--------------
with open(file_name,"w",newline='',encoding='utf-8') as f:
※newlineをいれないと一行あいてしまう場合


--------------サンプル--------------

```py
import csv
with open(file_name,"w",newline='',encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow(["広さ",winX,winY])
    #		            ↑
    #　　ここは引数１つのみにする	[]はそのため
```

### 日時取得

--------------書式--------------
datetime.datetime.now()

--------------サンプル1--------------

```py
import datetime
now = datetime.datetime.now() #ファイル名に使う
s2 = str(now).replace(":","").replace("-","")	#ファイル名に使うときは:や-を削る
```

--------------サンプル2--------------

```py
import datetime
date = datetime.datetime.now()

print("年：",date.year) 
print("月：",date.month)
print("日：",date.day) 
print("時：",date.hour)
print("分：",date.minute)
print("秒：",date.second)
print("マイクロ秒：",date.microsecond)
```


### タイトル：当たり判定をイメージで理解
追加：2021/04/03
分類：当たり判定 

![当たり判定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411052/caf07c16-a68c-27ba-9a60-6f48874f4e6f.png)
（クリックで拡大します）


### タイトル：横スクロールゲームの基本
横スクロールゲームは、横長の画面の一部がscreenに表示されている状態になるわけですが、見えている範囲をキーボードで左右に動かせるようにすると、画面の見えている範囲が動くし、キャラも動く、敵キャラも動き回るというわけで座標がワケワカメになってきます。簡単な変換式で相互に変換できるのですが、うっかり忘れるとひどい目に合う（合った）ので画像とともにアップしておきます。

![横スクロール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411052/e96d8bbc-766c-cf28-a644-7b94260b1d77.png)



縦スクロールでも考え方は同じです。

### タイトル：pygameに日本語表示
日付：2021/02
分類：Python　pygame
方法：
  ① print(pygame.font.get_fonts())  で使えるフォントを確認しておく
  ② たとえば、[,,,hg明朝bhgp明朝bhgs明朝b,,,,]と表示されたら
  ③ font = pygame.font.SysFont("hg明朝bhgp明朝bhgs明朝b", 15)　のように使える。

--------------サンプル--------------

```py
import pygame
from pygame.locals import *
import sys

pygame.init()
screen = pygame.display.set_mode((800, 600)) 
font1 = pygame.font.SysFont("hg明朝bhgp明朝bhgs明朝b", 15)#◆

while (1):
    screen.fill((255,255,255))                                  # 画面を白に
    text1 = font1.render("本日は晴天なり ", True, (0,0,255))     #普通に文字表示
    screen.blit(text1, (40,30))
    pygame.display.update()                                     # 画面更新

    # イベント処理
    for event in pygame.event.get():  # イベントキューからキーボードやマウスの動きを取得
        if event.type == QUIT:        # 閉じるボタンが押されたら
            pygame.quit()             # 全てのpygameモジュールの初期化を解除
            sys.exit()                # 終了（ないとエラーで終了することになる）
if __name__ == "__main__":
    main()
```