class Equipment: def __init__(self, screen, data): # データを保持 self.gun_data = data["gun_data"] self.equipment = data["equip"] self.chip_data = data["chip_data"] self.chip = data["chip"] # スクリーンの保持 self.screen = screen # 選択の初期値 self.change_gun = 0 # 現在選択している装備場所 self.change_chip = 0 self.change_id = 0 self.back = False # 一つ前の画面にもどるか # 操作の表記 self.screen_info = pygame.font.Font("font/freesansbold.ttf", 70).render("Equip", True, (255, 255, 255)) self.back_info = pygame.font.Font( "font/ShipporiMincho-TTF-Regular.ttf", 50).render("'Q' : 戻る", True, (255, 255, 255)) self.change_info = pygame.font.Font( "font/ShipporiMincho-TTF-Regular.ttf", 50).render("'C' : 切り替え", True, (255, 255, 255)) # リストボックスの作成 # Gun texts = [data["name"] for data in self.gun_data.values()] equip_listbox = ListBox(self.screen, 80, 200, 300, 250, texts, font_size=40, target=True,\ title="Gun", title_size=60) equip_listbox.set_selectable( [data["own"] == 1 for data in self.gun_data.values()]) # Chip texts = [data['name'] for data in self.chip_data.values()] chip_listbox = ListBox(self.screen, 80, 200, 300, 250, texts, font_size=40, target=True,\ title="Chip", title_size=60) chip_listbox += ['remove', 'remove ALL'] # 両方をリストに格納し、選択された方を描画 self.listboxes = [equip_listbox, chip_listbox] self.listbox = self.listboxes[self.change_id] # 現在の装備状況を描画するイメージボックスの作成 self.gun_image_box = ImageBox(screen, 700, 450, 90, 90, 3) self.chip_image_box = ImageBox(screen, 500, 450, 90, 90, 6) self.text_box = TextBox(screen, 550, 200, 550, 200, font_size=30) # 時間管理 self.clock = pygame.time.Clock() def do(self): while True: self.clock.tick(30) request = self.process() self.listbox() self.draw() if request != CONTINUE: return request def process(self): # 内部処理 # チップのリストボックスで、選択の可否を設定 select = [data["num"] > 0 for data in self.chip_data.values()] \ + [self.chip[self.change_chip]!=-1, self.chip!=[-1]*6] self.listboxes[1].set_selectable(select) # 装備状況のターゲット選択 self.gun_image_box.target = self.change_id == 0 self.chip_image_box.target = self.change_id == 1 # ユーザー入力 for event in pygame.event.get(): select = self.listbox.process(event) # リストボックスからアイテムが選択された if select != None: if self.change_id == 0: self.equip(select) else: self.set_chip(select) # 閉じるボタンが選択された if event.type == QUIT: # ゲーム終了のコードを返却する return EXIT # その他のキー入力が行われた if event.type == KEYDOWN: # イメージボックスの入力処理 if self.change_id == 0: self.gun_image_box.process(event.key) self.change_gun = self.gun_image_box.select else: self.chip_image_box.process(event.key) self.change_chip = self.chip_image_box.select # Qキーが入力された if event.key == K_q: # 一つ前の画面に戻る return BACK # Cキーが入力された elif event.key == K_c: self.change_id ^= 1 self.listbox = self.listboxes[self.change_id] return CONTINUE def draw(self): # 画面描画 self.screen.fill((0, 0, 0)) self.screen.blit(self.screen_info, [150, 20]) self.screen.blit(self.back_info, [850, 20]) self.screen.blit(self.change_info, [850, 90]) # リストボックスのカラー設定 self.listbox.color_reset() if self.change_id == 0: self.listbox.set_color(self.equipment, (105, 105, 255)) # リストボックスの描画 self.listbox.draw() # 選択中の情報表示 if self.change_id == 1: select = self.listbox.selected if select == len(self.listbox) - 1: text = '装備している全てのチップを外す。' elif select == len(self.listbox) - 2: text = '選択している装備済みのチップを外す。' else: text = self.chip_data[select]['info'] self.text_box.set_text(text) self.text_box.draw() # 装備情報の描画 if self.change_id == 0: self.draw_equip() else: self.draw_chip() # 画面更新 pygame.display.update() def draw_equip(self): # 装備中の銃情報の表示 data_list = [] id_list = [] for data in self.equipment: # 装備していない if data == -1: data_list.append(None) id_list.append(0) # 画像がある elif data == 0: data_list.append('img/gun_icon/' + str(data) + '/') id_list.append(3) # 画像がない else: data_list.append(data) id_list.append(0) self.gun_image_box.set_image(data_list, id_list) self.gun_image_box.draw() def draw_chip(self): # チップのIDを描画 pygame.draw.rect(self.screen, (255, 255, 255), Rect(500, HEIGHT - 150, 625, 100)) self.chip_image_box.set_image( [None if data == -1 else data for data in self.chip]) self.chip_image_box.draw() def equip(self, select): # 選択した銃を装備する。 if self.check(select): equipment = self.equipment equipment[self.change_gun] = select def check(self, select): # 装備変更確認 for i, gun in enumerate(self.equipment): # 選択した銃がすでに装備済み if gun == select: # その場所が1番目(リストでの0番目) if i == 0: PopupWindow(self.screen, "1番目に装備されています。\n場所の変更ができません。", ["OK"]).loop() return False # その位置に選択した銃がすでに装備されている if i == self.change_gun: return False # 変更可能な位置に装備している while True: if PopupWindow(self.screen, "すでに装備しています。\n場所を変更しますか?", \ ["変更する", "変更しない"]).loop() == 0: break else: return False # 装備していた銃を外す self.equipment[i] = -1 return True def _set_chip(self, i, select, size): # チップ装備処理 self.chip_data[select]['num'] -= 1 # チップが要するサイズ分セット for j in range(size): self.chip[i + j] = select def _remove_chip(self, i, size, chip_id_list): # 装備済みのチップを外す for j in range(i, i + size): chip = self.chip[j] if chip == -1: continue # 外したチップの情報 data = self.chip_data[chip] chip_size = data['equip_size'] # 所持数を1増やす data['num'] += 1 # チップを装備から外す j -= chip_id_list[j] for k in range(j, j + chip_size): self.chip[k] = -1 def set_chip(self, select): # チップが要する枠のサイズごとに番号をつける(3枠のチップなら、[0,1,2]と番号をつける) chip_id_list = [] i = 0 while i < 6: chip = self.chip[i] if chip == -1: size = 1 else: size = self.chip_data[chip]['equip_size'] chip_id_list += [j for j in range(size)] i += size # removeを選択したとき if select == len(self.listbox) - 2: PopupWindow(self.screen, "選択したチップを外します。", ['OK']).loop() self._remove_chip(self.change_chip, 1, chip_id_list) return # remove ALLを選択したとき if select == len(self.listbox) - 1: PopupWindow(self.screen, "すべてのチップを外します。", ['OK']).loop() for i in range(6): self._remove_chip(i, 1, chip_id_list) return chip_data = self.chip_data[select] # チップのサイズ size = chip_data['equip_size'] i = self.change_chip # 装備可能上限まで装備しているか equip_num = self.chip.count(select) if i + size > 6: PopupWindow(self.screen, "装備可能な枠に収まりません。", ['OK']).loop() return if chip_data['equip_max'] == equip_num / size: PopupWindow(self.screen, "装備できる上限に達しています。", ['OK']).loop() return # 選択中の枠にそのチップを装備しているか if self.chip[i] == select and chip_id_list[i] == 0: PopupWindow(self.screen, 'すでにそのチップをこの枠に装備しています。', ['OK']).loop() return # 選択中の枠にチップが装備されているか count = self.chip[i:i + size].count(-1) # -1が空枠 if count != size: if PopupWindow(self.screen, "必要な枠に装備されているチップをすべて外し、装備します。", ['OK', 'NO']).loop() == 1: return # 装備する場所にすでに装備されているチップを外す self._remove_chip(i, size, chip_id_list) # チップを装備する self._set_chip(i, select, size)
class SimpleWebbrowser: def __init__(self, width=800, height=600, url='http://localhost/'): self.VERSION = '0.2' self.USER_AGENT = 'SimpleWebBrowser/{version}'.format(version=self.VERSION) pygame.init() pygame.key.set_repeat(100, 1000 // 25) self.width = width self.height = height self.g = Graphics() self.g.surface = pygame.display.set_mode((self.width, self.height), pygame.RESIZABLE) self.text_box = TextBox(0, 0, self.width, self.height) FONT_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../fonts/dejavu-fonts/ttf/') self.g.font = pygame.font.Font(os.path.join(FONT_DIR, 'DejaVuSansMono.ttf'), 16) pygame.display.set_caption('SimpleWebBrowser V{version}'.format(version=self.VERSION)) r = requests.get(url, headers={'user-agent': self.USER_AGENT}) self.html_sourcecode = r.text html_parser = etree.HTMLParser(remove_blank_text=True) html_tree = etree.fromstring(self.html_sourcecode, html_parser) text = etree.tostring(html_tree, encoding='unicode', method='text') self.text_box.set_text(text) self.text_box.layout(self.g) def set_size(self, size): self.width = size[0] self.height = size[1] self.g.surface = pygame.display.set_mode(size, pygame.RESIZABLE) self.text_box.set_size(self.width, self.height) self.text_box.layout(self.g) def draw(self, g): g.surface.fill((255, 255, 255)) self.text_box.draw(g) def run(self): while True: self.draw(self.g) pygame.display.flip() event = pygame.event.wait() if event.type == pygame.QUIT: break if event.type == pygame.VIDEORESIZE: self.set_size(event.size) if event.type == pygame.MOUSEMOTION: continue if event.type == pygame.MOUSEBUTTONUP: continue if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: break elif event.key == pygame.K_UP : self.text_box.scroll( 0, -5) elif event.key == pygame.K_DOWN : self.text_box.scroll( 0, 5) elif event.key == pygame.K_LEFT : self.text_box.scroll(-20, 0) elif event.key == pygame.K_RIGHT: self.text_box.scroll( 20, 0) elif event.key == pygame.K_PAGEUP : self.text_box.scroll_page_up() elif event.key == pygame.K_PAGEDOWN: self.text_box.scroll_page_down() elif event.key == pygame.K_HOME: if event.mod & pygame.KMOD_SHIFT: self.text_box.scroll_x_home() else: self.text_box.scroll_y_home() elif event.key == pygame.K_END: if event.mod & pygame.KMOD_SHIFT: self.text_box.scroll_x_end() else: self.text_box.scroll_y_end() def quit(self): pygame.quit()
if len(list) == 0: gameWon = True hoverPos = pygame.mouse.get_pos() for rect in list: if (rect.collidepoint(hoverPos)): pygame.draw.rect(screen, (15, 100, 15), rect, 0) TEXTBOX.draw(screen) for event in pygame.event.get(): if event.type == pygame.QUIT: gameOver = True elif event.type == pygame.KEYDOWN: if TEXTBOX.is_active(): if event.unicode.isnumeric(): TEXTBOX.set_text(TEXTBOX.get_text() + str(event.unicode)) elif event.key == pygame.K_RETURN: TEXTBOX.set_active(False) gameBoardPos = convertScaledPos() editGameBoard(gameBoardPos[0], gameBoardPos[1]) TEXTBOX.set_text("") elif event.key == pygame.K_BACKSPACE: TEXTBOX.set_text(TEXTBOX.get_text()[:-1]) elif event.type == pygame.MOUSEBUTTONUP: if not TEXTBOX.is_active(): POS = pygame.mouse.get_pos() SCALED_POS = tuple( BOARD_RATIO * np.array(POS) ) #scale position to account for fact that screen is larger than board gameBoardPos = convertScaledPos()