Доброго времени суток.
Это моя работа по предмету Технологии программирования Python.
Специальность: 10.05.05
Кафедра: КБ-4
Курс: 2
Семестр: 4, весна
Полный текст курсовой работы уже переделан под статью и представлен ниже без формального оформления. Курсовая простая, можете использовать для своих целей с небольшими доработками.
—
Введение
Высокоуровневый язык программирования — язык программирования, разработанный для быстроты и удобства использования программистом. Основная черта подобных языков — абстракция, то есть введение смысловых конструкций, которые кратко описывают такие структуры и операции над ними, описания которых на любом низкоуровневом языке программирования будут длинны и сложны для понимания.
Python — высокоуровневый язык программирования общего назначения. Язык ориентирован на повышение производительности разработчика и читаемости кода, путем некого «упрощения» процесса программирования.
Цель данного исследования написать программу, способную реализовать анимацию объекта в условном окне. Объектом для нас будет являться некий «человечек», нарисованный в очень простом стиле.
Задачи данной курсовой:
- Определить необходимый вспомогательный материал
- Углубится в технологию программирования на Python
- Научиться работать с графикой на «стороне» языка программирования
Вводная информация
Библиотеки Pygame
Набор модулей языка программирования Python, предназначенный для написания мультимедиа-приложений и компьютерных игр, в том числе и все вышеперечисленное на Android. Считается. что Pygame можно называть фреймворком. Хотя и понятия «библиотека» и «фреймворк» разные, но когда дело касается классификации конкретного инструмента, все неоднозначно.
Пути реализации
В процессе выполнения курсовой работы в разработке находилось два варианта реализации задания.
«Автоматический» путь реализации
Изначальная реализация, то есть, первый метод отрисовки анимации подразумевал как посменную смену кадров, как того требовало задание, так и высчитывание координат точек, от которых зависит положение конечностей объекта отрисовки. «Автоматическим» этот способ был назван именно благодаря этому методу. Таким способом мы избегаем ручной отрисовки промежуточных кадров.
В качестве вспомогательной библиотеки использовалась «graphics.py». Которая, наряду с «matplotlib» библиотекой, в основном используется для отрисовки простых объектов и/или графиков. Во всяком случае, подобные объекты действительно просто реализовать с помощью вышеописанных библиотек. От данного метода пришлось отказаться, ввиду больших временных затрат на его реализацию. Высчитывание каждой окончательной точки (точки, на которой анимация должна пойти в обратную сторону) не привели к качественному «живому» результату.
«Стандартный» путь реализации
После отказа от предыдущего варианта реализации, было решено выполнить работу по простой логике посменной смены кадров и не тратить процессорное время на высчитывание координат. Для работы, по совету научного руководителя, была выбрана библиотека «Pygame».
Обучение всем необходимым функциям и методам заняло не более трех часов, также были сформированы условия плавной картинки. И для реализации были приняты следующие параметры: не более 6 кадров в одной анимации, 30 кадров в секунду в процессе отрисовки.
Перед тем как начать работу по коду, необходимо вручную отрисовать кадры анимации, которые в процессе работы будут давать подходящую картинку. В конечном итоге были отрисованы:
- 3 кадра на шаг объекта вправо
- 3 кадра на шаг объекта влево
- 3 кадра на бег объекта вправо
- 3 кадра на бег объекта влево
- 3 кадра на приседания объекта
- 5 кадров на то, чтобы объект достал флажок
- 3 кадра на сигнализацию объекта флажком
Также был отрисован начальный кадр, то есть кадр, где объект находится в состоянии покоя.
Фреймворк — программная платформа, облегчающее разработку и объединение разных компонентов большого программного проекта.
Графика
Окно для отрисовки будет занимать 500×500 пикселей. Определяем его с помощью 3 строки в коде.
Нашим объектом будет «человечек» в максимально простой рисовке. Все кадры анимации персонажа отрисованы с помощью графического редактора.
Скачать исходные изображения (спрайты):
PY3CW_anim.zip (91.2 КБ)
import pygame
win = pygame.display.set_mode((500, 500))
pygame.display.set_caption('TRNGN // PY3CW / PG_1 / 3+1 framed')
runRight = [pygame.image.load('anim/r_f1.png'), pygame.image.load('anim/r_f2.png'),
pygame.image.load('anim/r_f3.png')]
runLeft = [pygame.image.load('anim/l_f1.png'), pygame.image.load('anim/l_f2.png'),
pygame.image.load('anim/l_f3.png')]
walkRight = [pygame.image.load('anim/rw_f1.png'), pygame.image.load('anim/rw_f2.png'),
pygame.image.load('anim/rw_f3.png')]
walkLeft = [pygame.image.load('anim/lw_f1.png'), pygame.image.load('anim/lw_f2.png'),
pygame.image.load('anim/lw_f3.png')]
sitDown = [pygame.image.load('anim/s_f1.png'), pygame.image.load('anim/s_f2.png'),
pygame.image.load('anim/s_f3.png')]
flagSignal = [pygame.image.load('anim/fl_0.png'), pygame.image.load('anim/fl_1.png'),
pygame.image.load('anim/fl_2.png'), pygame.image.load('anim/fl_3.png'),
pygame.image.load('anim/fl_4.png')]
flagSignalM = [pygame.image.load('anim/sfl_0.png'), pygame.image.load('anim/sfl_1.png'),
pygame.image.load('anim/sfl_2.png')]
pIdle = pygame.image.load('anim/f0.png')
bg = pygame.image.load('anim/bg.jpg')
clock = pygame.time.Clock()
x = 50
y = 200
width = 80
height = 100
speed = 2
leftWalk = False
rightWalk = False
leftRun = False
rightRun = False
down = False
flag = False
idle = True
animCount = 0
flagCount = 0
def drawWindow():
global animCount
global flagCount
win.blit(bg, (0, 0))
if animCount + 1 >= 15:
animCount = 0
if leftRun:
win.blit(runLeft[animCount // 5], (x, y))
animCount += 1
elif rightRun:
win.blit(runRight[animCount // 5], (x, y))
animCount += 1
if leftWalk:
win.blit(walkLeft[animCount // 5], (x, y))
animCount += 1
elif rightWalk:
win.blit(walkRight[animCount // 5], (x, y))
animCount += 1
elif down:
win.blit(sitDown[animCount // 5], (x, y))
animCount += 1
elif flag:
if flagCount == 15:
win.blit(flagSignalM[animCount // 5], (x, y))
animCount += 1
else:
win.blit(flagSignal[animCount // 3], (x, y))
flagCount += 1
animCount += 1
elif idle:
win.blit(pIdle, (x, y))
pygame.display.update()
run = True
while run:
clock.tick(30)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
if keys[pygame.K_a] and keys[pygame.K_LSHIFT] and x > 5:
x -= speed + 3
leftWalk = False
rightWalk = False
leftRun = True
rightRun = False
down = False
flag = False
idle = False
elif keys[pygame.K_d] and keys[pygame.K_LSHIFT] and x < 500 - width - 5:
x += speed + 3
leftWalk = False
rightWalk = False
leftRun = False
rightRun = True
down = False
flag = False
idle = False
elif keys[pygame.K_a] and x > 5:
x -= speed
leftWalk = True
rightWalk = False
leftRun = False
rightRun = False
down = False
flag = False
idle = False
elif keys[pygame.K_d] and x < 500 - width - 5:
x += speed
leftWalk = False
rightWalk = True
leftRun = False
rightRun = False
down = False
flag = False
idle = False
elif keys[pygame.K_s]:
leftWalk = False
rightWalk = False
leftRun = False
rightRun = False
down = True
flag = False
idle = False
elif keys[pygame.K_f]:
leftWalk = False
rightWalk = False
leftRun = False
rightRun = False
down = False
flag = True
idle = False
else:
leftWalk = False
rightWalk = False
leftRun = False
rightRun = False
down = False
flag = False
idle = True
flagCount = 0
animCount = 0
drawWindow()