Menu
CoddyTech

قفزات قصيرة

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

في معظم ألعاب المنصات، تؤدي الضغطة السريعة إلى قفزة صغيرة، بينما تؤدي الضغطة المطوّلة إلى قفزة كاملة. وهذا يتيح للاعب اختيار ارتفاع كل قفزة.

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

elif event.type == pygame.KEYUP and event.key in (pygame.K_SPACE, pygame.K_UP):
    if vel_y < -4:
        vel_y = -4

لا يرسل المفتاح المضغوط باستمرار حدث KEYUP أثناء الصعود، لذا تصل القفزة إلى أقصى ارتفاع لها. أما الضغطة السريعة فترسل هذا الحدث بعد إطار واحد، فتنخفض السرعة إلى -4، ثم تجعل الجاذبية اللاعب ينعكس اتجاهه بعد بضعة إطارات.

الشرط vel_y < -4 مهم. بالقرب من القمة أو أثناء السقوط، تكون قيمة vel_y أكبر من -4، وسيؤدي ضبطها على -4 في هذه الحالة إلى دفع اللاعب إلى الأعلى مجددًا.

challenge icon

التحدي

سهل
  1. عند رفع مفتاح المسافة أو السهم لأعلى، عندما تكون vel_y أقل من -4، عيّن vel_y = -4.
  2. اترك قفزة KEYDOWN كما هي.

جرّب بنفسك

import pygame

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

pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Short Hops")
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

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

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

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

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