Menu
CoddyTech

اركض واقفز

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

يتحرك المستكشف الآن، مع كل ما يتعلق بالجاذبية والقفز والتصادم مع المنصات، بهذا الترتيب في كل إطار:

  1. اقرأ مفاتيح الأسهم في dx، وتحرك على طول المحور x، وادفع الشخصية للخروج من الجدران.
  2. أضف الجاذبية حتى MAX_FALL، وتحرك على طول المحور y، واهبط أو اصطدم رأسك، واضبط on_ground.
  3. إذا سقط اللاعب أسفل النافذة، فأعِده إلى start.

تبدأ القفزة عند الضغط على KEYDOWN لمفتاح المسافة أو السهم لأعلى عندما تكون on_ground، ويوقف KEYUP الصعود السريع عند -4 للقفزات القصيرة.

أضف ثوابت السرعة في الأعلى: SPEED = 4، وGRAVITY = 1، وJUMP = -15، وMAX_FALL = 12. بهذه الأرقام يرتفع اللاعب في القفزة نحو 100 بكسل: ما يكفي لصعود درجتين، ولتجاوز حفرة بعرض درجتين.

challenge icon

التحدي

متوسط
  1. أضف الثوابت الأربعة، وقبل الحلقة أضف vel_y = 0 وon_ground = False.
  2. في معالجة الأحداث: اقفز عند الضغط على Space أو Up عندما تكون on_ground؛ وعند تحرير أيٍّ منهما عبر KEYUP، قلّص vel_y إلى -4 عندما تكون قيمته أقل من -4.
  3. في كل إطار: حرّك المحور x وصحّح موضعه، ثم حرّك المحور y وصحّح موضعه كما في Bump Your Head.
  4. عندما يكون player.top > HEIGHT، عيّن player.midbottom = start وvel_y = 0.

جرّب بنفسك

import pygame

TILE = 36
WIDTH, HEIGHT = 576, 360

LEVEL = [
    "................................................................",
    "................................................................",
    "................................................................",
    "................................................................",
    "#..............................................................#",
    "#....................C.........................#####...........#",
    "#......CC...C................CC.....CC.........#####.....CC....#",
    "#....................#.........................D...............#",
    "#.P.........#...E....#...^.......K......E......D.C....^......F.#",
    "#######..####################..##########################..#####",
]

pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Moss Caves")
clock = pygame.time.Clock()


def load(name):
    return pygame.image.load("assets/images/" + name).convert_alpha()


background = pygame.image.load("assets/backgrounds/forest.png").convert_alpha()
grass_img = load("grass.png")
grass_left_img = load("grass_left.png")
grass_right_img = load("grass_right.png")
dirt_img = load("dirt.png")
player_img = load("player.png")


def solid(row, col):
    if row < 0 or row >= len(LEVEL) or col < 0 or col >= len(LEVEL[0]):
        return False
    return LEVEL[row][col] == "#"


walls = []
tiles = []
for row, line in enumerate(LEVEL):
    for col, char in enumerate(line):
        rect = pygame.Rect(col * TILE, row * TILE, TILE, TILE)
        if char == "#":
            if solid(row - 1, col):
                image = dirt_img
            elif not solid(row, col - 1) and solid(row, col + 1):
                image = grass_left_img
            elif solid(row, col - 1) and not solid(row, col + 1):
                image = grass_right_img
            else:
                image = grass_img
            walls.append(rect)
            tiles.append((image, rect))
        elif char == "P":
            start = rect.midbottom

player = player_img.get_rect(midbottom=start)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    for y in range(0, HEIGHT, 72):
        for x in range(0, WIDTH, 72):
            screen.blit(background, (x, y))
    for image, rect in tiles:
        screen.blit(image, rect)
    screen.blit(player_img, player)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

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

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