def __init__(self, left: int, top: int, game_player, image_height: int=50): super().__init__() self.game_player = game_player surface = game_player.character.face_image name = game_player.player.name stock = game_player.stock # キャラ画像 image_width = image_height rect = Rect(left, top, image_width, image_height) image = surface_fit_to_rect(surface, rect) self.character_sprite = SimpleSprite(rect, image) self.add(self.character_sprite) # ストックの丸 self.stock = stock self.stock_sprites = [Group() for i in range(stock)] x, y = self.character_sprite.rect.bottomright stock_radius = int(0.05 * image_height) left, top = x, y - stock_radius * 2 for i in range(stock): surface = Surface((stock_radius * 2, stock_radius * 2)).convert_alpha() surface.fill((125, 125, 125)) surface.set_colorkey(surface.get_at((0, 0))) pygame.gfxdraw.filled_circle(surface, stock_radius, stock_radius, stock_radius-1, (255, 255, 255)) stock_sprite = SimpleSprite(Rect(left, top, stock_radius * 2, stock_radius * 2), surface) self.stock_sprites[i].add(stock_sprite) print(self.stock_sprites[i]) left += stock_radius * 2 # プレイヤーネーム font_size = int(0.2 * image_height) font = pygame.font.Font(None, font_size) left, bottom = self.character_sprite.rect.bottomright bottom -= stock_radius * 2 self.player_name_sprite = TextSprite( x=left, y=bottom, align="left", vertical_align="bottom", text=name, font=font, color=(255, 255, 255) ) self.add(self.player_name_sprite) # プレイヤーネームのbg width = self.character_sprite.rect.w + max(stock_radius * 2 * stock, self.player_name_sprite.rect.w) + 10 height = self.character_sprite.rect.h self.base_rect = Rect(*self.character_sprite.rect.topleft, width, height) rect = self.base_rect bg_image = Surface(rect.size).convert_alpha() bg_image.fill((0, 0, 0)) bg_image.set_alpha(225) bg_sprite = SimpleSprite(rect, bg_image) self.bg_group = Group() self.bg_group.add(bg_sprite)
def init(self): bg_image = self.game_config.components["background"] bg_image = pygame.transform.scale(bg_image, self.display.get_rect().size) bg_sprite = SimpleSprite(rect=self.display.get_rect(), image=bg_image) self.background_sprites.add(bg_sprite) result_area_rect = self.area_rects[0].union(self.area_rects[3]) result_area = ResultText(self.game_player1, self.game_player2, result_area_rect) self.middle_sprites.add(result_area) btn_area_rect = self.area_rects[5].union(self.area_rects[10]) btn_rects = layout_rects(btn_area_rect, 1, 3, margin_vertical=30, padding=20) btn_params = [(btn_rects[0], "もっかい", Screen.GAME), (btn_rects[1], "Character Select", Screen.CHARACTER_SELECT), (btn_rects[2], "Go to Title", Screen.START)] btns = [ SimpleButton(width=rect.width, height=rect.height, text=text, outline=self.game_config.components["outline"], func=self._go_to_screen, func_args=(screen, )) for rect, text, screen in btn_params ] for btn, rect in zip(btns, btn_rects): btn.rect.center = rect.center self.middle_sprites.add(btn)
def __init__(self, base_rect: Rect, values: List[Any], labels: Optional[List[str]]=None, font_name: Optional[str]=None, color: Color=(255, 255, 255), bg_color: Color=(0, 0, 0), bg_alpha: float=1.0, defalut_i: int=0): super().__init__() self.values = values self.i = defalut_i self.base_rect = base_rect if defalut_i < 0 or len(values) <= defalut_i: raise(ValueError("default_i が values のリストの範囲を超えています.")) # ラベルのSpriteのリストを作成 self.labels = labels if labels else [str(v) for v in values] font = pygame.font.Font(font_name, base_rect.h) label_surfaces = [font.render(label, True, color) for label in self.labels] self.label_sprites = [] for surface in label_surfaces: rect = surface.get_rect() rect.center = base_rect.center self.label_sprites.append(SimpleSprite(rect, surface)) # 左右のボタンの作成 size = (int(base_rect.h * 0.5), int(base_rect.h * 0.8)) left_btn_surface_inactive = make_left_triangle(size, color=(192, 192, 192)) left_btn_surface_active = make_left_triangle(size, color=(255, 140, 0)) rect = base_rect self.left_btn_active = RichSprite(*rect.midleft, align="left", vertical_align="middle", image=left_btn_surface_active, press_fnc=self._left) self.left_btn_inactive = RichSprite(*rect.midleft, align="left", vertical_align="middle", image=left_btn_surface_inactive, press_fnc=self._left) self.right_btn_active = RichSprite(*rect.midright, align="right", vertical_align="middle", image=pygame.transform.flip(left_btn_surface_active, True, False), press_fnc=self._right) self.right_btn_inactive = RichSprite(*rect.midright, align="right", vertical_align="middle", image=pygame.transform.flip(left_btn_surface_inactive, True, False), press_fnc=self._right) # 背景作成 size = (base_rect.w, base_rect.h) bg_surface = make_surface(size, alpha=False, bg_color=bg_color) bg_sprite = SimpleSprite(base_rect, bg_surface) self.add(bg_sprite) # 表示のためのグループの作成と追加 self.left_btn = GroupSingle() self.right_btn = GroupSingle() self.single_group = GroupSingle() self.add(self.left_btn) self.add(self.right_btn) self.add(self.single_group) # 初期化 self._update_images()
def _set_bg(self): """背景画像の設置.game_setting.stageを参照. """ print(self.game_setting.stage) rect = self.display.get_rect() bg_image = self.game_setting.stage.image bg_image = surface_fit_to_rect(bg_image, rect) self.bg_sprite = SimpleSprite(rect, bg_image) self.background_sprites.add(self.bg_sprite)
def replace_circle(self, image: pygame.surface.Surface): """[summary]. Args: image (pygame.surface.Surface): [description]. """ sprite = SimpleSprite(rect=image.get_rect(), image=image) sprite.rect.center = self.badgesprite.center self.badgesprite.add(sprite) self.add(sprite)
def _adapt_display(self): pygame.display.set_caption("Character Select") bg_image = self.game_config.components["background"] bg_image = pygame.transform.scale(bg_image, self.display_rect.size) bg_sprite = SimpleSprite(rect=self.display_rect, image=bg_image) self.background_sprites.add(bg_sprite) self._set_characters_area() self._set_player_select_area() self._set_next_btn() self._set_back_btn()
def __init__(self): super().__init__() self.result = Screen.START self.fps = 60 self.game_config = None bg_image = pygame.image.load( "./images/components/bg.jpeg").convert_alpha() bg_sprite = SimpleSprite(bg_image.get_rect(), bg_image) self.background_sprites.add(bg_sprite) x, y = self.display.get_rect().center loading_sprits = load_animation_sprite(x, y, "./images/components/loading", interval=20, multiple=0.7) self.middle_sprites.add(loading_sprits)
def _set_animation(self): """アニメーションの設定 """ self.timer_group = TimerGroup() self.middle_sprites.add(self.timer_group) self.transform_manager = SpriteTransformManager() self.middle_sprites.add(self.transform_manager) rects = layout_rects(self.view_area, 2, 1, padding=40, margin_vertical=40) self.hand_sprites = { self.actor1: { self.Hand.ROCK: SimpleSprite( rects[0], fit_surface(self.actor1.game_player.character.arm_image[0], rects[0])), self.Hand.SCISSORS: SimpleSprite( rects[0], fit_surface(self.actor1.game_player.character.arm_image[1], rects[0])), self.Hand.PAPER: SimpleSprite( rects[0], fit_surface(self.actor1.game_player.character.arm_image[2], rects[0])), }, self.actor2: { self.Hand.ROCK: SimpleSprite( rects[1], fit_surface(self.actor2.game_player.character.arm_image[0], rects[1])), self.Hand.SCISSORS: SimpleSprite( rects[1], fit_surface(self.actor2.game_player.character.arm_image[1], rects[1])), self.Hand.PAPER: SimpleSprite( rects[1], fit_surface(self.actor2.game_player.character.arm_image[2], rects[1])), } } # wait_surface = self.font.render("wait", True, (0, 0, 0), (255, 255, 255)) # ready_surface = self.font.render("ready", True, (0, 0, 0), (255, 255, 255)) self.actor_state_sprites = { self.actor1: { True: TextSprite(*rects[0].midbottom, align="center", vertical_align="bottom", text="wait", font=self.font, color=(0, 0, 0), bgcolor=(255, 255, 255)), False: TextSprite(*rects[0].midbottom, align="center", vertical_align="bottom", text="ready", font=self.font, color=(0, 0, 0), bgcolor=(255, 255, 255)), }, self.actor2: { True: TextSprite(*rects[1].midbottom, align="center", vertical_align="bottom", text="wait", font=self.font, color=(0, 0, 0), bgcolor=(255, 255, 255)), False: TextSprite(*rects[1].midbottom, align="center", vertical_align="bottom", text="ready", font=self.font, color=(0, 0, 0), bgcolor=(255, 255, 255)), } } self.actor_state_group = Group() self.middle_sprites.add(self.actor_state_group) # 「さいしょは ぐー」などのセリフスプライト self.before_battle_sprite1 = TextSprite(*self.view_area.center, align="center", vertical_align="middle", text="さいしょは ぐー", font=self.font, color=(0, 0, 0), bgcolor=(255, 255, 255)) self.before_battle_sprite2 = TextSprite(*self.view_area.center, align="center", vertical_align="middle", text="じゃんけん...", font=self.font, color=(0, 0, 0), bgcolor=(255, 255, 255)) self.before_battle_sprite3 = TextSprite(*self.view_area.center, align="center", vertical_align="middle", text="ぽん", font=self.font, color=(0, 0, 0), bgcolor=(255, 255, 255)) self.before_battle_sprite4 = TextSprite(*self.view_area.center, align="center", vertical_align="middle", text="あいこで", font=self.font, color=(0, 0, 0), bgcolor=(255, 255, 255)) self.before_battle_sprite5 = TextSprite(*self.view_area.center, align="center", vertical_align="middle", text="しょ", font=self.font, color=(0, 0, 0), bgcolor=(255, 255, 255)) self.end_battle_sprite = TextSprite(*self.view_area.center, align="center", vertical_align="middle", text="そこまで", font=self.font, color=(0, 0, 0), bgcolor=(255, 255, 255)) # あいこ中フラグ self.pre_aiko = False