اركض واقفز
جزء من قسم العوالم في رحلة Pygame على Coddy. الدرس 29 من 35.
يتحرك المستكشف الآن، مع كل ما يتعلق بالجاذبية والقفز والتصادم مع المنصات، بهذا الترتيب في كل إطار:
- اقرأ مفاتيح الأسهم في
dx، وتحرك على طول المحور x، وادفع الشخصية للخروج من الجدران. - أضف الجاذبية حتى
MAX_FALL، وتحرك على طول المحور y، واهبط أو اصطدم رأسك، واضبطon_ground. - إذا سقط اللاعب أسفل النافذة، فأعِده إلى
start.
تبدأ القفزة عند الضغط على KEYDOWN لمفتاح المسافة أو السهم لأعلى عندما تكون on_ground، ويوقف KEYUP الصعود السريع عند -4 للقفزات القصيرة.
أضف ثوابت السرعة في الأعلى: SPEED = 4، وGRAVITY = 1، وJUMP = -15، وMAX_FALL = 12. بهذه الأرقام يرتفع اللاعب في القفزة نحو 100 بكسل: ما يكفي لصعود درجتين، ولتجاوز حفرة بعرض درجتين.
التحدي
متوسط- أضف الثوابت الأربعة، وقبل الحلقة أضف
vel_y = 0وon_ground = False. - في معالجة الأحداث: اقفز عند الضغط على Space أو Up عندما تكون
on_ground؛ وعند تحرير أيٍّ منهما عبرKEYUP، قلّصvel_yإلى -4 عندما تكون قيمته أقل من -4. - في كل إطار: حرّك المحور x وصحّح موضعه، ثم حرّك المحور y وصحّح موضعه كما في Bump Your Head.
- عندما يكون
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