概要
Rectは四角形であるが、Pygameでは次のような重要な役割がある
- Surfaceをさらにスマートに扱うことができる(細かくカスタマイズができる)
- 衝突判定できる
- 描くことも可能
Rect
Rectは以下に示す。
center/topleft/toprightなど、固有の位置が定義されているので、扱いやすい。
RectsとFRectsの違い
特にFRectsは扱いやすいので、Rectsは使う必要がほとんどない。
※公式のDocを見るとなんとget_frectの記述はありませんでした。
扱い方
# player.py
# イメージの読み込み
self.surface = pg.image.load(IMAGE_PATH).convert_alpha()
# rect
self.rect = self.surface.get_frect(center=pos)
# main.py
# playerの表示
self.display_surface.blit(self.player.surface,self.player.rect)
rectに変更した場合、pos(位置)が使えなくなるため、キャラクターを動かすことができなくなる。
rectそのものがメインとPlayerクラスのインターフェースになるため、
inputメソッドの以下のように変更する
def input_with_rect(self, dt):
# print(f'pos:{self.pos}')
# キーボード押されているかをキャッチしてくれる(キーボードイベントリスナー)
keys = pg.key.get_pressed()
if keys[pg.K_LEFT]:
print('左矢印が押されました')
self.rect.x -= 1 * dt * self.key_speed
elif keys[pg.K_RIGHT]:
print('右矢印が押されました')
self.rect.x += 1 * dt * self.key_speed
elif keys[pg.K_DOWN]:
print('↓矢印が押されました')
self.rect.y += 1 * dt * self.key_speed
elif keys[pg.K_UP]:
print('↑矢印が押されました')
self.rect.y -= 1 * dt * self.key_speed
元々のpos[0]→rect.x; pos[1]->rect.yのようにできるので、わかりやすい。
また、rectを使う事で、拡大縮小、回転、マスクなどいろんなことに使えるようになる。
まとめ
Rectを定義すると、下記のように実装になる
self.display_surface.blit(self.player.surface,self.player.rect)
rectはプロパティが多いので、カスタマイズはやりやすくなる(細かい計算しなくても済む)
pygameでRectとSurfaceはゲーム構成要素として、どのクラスでも扱うぐらい大事なポイント