예제 #1
0
 def _update_sprites(self):
     if self.text_sprite is None:
         self.text_sprite = sprites.TextSprite(spriteref.UI_FG_LAYER,
                                               0,
                                               0,
                                               self.get_text_for_display(),
                                               font_lookup=self.font)
     abs_xy = self.get_xy(absolute=True)
     text_xy = abs_xy
     if self.has_outline():
         text_xy = (text_xy[0] + self.outline_inset,
                    text_xy[1] + self.outline_inset)
     self.text_sprite.update(new_x=text_xy[0],
                             new_y=text_xy[1],
                             new_text=self.get_text_for_display(),
                             new_scale=self.scale,
                             new_color=self.color)
     if self.has_outline():
         abs_size = self.get_size()
         outline_box = [abs_xy[0], abs_xy[1], abs_size[0], abs_size[1]]
         if self.bg_sprite is None:
             self.bg_sprite = sprites.BorderBoxSprite(
                 spriteref.UI_BG_LAYER,
                 outline_box,
                 color=self.outline_color,
                 all_borders=spriteref.overworld_sheet().border_thin)
         self.bg_sprite.update(new_rect=outline_box)
예제 #2
0
    def get_size(self):
        if self._dummy_text_for_size_calc is None:
            # hope it's monospaced~
            self._dummy_text_for_size_calc = sprites.TextSprite(
                spriteref.UI_FG_LAYER,
                0,
                0,
                "X" * self.char_limit,
                scale=self.scale,
                font_lookup=self.font)
        self._dummy_text_for_size_calc.update(new_text="X" * self.char_limit)
        size = self._dummy_text_for_size_calc.size()
        if self.has_outline():
            size = (size[0] + self.outline_inset * 2,
                    size[1] + self.outline_inset * 2)

        return size
예제 #3
0
    def update_sprites(self):
        util.extend_or_empty_list_to_length(
            self._sprites,
            len(self.options),
            creator=lambda: sprites.TextSprite(spriteref.UI_FG_LAYER, 0, 0,
                                               "abc"))
        max_w = 0
        # first build the sprites
        for i in range(0, len(self.options)):
            spr = self._sprites[i]
            rect, text, do_action, is_enabled = self.options[i]
            if not is_enabled():
                new_color = colors.DARK_GRAY
            elif i == self.selected_idx:
                new_color = colors.PERFECT_RED
            else:
                new_color = colors.PERFECT_WHITE
            spr.update(new_text=text,
                       new_color=new_color,
                       new_outline_thickness=1 if self.outlined else 0)
            max_w = max(spr.size()[0], max_w)

        abs_xy = self.get_xy(absolute=True)
        y = 0
        # then figure out the final positions and move the sprites
        for i in range(0, len(self.options)):
            spr = self._sprites[i]
            rect, text, do_action, is_enabled = self.options[i]
            new_rect = [
                0 if self.alignment == OptionsList.LEFT_ALIGN else
                int(max_w / 2 - spr.size()[0] / 2), y,
                spr.size()[0],
                spr.size()[1]
            ]
            self.options[i] = (new_rect, text, do_action, is_enabled)
            spr.update(new_x=abs_xy[0] + new_rect[0],
                       new_y=abs_xy[1] + new_rect[1])

            y += new_rect[3] + self.y_spacing
