-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathspriteSheet.py
More file actions
81 lines (64 loc) · 2.31 KB
/
Copy pathspriteSheet.py
File metadata and controls
81 lines (64 loc) · 2.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import pygame as pg
from enum import Enum
class SpriteSheet:
def __init__(self, filename, bg=None):
self.spritesheet = pg.image.load(filename).convert_alpha()
self.bg = bg
def get_image(self, frame, scale=None, flip=False):
image = self.spritesheet.subsurface(pg.Rect(frame))
if scale is not None:
image = pg.transform.scale(image, (frame[2]*scale, frame[3]*scale))
if flip:
image = pg.transform.flip(image, True, False)
if self.bg is not None:
image.set_colorkey(self.bg)
return image
def get_animation(self, coords, frame_duration, mode, scale=None, flip=None):
# extract images & create animation
frames = [self.get_image(frame, scale, flip) for frame in coords]
return Animation(frames, frame_duration, mode)
class Animation:
class PlayMode(Enum):
NORMAL = 1
REVERSED = 2
LOOP = 3
LOOP_REVERSED = 4
LOOP_PINGPONG = 5
LOOP_RANDOM = 6
def __init__(self, frames, frame_duration, mode):
# assign animation settings
self.frames = frames
self.frame_duration = frame_duration
self.animation_duration = len(self.frames)*self.frame_duration
self.mode = mode
# keep track of animation
self.last_frame_number = 0
self.last_state_time = 0
def get_frame(self, state_time):
frame_number = self.get_frame_index(state_time)
return self.frames[frame_number]
def get_frame_index(self, state_time):
if len(self.frames) == 1:
return 0
frame_number = int(state_time/self.frame_duration)
# set frame number by animation play mode
if self.mode == self.PlayMode.NORMAL:
frame_number = min(len(self.frames) - 1, frame_number)
elif self.mode == self.PlayMode.LOOP:
frame_number = frame_number % len(self.frames)
elif self.mode == self.PlayMode.LOOP_PINGPONG:
frame_number = frame_number % ((len(self.frames) * 2 ) - 2)
if frame_number >= len(self.frames):
frame_number = len(self.frames) - 2 - (frame_number - len(self.frames))
self.last_frame_number = frame_number
self.last_state_time = state_time
return frame_number
def is_animation_finished(self, state_time):
frame_number = int(state_time/self.frame_duration)
return len(self.frames) - 1 < frame_number
class Generic(pg.sprite.Sprite):
def __init__(self, pos, surface, groups, z = 4):
super().__init__(groups)
self.sprite = surface
self.rect = self.sprite.get_rect(topleft = pos)
self.z = z