קירות משמאל ומימין
חלק מהיחידה עולמות במסלול ה-Pygame של Coddy. שיעור 15 מתוך 35.
הבלוקים מצוירים, אבל השחקן עובר דרכם. קיר חייב לעצור את השחקן. קודם מזיזים, ואז מתקנים את התנועה: אם השחקן חופף עכשיו לקיר, דוחפים אותו החוצה לכיוון שממנו הגיע.
player.x += dx
for wall in walls:
if player.colliderect(wall):
if dx > 0:
player.right = wall.left
elif dx < 0:
player.left = wall.rightdx הוא התנועה הצידה בפריים הזה: ערך חיובי הוא ימינה. בתנועה ימינה, השחקן פגע בצד השמאלי של הקיר, ולכן הקצה הימני שלו מגיע לשם. בתנועה שמאלה, הקצה השמאלי שלו מגיע לצד הימני של הקיר.
המפה מובנית בתוך walls, רשימה של Rects, באותו אופן כמו ב"מפות מטקסט". הרצפה עדיין נמצאת בקו שב־FLOOR, והשחקן עדיין יכול ליפול על החלק העליון של בלוק: בשיעור הבא נלמד לנחות על קירות.
אתגר
בינוני- אחרי
player.x += dx, עבור בלולאה עלwalls. - עבור כל קיר שהשחקן מתנגש בו: כאשר
dx > 0, הגדר אתplayer.right = wall.left; כאשרdx < 0, הגדר אתplayer.left = wall.right.
נסו בעצמכם
import pygame
TILE = 36
SPEED = 4
GRAVITY = 1
JUMP = -15
MAX_FALL = 12
FLOOR = 324
LEVEL = [
"................",
"................",
"................",
"................",
"................",
"................",
"................",
"#..........##..#",
"#.P..#.....##..#",
"################",
]
pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Walls")
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
vel_y = min(vel_y + GRAVITY, MAX_FALL)
player.y += vel_y
on_ground = False
if player.bottom > FLOOR:
player.bottom = FLOOR
vel_y = 0
on_ground = True
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()
כל השיעורים ביחידה עולמות
תרגלו בעצמכם: Pygame אונליין