Menu
CoddyTech

السقوط خارج المستوى

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

توجد حفرة في الأرض. امشِ إليها، فيسقط اللاعب إلى الأبد ويختفي عن الأنظار. تواصل قيمة y لديه الازدياد، ولا شيء يعيده.

ينتهي المستوى عند أسفل النافذة، عند y = 360. عندما يصبح أعلى اللاعب أسفل هذا الحد، يكون جسمه كله خارج المستوى: أعده إلى نقطة البداية وأوقف السقوط.

if player.top > 360:
    player.midbottom = start
    vel_y = 0

start هي النقطة التي حفظتها حلقة الخريطة للبلاطة P: منتصف أسفل تلك البلاطة، حيث وقف اللاعب للمرة الأولى. لاحقًا، هذا هو الموضع الذي تُفقَد فيه حياة.

challenge icon

التحدي

سهل
  1. بعد التصادمات العمودية، عندما يكون player.top > 360، اضبط player.midbottom = start وvel_y = 0.

جرّب بنفسك

import pygame

TILE = 36
SPEED = 4
GRAVITY = 1
JUMP = -15
MAX_FALL = 12

LEVEL = [
    "................",
    "................",
    "................",
    "................",
    "................",
    "................",
    "..........###...",
    "................",
    "#.P.............",
    "#######....#####",
]

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

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

walls = []
for row, line in enumerate(LEVEL):
    for col, char in enumerate(line):
        if char == "#":
            walls.append(pygame.Rect(col * TILE, row * TILE, TILE, TILE))
        elif char == "P":
            start = (col * TILE + TILE // 2, row * TILE + TILE)

player = player_img.get_rect(midbottom=start)
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()
    dx = 0
    if keys[pygame.K_LEFT]:
        dx -= SPEED
    if keys[pygame.K_RIGHT]:
        dx += SPEED

    player.x += dx
    for wall in walls:
        if player.colliderect(wall):
            if dx > 0:
                player.right = wall.left
            elif dx < 0:
                player.left = wall.right

    vel_y = min(vel_y + GRAVITY, MAX_FALL)
    player.y += vel_y
    on_ground = False
    for wall in walls:
        if player.colliderect(wall):
            if vel_y > 0:
                player.bottom = wall.top
                on_ground = True
            elif vel_y < 0:
                player.top = wall.bottom
            vel_y = 0

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

pygame.quit()
quiz iconاختبر نفسك

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

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

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