def add_block(self, position, block, immediate=True, record=True): """ 在 position 处添加一个方块 :param: pssition 长度为3的元组, 要添加方块的位置 :param: block 方块 :param: immediate 是否立即绘制方块 :param: record 是否记录方块更改(在生成地形时不记录) """ if position in self.world: self.remove_block(position, immediate, record=False) if -64 <= position[1] < 512: # 建筑限制为-64格以上, 512格以下 if record == True: self.change[pos2str(position)] = block if block in blocks: self.world[position] = blocks[block] self.world[position].on_build(get_game(), position) else: # 将不存在的方块替换为 missing self.world[position] = blocks['missing'] self.sectors.setdefault(sectorize(position), []).append(position) if self.exposed(position): self.show_block(position) if not self.world[position].transparent: self.check_neighbors(position) else: if position[1] >= 256: get_game().dialogue.add_dialogue( get_lang('game.text.build_out_of_world')[0] % 512) else: get_game().dialogue.add_dialogue( get_lang('game.text.build_out_of_world')[1])
def rename(self): # 重命名对话框 self.rename_dialog = Toplevel(self) self.rename_dialog.title(get_lang('launcher.dialog.title.rename')) self.rename_dialog_label = ttk.Label(self.rename_dialog, style='TLabel', text=get_lang('launcher.dialog.text.name')) self.rename_dialog_entry = ttk.Entry(self.rename_dialog) name = self.game_item_list.curselection() name = self.game_item_list.get(0) if name == () else self.game_item_list.get(name) self.rename_dialog_entry.insert(0, name) def send_name(): self.rename_world(name) self.old = os.path.join(path['save'], self.rename_dialog_entry.get()) self.rename_dialog_button = ttk.Button(self.rename_dialog, text=get_lang('launcher.dialog.text.ok'), command=send_name) self.rename_dialog_label.grid(column=0, row=0, padx=5, pady=5) self.rename_dialog_entry.grid(column=1, row=0, columnspan=2, padx=5, pady=5) self.rename_dialog_button.grid(column=2, row=1, padx=5, pady=5) self.rename_dialog.resizable(False, False) self.rename_dialog.geometry('+%d+%d' % (self.winfo_x() + 50, self.winfo_y() + 50)) self.rename_dialog.transient(self) self.rename_dialog.deiconify() self.rename_dialog.grab_set() self.rename_dialog.wait_window() self.rename_dialog.mainloop()
def new(self, event=None): # 新的世界对话框 self.new_dialog = Toplevel(self) self.new_dialog.title(get_lang('launcher.dialog.title.new')) self.new_dialog_label_name = ttk.Label(self.new_dialog, text=get_lang('launcher.dialog.text.name')) self.new_dialog_entry_name = ttk.Entry(self.new_dialog) self.new_dialog_label_seed = ttk.Label(self.new_dialog, text=get_lang('launcher.dialog.text.seed')) self.new_dialog_entry_seed = ttk.Entry(self.new_dialog) self.new_dialog_label_type = ttk.Label(self.new_dialog, text='Type:') self.new_dialog_combobox_type = ttk.Combobox(self.new_dialog, values = ('flat', 'random'), width=8) self.new_dialog_combobox_type.state(['readonly']) self.new_dialog_button_ok = ttk.Button(self.new_dialog, text=get_lang('launcher.dialog.text.ok'), command=self.new_world ) self.new_dialog_label_name.grid(column=0, row=0, padx=5, pady=5) self.new_dialog_entry_name.grid(column=1, row=0, columnspan=2, padx=5, pady=5) self.new_dialog_label_seed.grid(column=0, row=1, padx=5, pady=5) self.new_dialog_entry_seed.grid(column=1, row=1, columnspan=2, padx=5, pady=5) self.new_dialog_label_type.grid(column=0, row=2, padx=5, pady=5) self.new_dialog_combobox_type.grid(column=1, row=2, pady=5) self.new_dialog_button_ok.grid(column=2, row=3, padx=5, pady=5) self.new_dialog.resizable(False, False) self.new_dialog.geometry('+%d+%d' % (self.winfo_x() + 50, self.winfo_y() + 50)) self.new_dialog.transient(self) self.new_dialog.deiconify() self.new_dialog.grab_set() self.new_dialog.wait_window() self.new_dialog.mainloop()
def draw_label(self): if not self.is_init: if self.exclusive: self.dialogue.draw() if self.player['die']: # 玩家死亡 self.die_info.text = get_lang('game.text.die') self.label['actionbar'].text = self.player['die_reason'] self.die_info.draw() self.label['actionbar'].draw() elif self.debug['debug'] and self.exclusive: x, y, z = self.player['position'] rx, ry = self.player['rotation'] mem = round( psutil.Process(os.getpid()).memory_full_info()[0] / 1048576, 2) fps = pyglet.clock.get_fps() info_ext = [] self.label['top'].text = '\n'.join( get_lang('game.text.debug')) % (VERSION['str'], ', '.join( self._info_ext), x, y, z, rx, ry, mem, fps) self.label['top'].draw() else: # 初始化屏幕 self.loading.draw()
def delete(self, event=None): # 删除世界 if self.game_item_list.curselection() == (): select = self.game_item_list.get(0) else: select = self.game_item_list.get(self.game_item_list.curselection()[0]) if messagebox.askyesno(message=get_lang('launcher.dialog.text.delete') % select, title=get_lang('launcher.dialog.title.delete')): shutil.rmtree(os.path.join(path['save'], select)) self.refresh()
def __init__(self): try: Tk.__init__(self) except: log_err('no display, exit') exit(1) self.title(get_lang('launcher.title')) if settings['use-theme'] != 'ttk': theme_path = os.path.dirname(os.path.abspath(__file__)) + '/theme/' + settings['use-theme'] self.tk.eval('lappend auto_path {%s}' % theme_path) ttk.Style().theme_use(settings['use-theme']) # 小部件 self.new_button = ttk.Button(self, text=get_lang('launcher.new'), command=self.new) self.start_button = ttk.Button(self, text=get_lang('launcher.start'), command=self.start_game) self.exit_button = ttk.Button(self, text=get_lang('launcher.exit'), command=lambda: exit()) self.game_item_list = Listbox(self, height=12) self.vscroll = ttk.Scrollbar(self, orient='vertical', command=self.game_item_list.yview) self.game_item_list.configure(yscrollcommand=self.vscroll.set) self.repair_button = ttk.Button(self, text=get_lang('launcher.repair'), command=self.repair) self.del_button = ttk.Button(self, text=get_lang('launcher.delete'), command=self.delete) self.rename_button = ttk.Button(self, text=get_lang('launcher.rename'), command=self.rename) # 显示 self.new_button.grid(column=0, row=0, padx=5, pady=5) self.start_button.grid(column=1, row=0, padx=5, pady=5) self.exit_button.grid(column=2, row=0, padx=5, pady=5) self.game_item_list.grid(column=0, columnspan=4, row=1, padx=3, pady=5, sticky='news') self.vscroll.grid(column=4, row=1, padx=2, pady=5, sticky='nes') self.repair_button.grid(column=0, row=2, padx=5, pady=5) self.del_button.grid(column=1, row=2, padx=5, pady=5) self.rename_button.grid(column=2, row=2, padx=5, pady=5) self.resizable(False, False) self.refresh()
def check_die(self, dt): """ 这个函数被 pyglet 计时器反复调用 :param: dt 距上次调用的时间 """ return if not self.player['die']: if self.player['position'][1] < -64: self.player['die_reason'] = get_lang('game.text.die.fall_into_void') % player['name'] self.player['die'] = True self.dialogue.add_dialogue(self.player['die_reason']) elif self.player['position'][1] > 512: self.player['die_reason'] = get_lang('game.text.die.no_oxygen') % player['name'] self.player['die'] = True if self.player['die']: log_info('%s die: %s' % (player['name'], self.player['die_reason'])) self.dialogue.add_dialogue(self.player['die_reason']) self.set_exclusive_mouse(False)
def draw_label(self): if not self.is_init: if self.exclusive: self.dialogue.draw() if self.player['die']: # 玩家死亡 self.die_info.text = get_lang('game.text.die') self.label['actionbar'].text = self.player['die_reason'] self.die_info.draw() self.label['actionbar'].draw() elif self.debug['debug'] and self.exclusive: x, y, z = self.player['position'] rx, ry = self.player['rotation'] mem = round(psutil.Process(os.getpid()).memory_full_info()[0] / 1048576, 2) fps = pyglet.clock.get_fps() text = '\n'.join(get_lang('game.text.debug')) text = text.replace('%(version)', VERSION['str']).replace('%(info)', ', '.join(self._info_ext)) text = text.replace('%(xyz)', '%.1f, %.1f, %.1f' % (x, y, z)).replace('%(rot)', '%.2f, %.2f' % (rx, ry)) text = text.replace('%(mem)', '%.2f' % mem).replace('%(fps)', '%d' % fps) self.label['top'].text = text self.label['top'].draw() else: # 初始化屏幕 self.loading.draw()