السقوط خارج المستوى
جزء من قسم العوالم في رحلة Pygame على Coddy. الدرس 18 من 35.
توجد حفرة في الأرض. امشِ إليها، فيسقط اللاعب إلى الأبد ويختفي عن الأنظار. تواصل قيمة y لديه الازدياد، ولا شيء يعيده.
ينتهي المستوى عند أسفل النافذة، عند y = 360. عندما يصبح أعلى اللاعب أسفل هذا الحد، يكون جسمه كله خارج المستوى: أعده إلى نقطة البداية وأوقف السقوط.
if player.top > 360:
player.midbottom = start
vel_y = 0start هي النقطة التي حفظتها حلقة الخريطة للبلاطة P: منتصف أسفل تلك البلاطة، حيث وقف اللاعب للمرة الأولى. لاحقًا، هذا هو الموضع الذي تُفقَد فيه حياة.
التحدي
سهل- بعد التصادمات العمودية، عندما يكون
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()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس العوالم
4التصادم مع المنصات
الجدران من اليسار واليمينالهبوط على المنصاتارتطام الرأسالسقوط خارج المستوىمحور واحد في كل مرةتدرّب بنفسك: Playground لـ Pygame