اجعله خفيفًا
جزء من قسم الصوت وإحساس اللعب في رحلة 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))ارسم التسمية بعد رسم العالم على الشاشة، مباشرةً. ينبغي أن يظل النص الذي يشكل جزءاً من الواجهة ثابتاً بينما يهتز العالم.
التحدي
متوسطيُسقط مفتاح المسافة الصناديق، وتضيف كل عملية هبوط 12 إلى shake. خفّف الاهتزاز:
- غيّر الهبوط بحيث لا تتجاوز قيمة
shakeأبدًا 18:shake = min(shake + 12, 18). - اجعل قيمة
shake_on = Trueقبل الحلقة؛ يبدّل المفتاح S قيمتها. - اختر إزاحة عشوائية فقط عندما تكون قيمة
shake_onصحيحة. - بعد رسم العالم، اعرض
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()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الصوت وإحساس اللعب
تدرّب بنفسك: Playground لـ Pygame