Menu
CoddyTech

الظهور عند الالتقاط

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

عندما تجمع جوهرة، تزداد النقاط بمقدار واحد، لكن عينك تكون على الجوهرة، لا على الزاوية. تجذب النبضة القصيرة العين إلى العداد: تقفز الأيقونة إلى حجم أكبر، ثم تتقلص عائدةً إلى حجمها.

احتفظ بمقياس، بقيمة 1.0 للحجم الطبيعي. عند التقاط جوهرة، اضبطه على 1.6؛ وفي كل إطار، أعده تدريجيًا نحو 1 باستخدام السطر نفسه كما من قبل:

pop = 1.6         # عند جمع جوهرة

pop += (1 - pop) * 0.2    # في كل إطار

عند الرسم، يحدد المقياس الحجم. أنشئ Rect بذلك الحجم، ثم ضع مركزه في موضعه، لكي تكبر الأيقونة حول منتصفها بدلًا من الزاوية:

size = int(20 * pop)
icon = pygame.Rect(0, 0, size, size)
icon.center = (30, 30)

تكون القفزة فورية، أما العودة فتكون تدريجية. وهذا ما يجعلها تبدو كنبضة: إذ يعيدها جزء مقداره 0.2 إلى حجمها خلال نحو ربع ثانية.

بالنسبة إلى صورة، غيّر حجمها باستخدام pygame.transform.scale_by(image, pop)، وضع مركز Rect الخاص بها بالطريقة نفسها.

challenge icon

التحدي

سهل

انقر على الجوهرة البنفسجية لجمعها. اجعل الأيقونة الذهبية تنبثق:

  1. اجعل pop = 1.0 قبل الحلقة.
  2. عيّن pop = 1.6 عند جمع جوهرة.
  3. في كل إطار، أعدها تدريجيًا إلى وضعها الأصلي: pop += (1 - pop) * 0.2.
  4. ارسم الأيقونة بعرض وارتفاع int(20 * pop) بكسل، مع إبقائها متمركزة عند (30, 30).

جرّب بنفسك

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Gem Picker")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

coin_sound = pygame.mixer.Sound("assets/sounds/coin.ogg")
gem = pygame.Rect(300, 200, 24, 24)
score = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN and gem.collidepoint(event.pos):
            score += 1
            coin_sound.play()
            gem.topleft = (random.randint(80, 420), random.randint(90, 300))

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (170, 90, 230), gem)
    icon = pygame.Rect(0, 0, 20, 20)
    icon.center = (30, 30)
    pygame.draw.rect(screen, (255, 200, 60), icon)
    label = font.render(f"x {score}", True, (240, 240, 240))
    screen.blit(label, (52, 20))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

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

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