Platformlara İniş
Coddy'nin Pygame Journey'sinin Dünyalar bölümünün bir parçası. Ders 16 / 35.
Şimdi duvarların oyuncuyu desteklemesini sağlayın. Yana doğru hareket düzeltildikten sonra, y boyunca hareket edin ve bu hareketi de aynı şekilde düzeltin: oyuncu düşerken bir duvarla çakışırsa ayaklarını duvarın üstüne getirin.
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
vel_y = 0
on_ground = Trueon_ground her karede False olarak başlar ve yalnızca yere iniş onu True yapar. Bir çıkıntıdan yürüyerek ayrılın; sonraki karede oyuncunun altında hiçbir şey bulunmaz, bu yüzden oyuncu düşer ve havadayken zıplayamaz.
Bu, FLOOR satırının yerini alır: haritanın en alt satırı da diğer duvarlar gibi zemindir. Yerçekimi oyuncuyu her karede zeminin 1 piksel içine çeker ve yere iniş denetimi onu tekrar yukarı kaldırır; böylece oyuncu olduğu yerde durur.
Görev
OrtaFLOORsatır testini kaldır.player.y += vel_ysatırından sonraon_ground = Falsedeğerini ata, ardındanwallsüzerinde döngü kur.vel_y > 0iken oyuncunun çarpıştığı her duvar için:player.bottom = wall.top,vel_y = 0,on_ground = True.
Kendin dene
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("Landing")
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
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()
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Dünyalar bölümündeki tüm dersler
1Metinden Haritalar
Metinde Bir SeviyeSatırlar ve SütunlarAnlam Taşıyan HarflerOyuncunun Başladığı YerHer Seferinde Bir Ekran4Platform Çarpışmaları
Sağ ve Sol DuvarlarPlatformlara İnişBaşını ÇarpSeviyenin Dışına DüşmekHer Seferinde Tek Eksen3Yerçekimi ve Zıplama
Yerçekimiyle DüşmeYerden ZıplamaKısa SıçrayışlarEn Yüksek Düşme HızıZıplama Tamponu6Devriye Gezen Düşmanlar
Devriye Gezen Bir BlobÜzerine Bas ya da Darbe AlYürüme DöngüsüHaritadaki DüşmanlarKendi başına pratik yap: Pygame playground