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のように付けない名前は、メソッド内の通常のローカル変数です。メソッドが終了すると、その変数は消えます。
チャレンジ
簡単__init__に3つ目のパラメーターspeedを追加し、self.speedとして保存します。starを2つの星に置き換えます:slow = Star(200, 0, 1)とfast = Star(440, 0, 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プレイグラウンド