22 декабря 2009

Анимация своими руками

Здравствуйте. Мы уже говорили с вами о анимации, но я решил что стоит поговорить об этом еще и отдельно.

Я расскажу вам как можно из подручных средств сделать анимированный спрайт. Это на самом деле очень просто, ну не очень конечно, но просто. Собственно это как мультик, мы рисуем разные этапы движения, а потом, при быстрой смене рисунков создается илюзия движения.

Давайте нарисуем нашего героя. Для начало можно сделать набросок на бумаге. Он поможет нам опридилится с внешним видом. Можно конечно и не делать.

Я предлагая сделать анимацию в gimp. Так как я рисую плохо, то это будет очень простая анимация. Очень-очень простая.

Я предлагаю взять картинку размером 16х16. Зачем? За тем что так проще. Приступим...

Это не 16х16! Да, это так. Это 48х16. То есть в нашей анимации будет три кадкра (16 * 3 = 48). Это добвольно стандартный прием хранения анимации для игр. Можно хранить картинки по оддельности, но гораздо удобнее все хранить в одном файле (есть и другие причины, но о них как-нибудь в другой раз).

Для начала просто наметим контуры, чтобы опредилится с основным движением (наш герой будет бежать)

Ничего сложного. Теперь осталось только разукрасить и готово.

Теперь можно запустить код ниже и посмотреть что получилось.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pygame

if __name__ == '__main__':
    pygame.init()

    anim = list()

    display = pygame.display.set_mode((96,96))

    sprite = pygame.image.load('evan.png').convert_alpha()

    #вот так мы вырезаем кадры из нашего спрайта
    anim.append(sprite.subsurface((0,0,16,16)))
    anim.append(sprite.subsurface((16,0,16,16)))
    anim.append(sprite.subsurface((32,0,16,16)))
    anim.append(sprite.subsurface((16,0,16,16)))

    clock = pygame.time.Clock()

    done = False
    dt = 0
    while not done:
        for s in anim:
            for e in pygame.event.get():
                if e.type == pygame.QUIT:
                    done = True

            display.fill((255,255,255))

            news = pygame.transform.scale(s,(96, 96))
            display.blit(news, news.get_rect())


            pygame.display.flip()

            pygame.time.wait(180)