Menu
CoddyTech

控えめにする

CoddyのPygameジャーニー「サウンドとゲームの手応え」セクションの一部。レッスン 15/23。

ゲームの手触りは味付けです。少し揺らすと着地に重みが出ますが、揺らしすぎるとゲームが見づらくなり、気分が悪くなることもあります。これを抑えるには、2つの習慣が役立ちます。

上限を設ける。効果が重なると、際限なく大きくなることがあります。ここでは着地するたびにshakeに12が加算されます。4つの木箱が同時に着地すると値は40を超え、画面が13ピクセル跳ねます。min()で上限を設けます。

shake = min(shake + 12, 18)

これで、木箱が続けて着地すると揺れは長く続きますが、動く幅は18 // 3、つまり6ピクセルを超えません。

プレイヤーが揺れをオフにできるようにする。画面が動く状態ではプレイできない人もいます。設定を追加するのに必要なのは変数1つです。

shake_on = True
...
if shake_on:
    offset = (random.randint(-amount, amount), random.randint(-amount, amount))

ワールドを描画した後、画面に直接ラベルを描画します。インターフェースの一部であるテキストは、ワールドが揺れている間も静止させておきましょう。

challenge icon

チャレンジ

中級

スペースキーで木箱を落とし、着地するたびにshakeが12増えます。揺れを抑えましょう。

  1. 着地時にshakeが18を超えないようにします。shake = min(shake + 12, 18)。
  2. ループの前にshake_on = Trueを設定します。Sキーで切り替えます。
  3. shake_onがtrueの場合にのみ、ランダムなオフセットを選びます。
  4. worldをblitした後、画面の(10, 10)にShake: OnまたはShake: Offを描画します。

自分で試してみよう

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Crate Drop")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 28)

thud_sound = pygame.mixer.Sound("assets/sounds/thud.ogg")
falling = []
landed = []
shake = 0
world = pygame.Surface((480, 360))

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            falling.append(pygame.Rect(random.randint(140, 400), -40, 40, 40))

    for crate in falling:
        crate.y += 8
        if crate.bottom >= 300:
            crate.bottom = 300
            landed.append(crate)
            thud_sound.play()
            shake += 12
    falling = [crate for crate in falling if crate.bottom < 300]

    world.fill((30, 30, 46))
    pygame.draw.rect(world, (80, 80, 100), (0, 300, 480, 60))
    pygame.draw.rect(world, (80, 160, 255), (60, 220, 30, 80))
    for crate in falling + landed:
        pygame.draw.rect(world, (170, 110, 60), crate)

    offset = (0, 0)
    if shake > 0:
        amount = shake // 3
        offset = (random.randint(-amount, amount), random.randint(-amount, amount))
        shake -= 1
    screen.fill((0, 0, 0))
    screen.blit(world, offset)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

サウンドとゲームの手応えのすべてのレッスン

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