PyGame Sprite Animation Tutorial – Simple Walk Loop
Hi everyone, I hope you liked the last post about Installation of PyGame. Today we will learn a little more, in this PyGame Sprite Animation Tutorial. So it is clear from the name itself that we are going to draw a character inside the window, and we will make the character walk. I hope you already know about 2d Animation. The basic concept is we draw images in a loop creating an illusion of movement.
With PyGame making sprite animation is super easy. The hard part is creating the sprite but don’t worry I have the sprites for you.
What is Sprite?
In computer graphics any bitmap that is drawn in our game window is called a Sprite. So if you do not like the name “Sprite”, you can consider it the image that you are going to draw in your game.
Designing a Sprite
As I told you this is the hard part, so for designing a sprite you can use any tool available there for example photoshop, illustrator etc. Just google it and you will find a lot of online tools as well.
But don’t worry, for following this tutorial you do not need to design a character, I have a sprite for you, and it is for walking cycle.
I found the above sprite from here: Game Art 2D. You can find some good free game assets from here.
PyGame Sprite Animation
Now let’s learn how we can implement the sprite animation using pygame.
Обработка ввода и анимации¶
Взаимодействие пользователя с компьютером основано на событиях, любые действия производимые пользователем порождают события — движение мыши, нажатия клавиш, специальных кнопок. Внутри библиотеки PyGame есть инструменты для обратки событий, которые происходят внутри приложений.
Мы с вами уже знакомы с методом получения всех произошедших событий — pygame.event.get() , который возвращает события, произошедшие с последнего обращения.
Помимо событий выхода из приложения pygame.QUIT , есть множество других — например, нажатия клавиш pygame.KEYDOWN или отпускания pygame.KEYUP .
Рассмотрим взаимодействие с событиями на примере небольшой программы, в которой по нажатию клавиш показывается квадрат:
В данном блоке программа занимется обработкой нажатия клавиш. Сначала мы получаем список всех событий, после чего начинаем последовательно проверять их. Если одно из событий соответствует сигналу к завершению программы, закрываем окно. Если же это нажатие клавиши — перекрашиваем прямоугольник в белый цвет.
Библиотека Pygame / Часть 2. Работа со спрайтами
Вторая часть серии руководств « Разработка игр с помощью Pygame ». Она предназначена для программистов начального и среднего уровней, которые заинтересованы в создании игр и улучшении собственных навыков кодирования на Python. Начать стоит с урока: « Библиотека Pygame / Часть 1. Введение ».
Что такое спрайт?
Спрайт — это элемент компьютерной графики, представляющий объект на экране, который может двигаться. В двухмерной игре все, что вы видите на экране, является спрайтами. Спрайты можно анимировать, заставлять их взаимодействовать между собой или передавать управление ими игроку.
Для загрузки и отрисовки спрайтов в случай этой игры их нужно добавить в разделы “Обновление” и “Визуализация” игрового цикла. Несложно представить, что если в игре много спрайтов, то цикл довольно быстро станет большим и запутанным. В Pygame для этого есть решение: группировка спрайтов.
Набор спрайтов — это коллекция спрайтов, которые могут отображаться одновременно. Вот как нужно создавать группу спрайтов в игре:
Теперь этой возможностью можно воспользоваться, добавив группу целиком в цикл:
Теперь при создании каждого спрайта, главное убедиться, что он добавлен в группу all_sprites . Такой спрайт будет автоматически отрисован на экране и обновляться в цикле.
Создание спрайта
Можно переходить к созданию первого спрайта. В Pygame все спрайты выступают объектами. Если вы не работали с этим типом данных в Python, то для начала достаточно знать, что это удобный способ группировки данных и кода в единую сущность. Поначалу это может путать, но спрайты Pygame — отличная возможность попрактиковаться в работе с объектами и понять, как они работают.
Начнем с определения нового спрайта:
class сообщает Python, что определяется новый объект, который будет спрайтом игрока. Его тип pygame.sprite.Sprite . Это значит, что он будет основан на заранее определенном в Pygame классе Sprite .
Первое, что нужно в определении class — специальная функция init() , включающая код, который будет запущен при создании нового объекта этого типа. Также у каждого спрайта в Pygame должно быть два свойства: image и rect .
Первая строка, Pygame.sprite.Sprite.__init__(self) требуется в Pygame — она запускает инициализатор встроенных классов Sprite . Далее необходимо определить свойство image . Сейчас просто создадим квадрат размером 50х50 и заполним его зеленым ( GREEN ) цветом. Чуть позже вы узнаете, как сделать image спрайта красивее, используя, например, персонажа или космический корабль, но сейчас достаточно сплошного квадрата.
Дальше необходимо определить rect спрайта. Это сокращенное от rectangle (прямоугольник). Прямоугольники повсеместно используются в Pygame для отслеживания координат объектов. Команда get_rect() оценивает изображение image и высчитывает прямоугольник, способный окружить его.
rect можно использовать для размещения спрайта в любом месте. Начнем с создания спрайта по центру:
Теперь, после определения спрайта игрока Player, нужно отрисовать (создать) его, инициализировав экземпляр (instance) класса Player. Также нужно обязательно добавить спрайт в группу all_sprites .
Сейчас, если запустить программу, по центру окна будет находиться зеленый квадрат. Увеличьте значения WIDTH и HEIGHT в настройках программы, чтобы создать достаточно пространства для движения спрайта в следующем шаге.
Движение спрайта
В игровом цикле есть функция all_sprites.update() . Это значит, что для каждого спрайта в группе Pygame ищет функцию update() и запускает ее. Чтобы спрайт двигался, нужно определить его правила обновления:
Это значит, что при каждом игровом цикле x-координата спрайта будет увеличиваться на 5 пикселей. Запустите программу, чтобы посмотреть, как он скрывается за пределами экрана, достигая правой стороны.
Исправить это можно, заставив спрайт двигаться по кругу — когда он добирается до правой стороны экрана, просто переносить его влево. Это легко сделать, используя элемент управления rect спрайта:
Так, если левая сторона rect пропадает с экрана, просто задаем значение правого края равное 0:
Теперь можно видеть, как спрайт будто бы двигается по кругу.
На этом все. Отправляйтесь изучать и экспериментировать, но не забывайте, что все, что вы помещаете в метод update() , будет происходить в каждом кадре. Попробуйте научить спрайт двигаться сверху вниз (изменив координату y ) или заставить его отталкиваться от стен (изменяя направлении по достижении края).
Pygame moving an object
So I am trying to simply move an object in pygame. I have been looking up tutorials but all I can find is how to make it look like it is snowing, lol. I have been trying to implement that method into moving an object but I am having no luck. All I want to do is move an object across the screen and when it reaches the end of the screen it resets and goes again. So I am trying to move the object that I put in my code (the two polygons, line, and circle) across the screen, horizonally or vertically, doesnt really matter.
4 Answers 4
With your approach, you can’t. The idea behind using pygame is to draw all the objects you want to draw each frame. You must move the drawing inside your while True loop first. Then, since you’re drawing everything each frame, you could:
- create object/variables for storing the position and direction of your object
- check if the object is reaching one border of the screen
- use the new position for drawing your polygon
So at the end, you could have something like that (it’s your task to change to an object)
In order to do what you are trying to do, you will have to have something changing withing the «while True:» loop. Here is an example of a code that will do what you are trying to do:
I will do my best to explain this code as well as possible.
Lines 1-9, you already know.
Line 10 begins with something you probably don’t know about. Surface objects are a type of rectangular picture which can be attached to any other surface, or be drawn on with pygame.draw. Believe it or not, the window is actually a surface.
Line 10 creates a surface, line 11 fills it with black, and line 12 draws a pentagon on it.
Line 13 basically makes all pixels which are colored black transparent.
Lines 14-17, you should now understand.
Line 18 creates a new surface object for the line, but instead of drawing the line on it, it is filled with black and left alone. This is because, if you look at the line in your old program, you can see that it is really just a rectangle and nothing else.
Lines 20-23 you should understand.
Line 24 makes a dictionary of rectangles. Rectangles show the location of a surface object and are necessary in order to draw them onto anything.
Lines 25-28 change the location of the line and the circle. The reason I did this was because I thought you might like it considering that you don’t have the line and the circle in the upper left hand corner in your program.
Lines 29-33 you should understand.
Line 34 starts a for loop which will go through all of the rects.
Line 35 moves the right of each of the rects one pixel to the right.
Line 36 checks to see if the right of the rect has hit the right edge of the window.
Line 37 checks to see if the one that hit the side is the line, and if it is, lines 38-39 move it to the location where you had it.
Line 40 checks to see if the one that hit the side is the circle, and if it is, lines 41-42 move it to the location where you had it.
Lines 43-44 put the rectangle in the top left corner, where the other two shapes started.
Line 45 you should know.
Lines 46-49 use the surface.blit() function. The first argument for this function is a surface, and the second is a rect.
Line 50 doesn’t allow any more than 40 frames to pass in a second.
Line 51 updates the screen.
I really hope this helped, and I would appreciate it if you voted up or accepted my answer, considering how long it took me to write it. If you have any questions, please ask. Thank you!