Мультфильм — Курсовая работа по Python | — Терногон / Ternogon
Терногон / Ternogon

Предмет: Технология программирования Python.

Курс: 2.

Университет: РТУ МИРЭА (Московский Институт Радиоэлектроники и Автоматики)
Факультет (институт): КБСП (Комплексной безопасности и специального приборостроения)


Содержание:

  1. Введение
  2. Вводная информация
    1. Библиотека Pygame
  3. Пути реализации
    1. «Автоматический» путь реализации
    2. «Стандартный» путь реализации.
  4. Графика

Введение

Высокоуровневый язык программирования — язык программирования, разработанный для быстроты и удобства использования программистом. Основная черта подобных языков — абстракция, то есть введение смысловых конструкций, которые кратко описывают такие структуры и операции над ними, описания которых на любом низкоуровневом языке программирования будут длинны и сложны для понимания.

Python — высокоуровневый язык программирования общего назначения. Язык ориентирован на повышение производительности разработчика и читаемости кода, путем некого «упрощения» процесса программирования. [1]

Цель данного исследования написать программу, способную реализовать анимацию объекта в условном окне. Объектом для нас будет являться некий «человечек», нарисованный в очень простом стиле.

Задачи данной курсовой:

  • Определить необходимый вспомогательный материал
  • Углубится в технологию программирования на Python
  • Научиться работать с графикой на «стороне» языка программирования

Вводная информация

Библиотеки Pygame

Набор модулей языка программирования Python, предназначенный для написания мультимедиа-приложений и компьютерных игр, в том числе и все вышеперечисленное на Android. Считается. что Pygame можно называть фреймворком[1]. Хотя и понятия «библиотека» и «фреймворк» разные, но когда дело касается классификации конкретного инструмента, все неоднозначно. [2]

Пути реализации

В процессе выполнения курсовой работы в разработке находилось два варианта реализации задания.

«Автоматический» путь реализации

Изначальная реализация, то есть, первый метод отрисовки анимации подразумевал как посменную смену кадров, как того требовало задание, так и высчитывание координат точек, от которых зависит положение конечностей объекта отрисовки. «Автоматическим» этот способ был назван именно благодаря этому методу. Таким способом мы избегаем ручной отрисовки промежуточных кадров.

В качестве вспомогательной библиотеки использовалась «graphics.py». Которая, наряду с «matplotlib» библиотекой, в основном используется для отрисовки простых объектов и/или графиков. Во всяком случае, подобные объекты действительно просто реализовать с помощью вышеописанных библиотек. От данного метода пришлось отказаться, ввиду больших временных затрат на его реализацию. Высчитывание каждой окончательной точки (точки, на которой анимация должна пойти в обратную сторону) не привели к качественному «живому» результату.

«Стандартный» путь реализации

После отказа от предыдущего варианта реализации, было решено выполнить работу по простой логике посменной смены кадров и не тратить процессорное время на высчитывание координат. Для работы, по совету научного руководителя, была выбрана библиотека «Pygame».

Обучение всем необходимым функциям и методам заняло не более трех часов, также были сформированы условия плавной картинки. И для реализации были приняты следующие параметры: не более 6 кадров в одной анимации, 30 кадров в секунду в процессе отрисовки.

Перед тем как начать работу по коду, необходимо вручную отрисовать кадры анимации, которые в процессе работы будут давать подходящую картинку. В конечном итоге были отрисованы:

  • 3 кадра на шаг объекта вправо
  • 3 кадра на шаг объекта влево
  • 3 кадра на бег объекта вправо
  • 3 кадра на бег объекта влево
  • 3 кадра на приседания объекта
  • 5 кадров на то, чтобы объект достал флажок
  • 3 кадра на сигнализацию объекта флажком

Также был отрисован начальный кадр, то есть кадр, где объект находится в состоянии покоя.

[1] Фреймворк — программная платформа, облегчающее разработку и объединение разных компонентов большого программного проекта.

Графика

Окно для отрисовки будет занимать 500×500 пикселей. Определяем его с помощью 3 строки в коде.

Нашим объектом будет «человечек» в максимально простой рисовке. Все кадры анимации персонажа отрисованы с помощью графического редактора.

Рисунок 3.1.1 — начальная позиция объекта

Исходные изображения

Код

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()

Комментарии

Тут пока нет комментариев.

Следующая Запись