初めてのクラス
CoddyのPygameジャーニー「スプライトと画像」セクションの一部。レッスン 10/36。
星を表す変数は3つあります。star_x、star_y、star_speedです。星が1つならこれで十分ですが、空いっぱいの星を扱うには、それぞれの星の数値をまとめて管理するもっとよい方法が必要です。
クラスは、ある種類のオブジェクトを作るための設計図です。そこから作られた各オブジェクトは、属性と呼ばれる独自の値を持ちます。
class Star:
def __init__(self, x, y):
self.x = x
self.y = y
self.speed = 2
star = Star(320, 0)Star(320, 0)は新しいStarオブジェクトを作ります。するとPythonは、そのオブジェクトに対して__init__を実行します。これはクラス内にある、各オブジェクトを新しく作るときに初期設定する関数です(両側にアンダースコアが2つずつ付いた名前は、Pythonが探す名前です)。その際、x = 320とy = 0が渡されます。関数内では、selfは新しいオブジェクトを指すため、self.x = xによって320がそのオブジェクトに保存されます。クラスの外では、同じ値にstar.xでアクセスでき、同じように変更できます。star.y += star.speedのように書きます。
クラス名は大文字で始めます。Starは設計図で、starはそこから作られた星の1つです。
チャレンジ
簡単self.x、self.y、self.speed = 2を格納するクラスStarを作成します。__init__(self, x, y)を使います。- 3つの変数を
star = Star(320, 0)に置き換えます。 - ループ内で、以前の変数が使われていた箇所に
star.y、star.speed、star.xを使います。
自分で試してみよう
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Falling Star")
clock = pygame.time.Clock()
star_x = 320
star_y = 0
star_speed = 2
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
star_y += star_speed
if star_y > 480:
star_y = 0
screen.fill((20, 22, 40))
pygame.draw.circle(screen, (255, 255, 255), (star_x, star_y), 4)
pygame.display.flip()
clock.tick(60)
pygame.quit()
スプライトと画像のすべてのレッスン
自分で練習してみよう: Pygameプレイグラウンド