Pygame tutorial 1 – part 4 – More on movement and animations

This time we want to give a better movement to the sprite, not having to click every time to make it do a little step forward, but with something that seems more continuos and we do not want it to idle when it moves, but only when it stands, while he must walk when he walks. 2 different animation then (3 if you count the flipped one).

So, in brief:

  • Continuous movement ’til you press the key
  • animation for the idle position lookin to the right or to the left depending on the previous direction
  • animation when he walks

The video

The code

You find everything on github.

import pygame
from glob import glob
import sys


pygame.init()
screen = pygame.display.set_mode((400, 600))


class Cat:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.list = [
            pygame.image.load(f).convert_alpha() for f in glob("cat/Walk*.png")[1:]
        ]
        self.list_idle = [pygame.image.load(f).convert_alpha() for f in glob("cat/Idle*.png")[1:]]
        self.counter = 0
        self.image = self.list[0]
        self.dir = ""
        self.prov = ""

    def update(self):
        self.counter += .1
        if self.counter >= len(self.list):
            self.counter = 0
        if self.dir == "right":
            self.image = self.list[int(self.counter)]
            self.prov = self.dir
        if self.dir == "left":
            self.image = pygame.transform.flip(self.list[int(self.counter)], True, False)
            self.prov = self.dir
        if self.dir == "":
            if self.counter >= len(self.list_idle):
                self.counter = 0
            if self.prov == "right":
                self.image = self.list_idle[int(self.counter)]
            else:
                self.image = pygame.transform.flip(self.list_idle[int(self.counter)], True, False)

        screen.blit(self.image, (self.x, self.y))

cat = Cat(100, 100)
clock = pygame.time.Clock()

while True:
    screen.fill((128, 255, 128))

    if cat.dir != "":
        if cat.dir == "right":
            cat.x += 1
        if cat.dir == "left":
            cat.x -= 1
        if cat.dir == "up":
            cat.y -= 1
        if cat.dir == "down":
            cat.y += 1

    if pygame.event.get(pygame.QUIT):
        break
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                pygame.quit()
            if event.key == pygame.K_RIGHT:
                cat.dir = "right"
            if event.key == pygame.K_LEFT:
                cat.dir = "left"
            if event.key == pygame.K_UP:
                cat.dir = "up"
            if event.key == pygame.K_DOWN:
                cat.dir = "down"
        if event.type == pygame.KEYUP:
            cat.dir = ""


    cat.update()

    pygame.display.update()
    clock.tick(180)

pygame.quit()


Subscribe to the newsletter for updates
Tkinter templates
Avatar My youtube channel

Twitter: @pythonprogrammi - python_pygame

Videos

Speech recognition game

Pygame's Platform Game

Other Pygame's posts

Published by pythonprogramming

Started with basic on the spectrum, loved javascript in the 90ies and python in the 2000, now I am back with python, still making some javascript stuff when needed.