コード例 #1
0
ファイル: main.py プロジェクト: homdx/PlanetAppV2
class PlanetApp(App):

    # SCREENS AND SCREENMANAGER
    screenmanager = ObjectProperty(None)
    mainscreen = ObjectProperty(None)
    menuscreen = ObjectProperty(None)
    settingsscreen = ObjectProperty(None)
    savegamescreen = ObjectProperty(None)
    creditsscreen = ObjectProperty(None)

    logic = ObjectProperty(None)

    def build(self):
        self.calc_iconsize()
        self.settings = ConfigController('settings.json')
        self.logic = Logic(settings=self.settings)

        self.screenmanager = ScreenManager()

        self.mainscreen = MainScreen(logic=self.logic,
                                     iconsize=self.iconsize,
                                     iconratio_x=self.iconratio_x,
                                     iconratio_y=self.iconratio_y,
                                     name='main')

        # MenuScreen does not need logic
        self.menuscreen = MenuScreen(name='menu')

        self.settingsscreen = SettingsScreen(logic=self.logic,
                                             iconsize=self.iconsize,
                                             iconratio_x=self.iconratio_x,
                                             iconratio_y=self.iconratio_y,
                                             name='settings')

        self.savegamescreen = SavegameScreen(logic=self.logic,
                                             iconsize=self.iconsize,
                                             iconratio_x=self.iconratio_x,
                                             iconratio_y=self.iconratio_y,
                                             name='savegames')

        self.creditsscreen = CreditsScreen(iconsize=self.iconsize,
                                           name='credits')

        # XXX: order adding here reflects which screen is shown first!
        self.screenmanager.add_widget(self.menuscreen)
        self.screenmanager.add_widget(self.mainscreen)
        self.screenmanager.add_widget(self.settingsscreen)
        self.screenmanager.add_widget(self.savegamescreen)
        self.screenmanager.add_widget(self.creditsscreen)

        self.logic.apply_settings()

        return self.screenmanager

    def on_start(self):
        # self.load_settings()
        # self.logic.load_transitions()
        self.load_game()

    def on_stop(self):
        self.save_settings()
        self.save_game()

    def save_settings(self):
        self.settings.save()

    def load_game(self, slot='current'):
        save_name = 'save_{slot}.json'.format(slot=slot)
        save_exists = os.path.exists(save_name)
        if save_exists:
            self.logic.reset_planets(self)
            with open(save_name, 'r') as save_file:
                json_d = save_file.readline()
                planets_d = json.loads(json_d)
            for planet_d in planets_d.values():
                # make tuples from pos and vel
                pos = (planet_d['position_x'], planet_d['position_y'])
                vel = (planet_d['velocity_x'], planet_d['velocity_y'])
                self.logic.add_body(pos=pos, vel=vel, **planet_d)

    def save_game(self, slot='current'):
        # make deepcopy to avoid deleting widget ref from actual logic.planets
        planets_d = copy.deepcopy(self.logic.planets)
        # delete widget reference, it's not needed in savegames
        for index in planets_d:
            planets_d[index].pop('widget')

        json_d = json.dumps(planets_d)
        with open('save_{}.json'.format(slot), 'w') as save_file:
            save_file.write(json_d)

    def scan_savegames(self):
        save_mtimes = {}
        for i in range(1, 6):
            save_name = 'save_{}.json'.format(i)
            save_exists = os.path.exists(save_name)
            if save_exists:
                time_raw = os.path.getmtime('save_{}.json'.format(i))
                time_save = time.ctime(time_raw)
                save_mtimes[i] = str(time_save)
            else:
                save_mtimes[i] = '<Empty>'

        return save_mtimes

    def calc_iconsize(self):
        # TODO: is this neccessary?
        icon_count = 8
        window_height = Window.height
        window_width = Window.width
        iconsize = window_height / icon_count
        self.iconratio_y = float(iconsize) / window_height
        self.iconratio_x = float(iconsize) / window_width
        self.iconsize = iconsize
