Menu
CoddyTech

أبقِ الكاميرا داخل الحدود

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

تُظهر الكاميرا التي تُبقي اللاعب في المنتصف دائمًا السماءَ إلى يسار المستوى عند البداية، والأمر نفسه بعد نهايته. أبقِها بين حافتي المستوى.

أصغر قيمة للكاميرا هي 0: تبدأ النافذة عند الحافة اليسرى للمستوى. وأكبر قيمة هي level_width - WIDTH: تكون الحافة اليمنى للنافذة عند الحافة اليمنى للمستوى. قيِّد القيمة بعد التتبّع:

camera_x = player.centerx - WIDTH // 2
camera_x = max(0, min(camera_x, level_width - WIDTH))

تُقلِّل min قيمة الكاميرا إذا تجاوزت الحد إلى اليمين؛ وتزيد max قيمتها إذا تجاوزت الحد إلى اليسار. في منتصف المستوى، لا يغيّر أيٌّ منهما شيئًا، وتتابع الكاميرا اللاعب كما في السابق. بالقرب من النهايتين، تتوقف الكاميرا ويتجه اللاعب نحو حافة النافذة، وهذا هو سلوك معظم ألعاب التمرير الجانبي.

challenge icon

التحدي

سهل
  1. بعد camera_x = player.centerx - WIDTH // 2، احصر قيمته ضمن الحدود: camera_x = max(0, min(camera_x, level_width - WIDTH)).

جرّب بنفسك

import pygame

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

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

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

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)

level_width = len(LEVEL[0]) * TILE
player = player_img.get_rect(midbottom=start)
vel_y = 0
on_ground = False
camera_x = 0

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

    camera_x = player.centerx - WIDTH // 2

    screen.fill((140, 200, 240))
    for wall in walls:
        screen.blit(block_img, (wall.x - camera_x, wall.y))
    screen.blit(player_img, (player.x - camera_x, player.y))
    pygame.display.flip()
    clock.tick(60)

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

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

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

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