예제 #4
0
    def update_sprites(self):
        xy = self.get_xy(absolute=True)
        screen_size = renderengine.get_instance().get_game_size()
        size = self.get_size()

        if self.bg_sprite is None:
            self.bg_sprite = sprites.ImageSprite.new_sprite(
                spriteref.UI_BG_LAYER, depth=10)
        bg_model = spritesheets.get_white_square_img(self.bg_opacity)
        self.bg_sprite = self.bg_sprite.update(
            new_model=bg_model,
            new_x=xy[0],
            new_y=xy[1],
            new_ratio=(size[0] / bg_model.width(),
                       size[1] / bg_model.height()),
            new_color=colors.PERFECT_BLACK)

        text_rect = [
            xy[0] + self.inset, xy[1] + self.inset, size[0] - self.inset * 2,
            size[1] - self.inset * 2
        ]

        all_sprites = self.current_dialog.get_speaker_sprites()
        if len(all_sprites) > 0:
            speaker_img = all_sprites[gs.get_instance().anim_tick() // 8 %
                                      len(all_sprites)]
        else:
            speaker_img = None

        if speaker_img is not None:
            speaker_sc = 3
            speaker_size = speaker_img.size(scale=speaker_sc)
            speaker_on_right_side = self.current_dialog.put_speaker_sprite_on_right_side(
            )
            if speaker_on_right_side:
                speaker_x = xy[0] + size[0] - speaker_size[0] - self.inset
                text_rect = [
                    xy[0] + self.inset, xy[1] + self.inset,
                    size[0] - self.inset * 2 - speaker_size[0],
                    size[1] - self.inset * 2
                ]
            else:
                speaker_x = xy[0] + self.inset
                text_rect = [
                    speaker_x + speaker_size[0] + self.inset,
                    xy[1] + self.inset,
                    size[0] - self.inset * 2 - speaker_size[0],
                    size[1] - self.inset * 2
                ]

            if self.speaker_sprite is None:
                self.speaker_sprite = sprites.ImageSprite.new_sprite(
                    spriteref.UI_FG_LAYER)
            self.speaker_sprite = self.speaker_sprite.update(
                new_model=speaker_img,
                new_x=speaker_x,
                new_y=screen_size[1] - speaker_size[1],
                new_xflip=speaker_on_right_side,
                new_scale=speaker_sc)
        else:
            self.speaker_sprite = None

        text_color = self.current_dialog.get_text_color()
        visible_text = "\n".join(
            sprites.TextSprite.wrap_text_to_fit(self._get_visible_text(),
                                                text_rect[2],
                                                scale=1,
                                                font_lookup=self.get_font()))
        if self.text_sprite is None:
            self.text_sprite = sprites.TextSprite(spriteref.UI_FG_LAYER,
                                                  0,
                                                  0,
                                                  "blah",
                                                  font_lookup=self.get_font())
        self.text_sprite.update(new_x=text_rect[0],
                                new_y=text_rect[1],
                                new_text=visible_text,
                                new_color=text_color)
