示例#1
0
class Core:
    __timer: Timer
    __entity_manager: EntityManager
    __renderer: Renderer
    __config: Config
    __level: int
    __score: int
    __best_score: int
    __status: Status
    __key_status: KeyStatus

    def __init__(self, config: Config):
        self.__timer = Timer()
        self.__config = config
        self.__status = Status.START
        self.__level = 0
        self.__score = 0
        self.__best_score = 0
        self.__entity_manager = EntityManager(self.__config)
        self.__renderer = Renderer(self.__config)

    def __update_key_status(self):
        self.__key_status += KeyStatus.get_status()

    def __update(self) -> None:
        self.__update_key_status()
        if self.__status == Status.START and pyxel.btn(pyxel.KEY_S):
            self.__entity_manager.init()
            self.__status = Status.GAMING
        elif pyxel.btn(pyxel.KEY_R):
            self.__level = 0
            self.__score = 0
            self.__status = Status.START
        elif self.__timer.time_pass_ns > self.__config.get_tick_time(
                self.__level) and self.__status == Status.GAMING:
            try:
                lines = self.__entity_manager.process_tick(self.__key_status)
            except DeathException:
                self.__status = Status.DEATH
            else:
                self.__score += lines * self.__config.score_per_line
                self.__best_score = max(self.__score, self.__best_score)
                self.__level = self.__score // self.__config.score_per_level

            self.__key_status = KeyStatus.get_status()

            self.__timer.start()

    def __render(self) -> None:
        self.__renderer.render(
            Content(status=self.__status,
                    block_map=self.__entity_manager.block_map,
                    entity=self.__entity_manager.current_entity,
                    current_score=self.__score,
                    best_score=self.__best_score,
                    level=self.__level))

    def run(self) -> None:
        pyxel.init(width=self.__config.width,
                   height=self.__config.height,
                   caption=self.__config.translate.title,
                   palette=Color.get_palette(),
                   quit_key=pyxel.KEY_ESCAPE)
        play_sound()
        self.__key_status = KeyStatus.get_status()
        self.__timer.start()
        pyxel.run(self.__update, self.__render)