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.
Görev
OrtaBoşluk tuşu kasaları düşürür ve her iniş shake değerine 12 ekler. Bunu azaltalım:
- İnişte
shakedeğerinin 18'i asla aşmamasını sağlayın:shake = min(shake + 12, 18). - Döngüden önce
shake_on = Trueolarak ayarlayın; S tuşu bunu değiştirir. - Yalnızca
shake_ondoğru olduğunda rastgele bir ofset seçin. - Dünyayı blit ettikten sonra ekrana
Shake: OnveyaShake: Offyazı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()
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
4Ekran Sarsıntısı ve Darbe Parlaması
Ekran SarsıntısıDarbe ParlamasıDarbe DurdurmasıAbartıdan Kaçının6Yıldız Devriyesini Geliştir
Yıldız Devriyesi SesleriHer Vuruşta KıvılcımlarKendi başına pratik yap: Pygame playground