Menu
CoddyTech

selfはオブジェクトそのもの

CoddyのPygameジャーニー「スプライトと画像」セクションの一部。レッスン 12/36。

1つのクラスから好きなだけオブジェクトを作成でき、それぞれが独自の属性を保持します。__init__に速度パラメーターを追加すると、2つの星が異なる速度で落下します。

slow = Star(200, 0, 1)
fast = Star(440, 0, 3)

slow.update()と書くと、PythonはStar.update(slow)を実行します。selfはslowなので、self.y += self.speedによってslowは1だけ移動します。fast.update()では、selfをfastにして同じ行を実行し、3だけ移動します。1つのメソッドと2つのオブジェクトですが、互いの数値に影響を与えることはありません。

そのため、オブジェクトが持つ値の前には必ずself.を付ける必要があります。speedのように付けない名前は、メソッド内の通常のローカル変数です。メソッドが終了すると、その変数は消えます。

challenge icon

チャレンジ

簡単
  1. __init__に3つ目のパラメーターspeedを追加し、self.speedとして保存します。
  2. starを2つの星に置き換えます:slow = Star(200, 0, 1)とfast = Star(440, 0, 3)。
  3. 毎フレーム、両方の星を更新して描画します。

自分で試してみよう

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Falling Star")
clock = pygame.time.Clock()

class Star:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.speed = 2

    def update(self):
        self.y += self.speed
        if self.y > 480:
            self.y = 0

    def draw(self, screen):
        pygame.draw.circle(screen, (255, 255, 255), (self.x, self.y), 4)


star = Star(320, 0)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    star.update()

    screen.fill((20, 22, 40))
    star.draw(screen)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

スプライトと画像のすべてのレッスン

自分で練習してみよう: Pygameプレイグラウンド