Menu
CoddyTech

اجعله خفيفًا

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

إحساس اللعبة مثل التوابل. هزّة صغيرة تجعل الهبوط يبدو ثقيلاً؛ أما الهزّة الكبيرة فتجعل اللعبة صعبة المتابعة وقد تُشعر اللاعبين بالدوار. هناك عادتان تساعدان على إبقاء الأمر تحت السيطرة.

ضع حدّاً لها. عندما تتراكم التأثيرات، قد تزداد بلا نهاية. هنا، يضيف كل هبوط 12 إلى shake؛ وتهبط أربعة صناديق معاً فترفعه إلى أكثر من 40، وتقفز الشاشة 13 بكسلاً. تضع min() حداً أقصى لها:

shake = min(shake + 12, 18)

الآن، تستمر الهزّة مدة أطول إذا واصلت الصناديق الهبوط، لكنها لا تتحرك أبداً أكثر من 18 // 3، أي 6 بكسلات.

أتِح للاعبين إيقافها. لا يستطيع بعض الأشخاص اللعب والشاشة تتحرك. ولا يتطلب هذا الإعداد سوى متغير واحد:

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

ارسم التسمية بعد رسم العالم على الشاشة، مباشرةً. ينبغي أن يظل النص الذي يشكل جزءاً من الواجهة ثابتاً بينما يهتز العالم.

challenge icon

التحدي

متوسط

يُسقط مفتاح المسافة الصناديق، وتضيف كل عملية هبوط 12 إلى shake. خفّف الاهتزاز:

  1. غيّر الهبوط بحيث لا تتجاوز قيمة shake أبدًا 18: shake = min(shake + 12, 18).
  2. اجعل قيمة shake_on = True قبل الحلقة؛ يبدّل المفتاح S قيمتها.
  3. اختر إزاحة عشوائية فقط عندما تكون قيمة shake_on صحيحة.
  4. بعد رسم العالم، اعرض Shake: On أو Shake: Off على الشاشة عند (10, 10).

جرّب بنفسك

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اختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

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

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