frameset
This commit is contained in:
parent
d77b148c5b
commit
b325cbaada
118
pgfw/Sprite.py
118
pgfw/Sprite.py
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue