Menu
CoddyTech

اهتزاز الشاشة

جزء من قسم الصوت وإحساس اللعب في رحلة Pygame على Coddy. الدرس 12 من 23.

يصطدم صندوق ثقيل بالأرض، فتهتزّ الصورة كلها للحظة. هذا هو اهتزاز الشاشة: لعدة إطارات، يُرسَم كل شيء على بُعد بضعة بكسلات، بطريقة مختلفة في كل إطار.

لتحريك كل شيء دفعة واحدة، ارسم العالم على Surface خاص به بدلًا من الشاشة، ثم ارسم ذلك الـSurface على الشاشة مع إزاحة:

world = pygame.Surface((480, 360))

في الحلقة، استبدل screen بـ world في استدعاءات الرسم. ثم اختر الإزاحة:

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)

يمثل shake عدد الإطارات المتبقية للاهتزاز. عند الهبوط، اجعله 12. وبما أن amount يساوي shake // 3، فإن الإطارات الأولى تحرّك الصورة حتى 4 بكسلات، ثم 3، و2، و1، ثم لا شيء: فيخفّ الاهتزاز تدريجيًا بدلًا من أن يتوقف فجأة. املأ الشاشة بالأسود أولًا، لأن تحريك العالم 4 بكسلات يترك شريطًا رفيعًا مكشوفًا.

challenge icon

التحدي

متوسط

يسقط الضغط على مفتاح المسافة صندوقًا، ويؤدي هبوطه إلى ضبط shake = 12، لكن لا شيء يستخدمه بعد. اجعل العرض يهتز:

  1. قبل الحلقة، أنشئ world = pygame.Surface((480, 360)).
  2. ارسم الخلفية والأرض والعمود والصناديق على world بدلًا من screen.
  3. ما دام shake أكبر من 0، اختر إزاحة باستخدام amount = shake // 3 وrandom.randint(-amount, amount) للمحورين x وy، ثم أنقص shake بمقدار 1.
  4. املأ الشاشة باللون الأسود، ثم اعرض world عند الإزاحة.

جرّب بنفسك

import random
import pygame

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

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

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]

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

pygame.quit()

جميع دروس الصوت وإحساس اللعب

تدرّب بنفسك: Playground لـ Pygame