def __init__(self, font, text_list, midtop, **kwargs): """ Arguments are a font object; a list of strings to make labels from; and the midtop point of the topmost label. A number of keyword arguments are accepted to further customize the appearance. See ZIPPER_DEFAULTS for the accepted keywords. """ self.process_kwargs("ZipperBlock", ZIPPER_DEFAULTS, kwargs) self.stop_x, y = midtop self.labels, self.rollers = self.make_labels_rolls(font, text_list, y) top = self.labels[0].rect.top fade_rect = pg.Rect(300, top, 800, prepare.RENDER_SIZE[1] - top) self.fader = Fadeout(fade_rect, prepare.BACKGROUND_BASE) self.state = "Zipping" self.done = False
def __init__(self, font, text_list, midtop, **kwargs): """ Arguments are a font object; a list of strings to make labels from; and the midtop point of the topmost label. A number of keyword arguments are accepted to further customize the appearance. See ZIPPER_DEFAULTS for the accepted keywords. """ self.process_kwargs("ZipperBlock", ZIPPER_DEFAULTS, kwargs) self.stop_x, y = midtop self.labels, self.rollers = self.make_labels_rolls(font, text_list, y) top = self.labels[0].rect.top fade_rect = pg.Rect(300, top, 800, prepare.RENDER_SIZE[1]-top) self.fader = Fadeout(fade_rect, prepare.BACKGROUND_BASE) self.state = "Zipping" self.done = False
class ZipperBlock(tools._KwargMixin): """ A block of up to five label+rollers that scroll across the screen in alternating directions. Used for the credits screen. """ def __init__(self, font, text_list, midtop, **kwargs): """ Arguments are a font object; a list of strings to make labels from; and the midtop point of the topmost label. A number of keyword arguments are accepted to further customize the appearance. See ZIPPER_DEFAULTS for the accepted keywords. """ self.process_kwargs("ZipperBlock", ZIPPER_DEFAULTS, kwargs) self.stop_x, y = midtop self.labels, self.rollers = self.make_labels_rolls(font, text_list, y) top = self.labels[0].rect.top fade_rect = pg.Rect(300, top, 800, prepare.RENDER_SIZE[1]-top) self.fader = Fadeout(fade_rect, prepare.BACKGROUND_BASE) self.state = "Zipping" self.done = False def make_labels_rolls(self, font, text_list, y): """ Create each text label and a corresponding roller. Arguments are a font object; a list of strings to make labels from; and the y coordinate that the top label starts from. """ labels = [] rollers = pg.sprite.Group() for i, text in enumerate(text_list): if not i%2: pos = (-self.off, y) roll = Roller(pos, random.choice(COLORS), "right", self.speed) r = roll.rect label = Label(font, self.font_size, text, "goldenrod3", {"midright": (r.left-self.chip_space,r.centery)}) label.speed = self.speed else: pos = (SCREEN_WIDTH+self.off, y) roll = Roller(pos, random.choice(COLORS), "left", self.speed) r = roll.rect label = Label(font, self.font_size, text, "goldenrod3", {"midleft": (r.right+self.chip_space,r.centery)}) label.speed = -self.speed label.true_centerx = label.rect.centerx label.moving = True labels.append(label) rollers.add(roll) y += self.vert_space return labels, rollers def update_label(self, label, dt): """ Update the position of a label and set label.moving to False if the label passes the center of the screen. """ centerx = label.rect.centerx frame_speed = self.speed*dt if label.moving: label.true_centerx += label.speed*dt label.rect.centerx = label.true_centerx if self.stop_x-frame_speed < centerx < self.stop_x+frame_speed: if label.moving: label.rect.centerx = self.stop_x label.moving = False def update(self, dt): """ Update rollers and labels. Once the state changes to "Fading", update the fader. """ self.rollers.update(dt) if self.state == "Zipping": for label in self.labels: self.update_label(label, dt) if not any(label.moving for label in self.labels): self.state = "Fading" elif self.state == "Fading": self.fader.update(dt) if self.fader.done: self.done = True def draw(self, surface): """ Draw all labels; the fader if ready; and any rollers to the target surface. """ for label in self.labels: label.draw(surface) if self.state == "Fading": self.fader.draw(surface) self.rollers.draw(surface)
class ZipperBlock(tools._KwargMixin): """ A block of up to five label+rollers that scroll across the screen in alternating directions. Used for the credits screen. """ def __init__(self, font, text_list, midtop, **kwargs): """ Arguments are a font object; a list of strings to make labels from; and the midtop point of the topmost label. A number of keyword arguments are accepted to further customize the appearance. See ZIPPER_DEFAULTS for the accepted keywords. """ self.process_kwargs("ZipperBlock", ZIPPER_DEFAULTS, kwargs) self.stop_x, y = midtop self.labels, self.rollers = self.make_labels_rolls(font, text_list, y) top = self.labels[0].rect.top fade_rect = pg.Rect(300, top, 800, prepare.RENDER_SIZE[1] - top) self.fader = Fadeout(fade_rect, prepare.BACKGROUND_BASE) self.state = "Zipping" self.done = False def make_labels_rolls(self, font, text_list, y): """ Create each text label and a corresponding roller. Arguments are a font object; a list of strings to make labels from; and the y coordinate that the top label starts from. """ labels = [] rollers = pg.sprite.Group() for i, text in enumerate(text_list): if not i % 2: pos = (-self.off, y) roll = Roller(pos, random.choice(COLORS), "right", self.speed) r = roll.rect label = Label( font, self.font_size, text, "goldenrod3", {"midright": (r.left - self.chip_space, r.centery)}) label.speed = self.speed else: pos = (SCREEN_WIDTH + self.off, y) roll = Roller(pos, random.choice(COLORS), "left", self.speed) r = roll.rect label = Label( font, self.font_size, text, "goldenrod3", {"midleft": (r.right + self.chip_space, r.centery)}) label.speed = -self.speed label.true_centerx = label.rect.centerx label.moving = True labels.append(label) rollers.add(roll) y += self.vert_space return labels, rollers def update_label(self, label, dt): """ Update the position of a label and set label.moving to False if the label passes the center of the screen. """ centerx = label.rect.centerx frame_speed = self.speed * dt if label.moving: label.true_centerx += label.speed * dt label.rect.centerx = label.true_centerx if self.stop_x - frame_speed < centerx < self.stop_x + frame_speed: if label.moving: label.rect.centerx = self.stop_x label.moving = False def update(self, dt): """ Update rollers and labels. Once the state changes to "Fading", update the fader. """ self.rollers.update(dt) if self.state == "Zipping": for label in self.labels: self.update_label(label, dt) if not any(label.moving for label in self.labels): self.state = "Fading" elif self.state == "Fading": self.fader.update(dt) if self.fader.done: self.done = True def draw(self, surface): """ Draw all labels; the fader if ready; and any rollers to the target surface. """ for label in self.labels: label.draw(surface) if self.state == "Fading": self.fader.draw(surface) self.rollers.draw(surface)