Menu
CoddyTech

Abartıdan Kaçının

Coddy'nin Pygame Journey'sinin Ses ve Oyun Hissi bölümünün bir parçası. Ders 15 / 23.

Oyun hissi baharat gibidir. Biraz sallantı inişi ağır hissettirir; fazlası oyunu anlamayı zorlaştırır ve oyuncuların kendini kötü hissetmesine neden olabilir. İki alışkanlık bunu kontrol altında tutar.

Sınır koy. Efektler üst üste eklendiğinde sınırsızca artabilir. Burada her iniş shake değerine 12 ekler; aynı anda inen dört kasa bu değeri 40'ın üzerine çıkarır ve görüntü 13 piksel sıçrar. min() bir üst sınır koyar:

shake = min(shake + 12, 18)

Artık kasalar inmeye devam ettikçe sallantı daha uzun sürer, ancak görüntü 18 // 3, yani 6 pikselden fazla hareket etmez.

Oyuncuların kapatmasına izin ver. Bazı insanlar ekran hareket ederken oynayamaz. Bir ayar yalnızca bir değişkene mal olur:

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

Dünyayı blit ettikten sonra etiketi doğrudan ekrana çiz. Arayüzün parçası olan metin, dünya sallanırken sabit kalmalıdır.

challenge icon

Görev

Orta

Boşluk tuşu kasaları düşürür ve her iniş shake değerine 12 ekler. Bunu azaltalım:

  1. İnişte shake değerinin 18'i asla aşmamasını sağlayın: shake = min(shake + 12, 18).
  2. Döngüden önce shake_on = True olarak ayarlayın; S tuşu bunu değiştirir.
  3. Yalnızca shake_on doğru olduğunda rastgele bir ofset seçin.
  4. Dünyayı blit ettikten sonra ekrana Shake: On veya Shake: Off yazısını (10, 10) konumunda çizin.

Kendin dene

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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Ses ve Oyun Hissi bölümündeki tüm dersler

Kendi başına pratik yap: Pygame playground