예제 #1
0
    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])
예제 #2
0
    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()
예제 #3
0
 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()
예제 #4
0
 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()
예제 #5
0
 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()
예제 #6
0
 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()
예제 #7
0
    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)
예제 #8
0
 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()