コード例 #2
0
ファイル: main.py プロジェクト: gandie/PlanetAppV2
class PlanetApp(App):

    # SCREENS AND SCREENMANAGER
    screenmanager = ObjectProperty(None)
    mainscreen = ObjectProperty(None)
    menuscreen = ObjectProperty(None)
    settingsscreen = ObjectProperty(None)
    savegamescreen = ObjectProperty(None)
    creditsscreen = ObjectProperty(None)

    logic = ObjectProperty(None)

    def build(self):
        self.title = 'PocketCosmos'
        self.calc_iconsize()
        self.settings = ConfigController('settings.json')

        self.sound_manager = SoundManager(settings=self.settings)

        self.logic = Logic(
            settings=self.settings,
            sound_manager=self.sound_manager
        )

        self.screenmanager = ScreenManager()

        self.mainscreen = MainScreen(
            logic=self.logic,
            iconsize=self.iconsize,
            iconratio_x=self.iconratio_x,
            iconratio_y=self.iconratio_y,
            name='main'
        )

        # MenuScreen does not need logic
        self.menuscreen = MenuScreen(name='menu')

        self.settingsscreen = SettingsScreen(
            logic=self.logic,
            iconsize=self.iconsize,
            iconratio_x=self.iconratio_x,
            iconratio_y=self.iconratio_y,
            name='settings'
        )

        self.savegamescreen = SavegameScreen(
            logic=self.logic,
            iconsize=self.iconsize,
            iconratio_x=self.iconratio_x,
            iconratio_y=self.iconratio_y,
            name='savegames'
        )

        self.creditsscreen = CreditsScreen(
            iconsize=self.iconsize,
            name='credits'
        )

        # order adding here reflects which screen is shown first!
        self.screenmanager.add_widget(self.menuscreen)
        self.screenmanager.add_widget(self.mainscreen)
        self.screenmanager.add_widget(self.settingsscreen)
        self.screenmanager.add_widget(self.savegamescreen)
        self.screenmanager.add_widget(self.creditsscreen)

        self.logic.apply_settings()

        return self.screenmanager

    def on_start(self):
        self.load_game()

    def on_stop(self):
        self.settings.save()
        self.save_game()

    def load_game(self, slot='current'):
        save_name = 'save_{slot}.json'.format(slot=slot)
        save_exists = os.path.exists(save_name)
        if save_exists:
            self.logic.reset_planets(self)
            with open(save_name, 'r') as save_file:
                json_d = save_file.readline()
                planets_d = json.loads(json_d)
            for planet_d in planets_d.values():
                # make tuples from pos and vel
                pos = (planet_d['position_x'], planet_d['position_y'])
                vel = (planet_d['velocity_x'], planet_d['velocity_y'])
                self.logic.add_body(pos=pos, vel=vel, **planet_d)

    def save_game(self, slot='current'):
        # make deepcopy to avoid deleting widget ref from actual logic.planets
        #planets_d = copy.deepcopy(self.logic.planets)

        planets_d = {
            index: {
                key: value
                for key, value in item.items()
                if key != 'widget'
            }
            for index, item in self.logic.planets.items()
        }
        # delete widget reference, it's not needed in savegames

        '''
        for index in planets_d:
            planets_d[index].pop('widget')
        '''

        json_d = json.dumps(planets_d)
        with open('save_{}.json'.format(slot), 'w') as save_file:
            save_file.write(json_d)

    def scan_savegames(self):
        save_mtimes = {}
        for i in range(1, 6):
            save_name = 'save_{}.json'.format(i)
            save_exists = os.path.exists(save_name)
            if save_exists:
                time_raw = os.path.getmtime(save_name)
                time_save = time.ctime(time_raw)
                save_mtimes[i] = str(time_save)
            else:
                save_mtimes[i] = '<Empty>'

        return save_mtimes

    def calc_iconsize(self):
        # TODO: is this neccessary?
        icon_count = 8
        window_height = Window.height
        window_width = Window.width
        iconsize = window_height / icon_count
        self.iconratio_y = float(iconsize) / window_height
        self.iconratio_x = float(iconsize) / window_width
        self.iconsize = iconsize

    def build_config(self, config):
        config.setdefaults('graphics', {
            'maxfps': '30'
        })