Menu
CoddyTech

Koşma Animasyonu

Coddy'nin Pygame Journey'sinin Oyun Kuralları bölümünün bir parçası. Ders 25 / 29.

Koşucu süzülür. Dosya paketinde aynı kahramanın bacakları açık ikinci bir resmi olan player_walk.png bulunur. İki resim arasında geçiş yapmak, koşuyormuş gibi görünmesini sağlar.

İkisini de bir listede tut ve kareleri say. self.step // 8 her 8 karede 1 artar ve % 2 bunu 0, 1, 0, 1 dizisine dönüştürür:

if self.rect.bottom == GROUND_Y:
    self.step += 1
    self.image = self.frames[self.step // 8 % 2]
else:
    self.image = self.frames[1]

Saniyede 60 kare hızında, her resim için 8 kare saniyede yaklaşık yedi adım demektir. Daha az kare koşuyu hızlandırır, daha fazlası yavaşlatır.

Havada koşulacak bir zemin olmadığından, koşucu yere inene kadar tek bir resmi gösterir. Her iki resmi de __init__ içinde bir kez yükle ve self.image'in gösterdiği resmi değiştir: grup veya blit, self.image'in gösterdiği resmi çizer.

challenge icon

Görev

Orta
  1. player.png ve player_walk.png dosyalarını self.frames listesine yükle; başlangıçta self.image ilk öğe olsun ve self.step = 0 olarak ayarlansın.
  2. update() içinde, yerdeyken bir adım say ve self.frames[self.step // 8 % 2] öğesini göster.
  3. Havadayken self.frames[1] öğesini göster.

Kendin dene

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 320))
pygame.display.set_caption("Sky Runner")
clock = pygame.time.Clock()

SKY = (140, 200, 240)
GROUND = (90, 160, 80)
GROUND_Y = 260
GRAVITY = 1


class Runner(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("assets/images/player.png").convert_alpha()
        self.rect = self.image.get_rect(midbottom=(100, GROUND_Y))
        self.vy = 0

    def jump(self):
        if self.rect.bottom == GROUND_Y:
            self.vy = -16

    def update(self):
        self.vy += GRAVITY
        self.rect.y += self.vy
        if self.rect.bottom >= GROUND_Y:
            self.rect.bottom = GROUND_Y
            self.vy = 0


runner = Runner()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
            runner.jump()

    runner.update()

    screen.fill(SKY)
    pygame.draw.rect(screen, GROUND, (0, GROUND_Y, 640, 60))
    screen.blit(runner.image, runner.rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Oyun Kuralları bölümündeki tüm dersler

Kendi başına pratik yap: Pygame playground