اهتزاز الشاشة
جزء من قسم الصوت وإحساس اللعب في رحلة 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 بكسلات يترك شريطًا رفيعًا مكشوفًا.
التحدي
متوسطيسقط الضغط على مفتاح المسافة صندوقًا، ويؤدي هبوطه إلى ضبط shake = 12، لكن لا شيء يستخدمه بعد. اجعل العرض يهتز:
- قبل الحلقة، أنشئ
world = pygame.Surface((480, 360)). - ارسم الخلفية والأرض والعمود والصناديق على
worldبدلًا منscreen. - ما دام
shakeأكبر من 0، اختر إزاحة باستخدامamount = shake // 3وrandom.randint(-amount, amount)للمحورين x وy، ثم أنقصshakeبمقدار 1. - املأ الشاشة باللون الأسود، ثم اعرض
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