Koş ve Zıpla
Coddy'nin Pygame Journey'sinin Dünyalar bölümünün bir parçası. Ders 29 / 35.
Artık kâşif, Gravity and Jumping ve Platform Collisions bölümlerindeki her şeyle birlikte, her karede şu sırayla hareket eder:
- Ok tuşlarını
dxiçine oku, x boyunca hareket et ve duvarlardan dışarı it. - Yerçekimini
MAX_FALLdeğerine kadar ekle, y boyunca hareket et, yere in veya başını çarp veon_grounddeğerini ayarla. - Oyuncu pencerenin altına düşerse onu
startkonumuna geri koy.
Zıplama, on_ground doğruyken Space veya Up tuşuna basıldığında (KEYDOWN) başlar; tuş bırakıldığında (KEYUP) kısa zıplamalar için hızlı yükseliş -4 değerinde kesilir.
Hız sabitlerini en üste ekle: SPEED = 4, GRAVITY = 1, JUMP = -15, MAX_FALL = 12. Bu sayılarla zıplama yaklaşık 100 piksel yükselir: iki karoluk bir basamağı aşmaya ve iki karoluk bir çukurun üzerinden atlamaya yeter.
Görev
Orta- Dört sabiti ve döngüden önce
vel_y = 0ileon_ground = Falsedeğerlerini ekle. - Olaylarda:
on_grounddoğruyken Space veya Up tuşuna basıldığında zıpla; her iki tuşun daKEYUPolayındavel_y-4'ün altındaysa değerini -4'e düşür. - Her karede, Bump Your Head'de olduğu gibi önce x yönünde hareket et ve konumu düzelt, ardından y yönünde hareket et ve konumu düzelt.
player.top > HEIGHTolduğundaplayer.midbottom = startvevel_y = 0değerlerini ayarla.
Kendin dene
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()
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 Eksen7Yosunlu Mağaralar
Mağaraları İnşa EtKoş ve Zıpla3Yerç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