예제 #5
0
    def update(self):
        if len(self.entity_sprites) == 0:
            self.entity_sprites.append(
                sprites.ImageSprite.new_sprite(DemoGame.ENTITY_LAYER,
                                               scale=1))  # player
            self.entity_sprites.append(
                sprites.ImageSprite.new_sprite(DemoGame.ENTITY_LAYER,
                                               scale=1))  # tv

        if len(self.wall_sprites) == 0:
            for pos in self.wall_positions:
                new_sprite = sprites.ImageSprite(
                    DemoGame.demo_sheet.wall_model,
                    pos[0] * DemoGame.cell_size,
                    pos[1] * DemoGame.cell_size,
                    DemoGame.WALL_LAYER,
                    scale=2)
                self.wall_sprites.append(new_sprite)

        if len(self.floor_sprites) == 0:
            for pos in self.floor_positions:
                new_sprite = sprites.ImageSprite(
                    DemoGame.demo_sheet.floor_model,
                    pos[0] * DemoGame.cell_size,
                    pos[1] * DemoGame.cell_size,
                    DemoGame.FLOOR_LAYER,
                    scale=2)
                self.floor_sprites.append(new_sprite)

        if len(self.shadow_sprites) == 0:
            for _ in self.entity_sprites:
                self.shadow_sprites.append(
                    sprites.ImageSprite(DemoGame.demo_sheet.shadow_model,
                                        0,
                                        0,
                                        DemoGame.SHADOW_LAYER,
                                        scale=1))

        if self.triangle_sprite is None:
            self.triangle_sprite = sprites.TriangleSprite(
                DemoGame.POLYGON_LAYER, color=(0, 0, 0))

        while len(self.cube_line_sprites) < 12:
            self.cube_line_sprites.append(
                sprites.LineSprite(DemoGame.POLYGON_LAYER,
                                   thickness=self.cube_line_thickness))

        anim_tick = globaltimer.tick_count() // 16

        speed = 2
        dx = 0
        new_xflip = None
        if inputs.get_instance().is_held([pygame.K_a, pygame.K_LEFT]):
            dx -= speed
            new_xflip = False
        elif inputs.get_instance().is_held([pygame.K_d, pygame.K_RIGHT]):
            dx += speed
            new_xflip = True

        dy = 0
        if inputs.get_instance().is_held([pygame.K_w, pygame.K_UP]):
            dy -= speed
        elif inputs.get_instance().is_held([pygame.K_s, pygame.K_DOWN]):
            dy += speed

        player_x = self.entity_positions[0][0] + dx
        new_y = self.entity_positions[0][1] + dy
        player_y = max(new_y,
                       int(1.1 * DemoGame.cell_size))  # collision with walls~

        self.entity_positions[0] = (player_x, player_y)
        new_model = DemoGame.demo_sheet.player_models[anim_tick % len(
            DemoGame.demo_sheet.player_models)]
        player_sprite = self.entity_sprites[0]
        player_scale = player_sprite.scale()
        self.entity_sprites[0] = player_sprite.update(
            new_model=new_model,
            new_x=player_x - new_model.width() * player_scale // 2,
            new_y=player_y - new_model.height() * player_scale,
            new_xflip=new_xflip,
            new_depth=-player_y)

        tv_model = DemoGame.demo_sheet.tv_models[(anim_tick // 2) % len(
            DemoGame.demo_sheet.tv_models)]
        tv_x = self.entity_positions[1][0]
        tv_y = self.entity_positions[1][1]
        tv_xflip = player_x > tv_x  # turn to face player
        tv_sprite = self.entity_sprites[1]
        tv_scale = tv_sprite.scale()

        self.entity_sprites[1] = tv_sprite.update(
            new_model=tv_model,
            new_x=tv_x - tv_model.width() * tv_scale // 2,
            new_y=tv_y - tv_model.height() * tv_scale,
            new_xflip=tv_xflip,
            new_depth=-tv_y)

        for i in range(0, len(self.entity_positions)):
            xy = self.entity_positions[i]
            shadow_sprite = self.shadow_sprites[i]
            shadow_model = self.demo_sheet.shadow_model
            shadow_x = xy[0] - shadow_sprite.scale() * shadow_model.width() // 2
            shadow_y = xy[1] - shadow_sprite.scale() * shadow_model.height(
            ) // 2
            self.shadow_sprites[i] = shadow_sprite.update(
                new_model=shadow_model, new_x=shadow_x, new_y=shadow_y)

        min_rot_speed = 0.3
        max_rot_speed = 4

        if self.triangle_sprite is not None:
            tri_center = self.triangle_center
            tri_angle = self.triangle_angle * 2 * 3.141529 / 360
            tri_length = self.triangle_length

            p1 = Utils.add(tri_center, Utils.rotate((tri_length, 0),
                                                    tri_angle))
            p2 = Utils.add(
                tri_center,
                Utils.rotate((tri_length, 0), tri_angle + 3.141529 * 2 / 3))
            p3 = Utils.add(
                tri_center,
                Utils.rotate((tri_length, 0), tri_angle + 3.141529 * 4 / 3))

            self.triangle_sprite = self.triangle_sprite.update(new_points=(p1,
                                                                           p2,
                                                                           p3))

            player_dist = Utils.dist(self.entity_positions[0], tri_center)
            if player_dist > 100:
                rot_speed = min_rot_speed
            else:
                rot_speed = Utils.linear_interp(min_rot_speed, max_rot_speed,
                                                (100 - player_dist) / 100)

            self.triangle_angle += rot_speed

        text_inset = 4

        title_text = "Demo Scene"
        if self.title_text_sprite is None:
            self.title_text_sprite = sprites.TextSprite(
                DemoGame.UI_FG_LAYER, 0, text_inset, title_text)

        title_text_width = self.title_text_sprite.get_size()[0]
        title_text_x = renderengine.get_instance().get_game_size(
        )[0] - title_text_width - text_inset
        self.title_text_sprite = self.title_text_sprite.update(
            new_x=title_text_x)

        if self.fps_text_sprite is None:
            self.fps_text_sprite = sprites.TextSprite(DemoGame.UI_FG_LAYER,
                                                      text_inset, text_inset,
                                                      "FPS: 0")
        fps_text = "FPS: {}".format(int(globaltimer.get_fps()))
        self.fps_text_sprite = self.fps_text_sprite.update(new_x=text_inset,
                                                           new_y=text_inset,
                                                           new_text=fps_text)

        player_to_tv_dist = Utils.dist(self.entity_positions[0],
                                       self.entity_positions[1])
        info_text = "There's something wrong with the TV. Maybe it's better this way." if player_to_tv_dist < 32 else None
        info_text_w = 400 - 32
        info_text_h = 48
        info_text_rect = [
            renderengine.get_instance().get_game_size()[0] // 2 -
            info_text_w // 2,
            renderengine.get_instance().get_game_size()[1] - info_text_h - 16,
            info_text_w, info_text_h
        ]
        if info_text is None:
            self.text_box_text_sprite = None
            self.text_box_sprite = None
        else:
            wrapped_text = "\n".join(
                sprites.TextSprite.wrap_text_to_fit(info_text,
                                                    info_text_rect[2]))
            if self.text_box_text_sprite is None:
                self.text_box_text_sprite = sprites.TextSprite(
                    DemoGame.UI_FG_LAYER, 0, 0, wrapped_text)
            self.text_box_text_sprite = self.text_box_text_sprite.update(
                new_x=info_text_rect[0],
                new_y=info_text_rect[1],
                new_text=wrapped_text)
            if self.text_box_sprite is None:
                self.text_box_sprite = sprites.BorderBoxSprite(
                    DemoGame.UI_BG_LAYER,
                    info_text_rect,
                    all_borders=DemoGame.demo_sheet.border_models)
            self.text_box_sprite = self.text_box_sprite.update(
                new_rect=info_text_rect, new_scale=2)

        if len(self.cube_line_sprites) == 12:
            cube_center = self.cube_center
            cube_angle = self.cube_angle * 2 * 3.141529 / 360
            cube_length = self.cube_length
            cube_color = self.cube_color

            cube_top_pts = []
            cube_btm_pts = []

            for i in range(0, 4):
                dx = cube_length / 2 * math.cos(cube_angle + i * 3.141529 / 2)
                dy = cube_length / 2 * math.sin(
                    cube_angle +
                    i * 3.141529 / 2) / 2  # foreshortened in the y-axis
                cube_btm_pts.append(Utils.add(cube_center, (dx, dy)))
                cube_top_pts.append(
                    Utils.add(cube_center, (dx, dy - cube_length)))

            for i in range(0, 12):
                if i < 4:  # bottom lines
                    p1 = cube_btm_pts[i % 4]
                    p2 = cube_btm_pts[(i + 1) % 4]
                elif i < 8:  # top lines
                    p1 = cube_top_pts[i % 4]
                    p2 = cube_top_pts[(i + 1) % 4]
                else:  # bottom to top lines
                    p1 = cube_btm_pts[i % 4]
                    p2 = cube_top_pts[i % 4]

                self.cube_line_sprites[i].update(new_p1=p1,
                                                 new_p2=p2,
                                                 new_color=cube_color)

            player_dist = Utils.dist(self.entity_positions[0], cube_center)
            if player_dist > 100:
                rotation_speed = min_rot_speed
            else:
                rotation_speed = Utils.linear_interp(min_rot_speed,
                                                     max_rot_speed,
                                                     (100 - player_dist) / 100)

            self.cube_angle += rotation_speed

        # setting layer positions
        camera_x = player_x - renderengine.get_instance().get_game_size(
        )[0] // 2
        camera_y = player_y - renderengine.get_instance().get_game_size(
        )[1] // 2
        for layer_id in DemoGame.world_layer_ids:
            renderengine.get_instance().set_layer_offset(
                layer_id, camera_x, camera_y)