Menu
CoddyTech

أقصى سرعة للسقوط

جزء من قسم العوالم في رحلة Pygame على Coddy. الدرس 13 من 35.

تستمر الجاذبية في زيادة سرعة السقوط. إذا سقط اللاعب من ارتفاع كافٍ، فإنه يتحرك 30 أو 40 بكسلًا في إطار واحد. يبلغ ارتفاع البلاطة 36 بكسلًا، لذا يمكن للاعب بهذه السرعة أن يمر مباشرة عبر منصة بين إطارين، من دون أن يتداخل معها مطلقًا.

للسقوط الحقيقي سرعة قصوى أيضًا. حدّد السرعة باستخدام min:

MAX_FALL = 12
# داخل الحلقة
vel_y = min(vel_y + GRAVITY, MAX_FALL)

تعطي min الأصغر من العددين، لذا تزداد السرعة بمقدار 1 في كل إطار حتى تصل إلى 12، ثم تبقى عندها. تبدأ القفزة عند -15، أي أقل من الحد الأقصى، لذا لا تتغير القفزات.

اثنا عشر يساوي ثلث ارتفاع البلاطة: أيًّا كان ما يسقط اللاعب عليه، سيتداخل معه في أحد الإطارات، ويمكن لاختبار الهبوط اكتشاف ذلك.

challenge icon

التحدي

سهل
  1. أضف MAX_FALL = 12 في الأعلى.
  2. استبدل vel_y += GRAVITY بـ vel_y = min(vel_y + GRAVITY, MAX_FALL).

تبدأ الشخصية في الهواء، لذا يمكنك رؤيتها وهي تصل إلى السرعة القصوى.

جرّب بنفسك

import pygame

TILE = 36
FLOOR = 324
GRAVITY = 1
JUMP = -15

pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Falling Speed")
clock = pygame.time.Clock()

background = pygame.image.load("assets/backgrounds/clouds.png").convert_alpha()
grass_img = pygame.image.load("assets/images/grass.png").convert_alpha()
player_img = pygame.image.load("assets/images/player.png").convert_alpha()

player = player_img.get_rect(topleft=(264, 40))
vel_y = 0
on_ground = False

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 in (pygame.K_SPACE, pygame.K_UP):
            if on_ground:
                vel_y = JUMP
        elif event.type == pygame.KEYUP and event.key in (pygame.K_SPACE, pygame.K_UP):
            if vel_y < -4:
                vel_y = -4

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player.x -= 4
    if keys[pygame.K_RIGHT]:
        player.x += 4

    vel_y += GRAVITY
    player.y += vel_y
    on_ground = False
    if player.bottom > FLOOR:
        player.bottom = FLOOR
        vel_y = 0
        on_ground = True

    for y in range(0, 360, 72):
        for x in range(0, 576, 72):
            screen.blit(background, (x, y))
    for x in range(0, 576, TILE):
        screen.blit(grass_img, (x, FLOOR))
    screen.blit(player_img, player)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

جميع دروس العوالم

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