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を作る(4.Rect)

Posted at

概要

Rectは四角形であるが、Pygameでは次のような重要な役割がある

  1. Surfaceをさらにスマートに扱うことができる(細かくカスタマイズができる)
  2. 衝突判定できる
  3. 描くことも可能

Rect

Rectは以下に示す。
center/topleft/toprightなど、固有の位置が定義されているので、扱いやすい。

image.png

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はゲーム構成要素として、どのクラスでも扱うぐらい大事なポイント

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?