Мультфильм — Курсовая работа по 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()
Следующая Запись