This commit is contained in:
Frank DeMarco 2013-12-29 23:36:30 +09:00
parent d77b148c5b
commit b325cbaada
1 changed files with 91 additions and 27 deletions

View File

@ -18,10 +18,11 @@ class Sprite(Animation):
def __init__(self, parent, framerate=None):
Animation.__init__(self, parent, self.shift_frame, framerate)
self.clear_frames()
self.frame_index = 0
self.mirrored = False
self.alpha = 255
self.locations = [Location(self)]
self.framesets = [Frameset(self, framerate=framerate)]
self.set_frameset(0)
self.motion_overflow = Vector()
self.display_surface = self.get_display_surface()
@ -32,11 +33,35 @@ class Sprite(Animation):
return Animation.__getattr__(self, name)
raise AttributeError, name
def set_frameset(self, identifier):
if isinstance(identifier, str):
for ii, frameset in enumerate(self.framesets):
if frameset.name == identifier:
identifier = ii
break
self.frameset_index = identifier
self.register_interval()
self.update_location_size()
def register_interval(self):
self.register(self.shift_frame,
interval=self.get_current_frameset().framerate)
def get_current_frameset(self):
return self.framesets[self.frameset_index]
def update_location_size(self):
size = self.get_current_frameset().rect.size
for location in self.locations:
location.size = size
location.fader.init_surface()
def set_framerate(self, framerate):
self.register(self.shift_frame, interval=framerate)
self.get_current_frameset().set_framerate(framerate)
self.register_interval()
def load_from_path(self, path, transparency=False, ppa=True, key=None,
extension=None):
extension=None, omit=False):
if isfile(path):
paths = [path]
else:
@ -53,7 +78,7 @@ class Sprite(Animation):
frame = self.fill_colorkey(img, key)
else:
frame = img.convert()
self.add_frame(frame)
self.add_frame(frame, omit)
def fill_colorkey(self, img, key=None):
if not key:
@ -65,35 +90,21 @@ class Sprite(Animation):
frame.blit(img, (0, 0))
return frame
def add_frame(self, frame):
def add_frame(self, frame, omit=False):
self.frames.append(frame)
self.measure_rect()
frame.set_alpha(self.alpha)
if len(self.frames) > 1:
self.play()
def measure_rect(self):
max_width, max_height = 0, 0
for frame in self.frames:
width, height = frame.get_size()
max_width = max(width, max_width)
max_height = max(height, max_height)
for location in self.locations:
location.size = max_width, max_height
location.fader.init_surface()
if not omit:
frameset = self.get_current_frameset()
frameset.add_index(self.frames.index(frame))
self.update_location_size()
if frameset.length() > 1:
self.play()
def shift_frame(self):
if len(self.frames) > 1:
self.increment_frame_index()
self.get_current_frameset().shift()
def get_current_frame(self):
return self.frames[self.frame_index]
def increment_frame_index(self):
index = self.frame_index + 1
if index >= len(self.frames):
index = 0
self.frame_index = index
return self.frames[self.get_current_frameset().get_current_id()]
def move(self, dx=0, dy=0):
for location in self.locations:
@ -147,6 +158,9 @@ class Sprite(Animation):
for location in self.locations:
location.fader.set_alpha()
def add_frameset(self, order, framerate=None, name=None):
self.framesets.append(Frameset(self, order, framerate, name))
def update(self):
Animation.update(self)
self.draw()
@ -253,3 +267,53 @@ class Fader(Surface):
def clear(self):
self.blit(self.background, (0, 0))
class Frameset():
def __init__(self, sprite, order=[], framerate=None, name=None):
self.sprite = sprite
self.name = name
self.order = []
self.rect = Rect(0, 0, 0, 0)
self.add_index(order)
self.set_framerate(framerate)
self.reset()
def add_index(self, order):
if isinstance(order, int):
order = [order]
self.order += order
self.measure_rect()
def set_framerate(self, framerate):
self.framerate = framerate
def reset(self):
self.current_index = 0
def get_current_id(self):
return self.order[self.current_index]
def measure_rect(self):
max_width, max_height = 0, 0
frames = self.sprite.frames
for index in self.order:
frame = frames[index]
width, height = frame.get_size()
max_width = max(width, max_width)
max_height = max(height, max_height)
self.rect.size = max_width, max_height
def shift(self):
if len(self.order) > 1:
self.increment_index()
def increment_index(self):
index = self.current_index + 1
if index >= len(self.order):
index = 0
self.current_index = index
def length(self):
return len(self.order)