Added basic animation support to BaseActor.

This commit is contained in:
2013-01-16 08:46:57 -04:30
parent 5b66171476
commit 95a5d81fb0
2 changed files with 55 additions and 3 deletions

View File

@@ -20,6 +20,13 @@ class BaseActor(pygame.sprite.Sprite):
self.visible = visible self.visible = visible
self.solid = solid self.solid = solid
self.fps = 60
self.frames = []
self.time_per_frame = int(1000.0 / float(self.fps))
self.current_frame = 0
self.anim_then = pygame.time.get_ticks()
self.stopped = False
self.angle = 0.0 self.angle = 0.0
self.position = [0, 0] self.position = [0, 0]
self.velocity = [0, 0] self.velocity = [0, 0]
@@ -30,7 +37,8 @@ class BaseActor(pygame.sprite.Sprite):
self.color = (255, 206, 99) self.color = (255, 206, 99)
if image is not None: if image is not None:
self.image = image self.image = image.copy()
self.frames.append(self.image)
self.rect = self.image.get_rect() self.rect = self.image.get_rect()
else: else:
self.image = None self.image = None
@@ -105,6 +113,37 @@ class BaseActor(pygame.sprite.Sprite):
def set_friction(self, new_friction): def set_friction(self, new_friction):
self.friction = new_friction self.friction = new_friction
def get_fps(self):
return self.fps
def set_fps(self, fps):
self.fps = fps
self.time_per_frame = int(1000.0 / float(self.fps))
def resume_animation(self):
self.stopped = False
def stop_animation(self):
self.stopped = True
def add_frame(self, frame):
self.frames.append(frame.copy())
def change_frame(self, frame_index, frame):
if frame_index < 0 or frame_index >= len(self.frames):
pass
else:
self.frames[frame_index] = frame.copy()
def remove_frame(self, frame_index):
if frame_index < 1 or frame_index >= len(self.frames):
# The first frame (frame 0) cannot be removed.
pass
else:
self.frames.pop(im_point)
if self.current_frame >= len(self.frames):
self.current_frame = len(self.frames) - 1
def get_image_point(self, point): def get_image_point(self, point):
if point < 0 or point > len(self.image_points): if point < 0 or point > len(self.image_points):
return (0, 0) return (0, 0)
@@ -129,7 +168,18 @@ class BaseActor(pygame.sprite.Sprite):
def draw(self, canvas): def draw(self, canvas):
if self.image is not None: if self.image is not None:
canvas.blit(self.image, self.rect) if not self.animated:
canvas.blit(self.image, self.rect)
else:
anim_now = pygame.time.get_ticks()
delta_t = anim_now - self.anim_then
if not self.stopped and delta_t >= self.time_per_frame:
self.current_frame = (self.current_frame + (delta_t // self.time_per_frame)) % len(self.frames)
self.anim_then = anim_now
frame = self.frames[self.current_frame]
frame_rect = frame.get_rect()
frame_rect.center = (self.position[0], self.position[1])
canvas.blit(frame, frame_rect)
else: else:
pygame.draw.rect(canvas, self.color, self.rect) pygame.draw.rect(canvas, self.color, self.rect)

View File

@@ -28,6 +28,7 @@ class IntroState(BaseState):
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/burbuja.png') image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/burbuja.png')
image2 = imloader.cached_image_loader.get_image_to_screen_percent('gfx/submarino1.png') image2 = imloader.cached_image_loader.get_image_to_screen_percent('gfx/submarino1.png')
image4 = imloader.cached_image_loader.get_image_to_screen_percent('gfx/submarino2.png')
image3 = imloader.cached_image_loader.get_image_to_screen_percent('gfx/oneoop.png') image3 = imloader.cached_image_loader.get_image_to_screen_percent('gfx/oneoop.png')
self.sine_movement = actor.BulletActor(0, image, "SineMovement", False, True, False) self.sine_movement = actor.BulletActor(0, image, "SineMovement", False, True, False)
@@ -41,7 +42,8 @@ class IntroState(BaseState):
self.submarine = actor.BaseActor(1, image2, "Submarine", True, True, False) self.submarine = actor.BaseActor(1, image2, "Submarine", True, True, False)
self.submarine.set_image_point_xy(int(float(image2.get_width()) * 0.195), int(float(image2.get_height()) * 0.835)) self.submarine.set_image_point_xy(int(float(image2.get_width()) * 0.195), int(float(image2.get_height()) * 0.835))
# Instert second animation frame of the subamrine. self.submarine.set_fps(10)
self.submarine.add_frame(image4)
self.particle_system = particle.ParticleSystem(0, "Bubbles", 'gfx/burbuja.png', 1000, 1000, 1, -130.0) self.particle_system = particle.ParticleSystem(0, "Bubbles", 'gfx/burbuja.png', 1000, 1000, 1, -130.0)
self.particle_system.set_friction(1.0) self.particle_system.set_friction(1.0)