Her Seferinde Bir Ekran
Coddy'nin Pygame Journey'sinin Dünyalar bölümünün bir parçası. Ders 5 / 35.
Bir seviye pencereden daha geniş olabilir. Bu haritada 32 sütun, yani 16 sütunluk iki pencere vardır. Duvarlar seviyedeki konumlarında kalır: 20. sütundaki bir duvar x = 720 konumundadır; bu da pencerenin sağ kenarı olan 576'yı geçer.
Seviyenin genişliği haritadan gelir: len(LEVEL[0]) * TILE. Oyuncuyu pencerenin içinde değil, seviyenin içinde tut:
level_width = len(LEVEL[0]) * TILE
level = pygame.Rect(0, 0, level_width, 360)
# döngü içinde
player.clamp_ip(level)Seviyenin oyuncunun bulunduğu kısmını göstermek için seviyeyi 576 piksel genişliğinde ekranlara böl. player.centerx // 576 ekran numarasıdır: 0 veya 1. Her şeyi pencere genişliği kadar sola kaydırarak çiz:
offset = player.centerx // 576 * 576
pygame.draw.rect(screen, WALL, wall.move(-offset, 0))wall.move(-offset, 0), sola kaydırılmış Rect'in bir kopyasıdır; duvarın kendisi seviyedeki yerinde kalır. Kenarı geçip yürüdüğünde pencere sonraki ekranı gösterir. Oyuncu hâlâ duvarların içinden geçer: duvarlarda durma konusu Platform Çarpışmaları bölümünde ele alınır.
Görev
Orta- Oyun döngüsünden önce
level_width = len(LEVEL[0]) * TILEvelevel = pygame.Rect(0, 0, level_width, 360)oluştur. - Oyuncuyu
screen.get_rect()yerineleveliçinde tut. - Her karede
offset = player.centerx // 576 * 576değerini ata. - Her duvarı, madeni parayı ve oyuncuyu x ekseninde
-offsetkadar kaydırarak çiz.
Kendin dene
import pygame
TILE = 36
WALL = (120, 90, 60)
COIN = (255, 196, 0)
PLAYER = (80, 200, 120)
LEVEL = [
"################################",
"#..............................#",
"#.C..####...C.........C...###..#",
"#..............#####...........#",
"#....C....##..........##....C..#",
"#..##.....##.C.....C..##.......#",
"#..##..P..........####.....C...#",
"#.C.......###..............##..#",
"#..............................#",
"####..####..########..####..####",
]
pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Map from Text")
clock = pygame.time.Clock()
walls = []
coins = []
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 == "C":
coins.append(pygame.Rect(col * TILE + 10, row * TILE + 10, 16, 16))
elif char == "P":
player = pygame.Rect(col * TILE + 4, row * TILE + 4, 28, 28)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
player.x -= 4
if keys[pygame.K_RIGHT]:
player.x += 4
if keys[pygame.K_UP]:
player.y -= 4
if keys[pygame.K_DOWN]:
player.y += 4
player.clamp_ip(screen.get_rect())
screen.fill((30, 30, 46))
for wall in walls:
pygame.draw.rect(screen, WALL, wall)
for coin in coins:
pygame.draw.rect(screen, COIN, coin)
pygame.draw.rect(screen, PLAYER, player)
pygame.display.flip()
clock.tick(60)
pygame.quit()
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 Ekran3Yerç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