diff options
| author | vg <vgm+dev@devys.org> | 2022-11-28 00:27:42 +0100 | 
|---|---|---|
| committer | vg <vgm+dev@devys.org> | 2022-11-28 00:27:42 +0100 | 
| commit | c02177e4967c63b579b4b936b8f8f87663a4560a (patch) | |
| tree | 4a5e626900f55161446687ffa5769330d0a9a6c2 /pygame/main.py | |
| parent | c3ac27e6f26bd3ebcaa8f3bd620c2d4619aa8de6 (diff) | |
| download | gamechest-c02177e4967c63b579b4b936b8f8f87663a4560a.tar.gz gamechest-c02177e4967c63b579b4b936b8f8f87663a4560a.tar.bz2 gamechest-c02177e4967c63b579b4b936b8f8f87663a4560a.zip | |
git-sync on dita
Diffstat (limited to 'pygame/main.py')
| -rwxr-xr-x | pygame/main.py | 178 | 
1 files changed, 156 insertions, 22 deletions
| diff --git a/pygame/main.py b/pygame/main.py index 948b95a..ba61077 100755 --- a/pygame/main.py +++ b/pygame/main.py @@ -7,6 +7,11 @@ from pathlib import Path  import pygame  import yaml +from profiledb import ProfileDB + +from gamechest.cliactions import run +from gamechest.gamedb import GameDB +  #WINDOW_RESOLUTION = (1280, 720)  WINDOW_RESOLUTION = (800, 600) @@ -24,19 +29,32 @@ class AppState:      menu_selected_index: int = 0 +class Parameters: +    key_delay = 330 +    key_interval = 1000//25 + + + +  class GuiApp:      def __init__(self):          pygame.init() +        pygame.key.set_repeat(Parameters.key_delay, Parameters.key_interval)          #print(pygame.display.list_modes())          self.window = pygame.display.set_mode(WINDOW_RESOLUTION)          self.clock = pygame.time.Clock() +        self.cycles_per_second = 60 +        #self.render_factor_div = 2 # 60/2 => 30fps +        #self.input_factor_div = 6 # 60/6 => 10 input repeat per second          self.menu_font = pygame.font.Font(pygame.font.get_default_font(), 32)          self.font_antialias = True          #self.font_antialias = False          self.menu_color = (0, 0, 200) +        self.render_timer = 0 +        self.render_timeout = 1000//30 # 30 fps -    def process_input(self, event=None): +    def process_input(self, last_frame_time, event=None):          if event is None:              event = pygame.event.poll()          if event.type == pygame.KEYDOWN: @@ -46,10 +64,15 @@ class GuiApp:          if event.type == pygame.QUIT:              raise QuitEvent() -    def update(self): +    def update(self, last_frame_time):          pass -    def render(self): +    def render(self, last_frame_time): +        self.render_timer += last_frame_time +        if self.render_timer < self.render_timeout: +            return +        self.render_timer = 0 +          self.window.fill((0, 0, 0))          # Initial y @@ -98,13 +121,26 @@ class GuiApp:      def loop(self): - +        #current_render_div = self.render_factor_div +        #current_input_div = self.input_factor_div +        last_frame_time = 1 # equivalent to 0 but avoid div0 +        last_render_time = 1          try:              while 1: -                self.process_input() -                self.update() -                self.render() -                self.clock.tick(30) # 30 fps +                #current_render_div -= 1 +                #current_input_div -= 1 +                self.process_input(last_frame_time) +                #self.update(current_input_div) +                self.update(last_frame_time) +                self.render(last_frame_time) +                #if current_render_div <= 0: +                #    self.render(last_render_time) +                #    current_render_div = self.render_factor_div +                #    last_render_time = 0 +                #if current_input_div <= 0: +                #    current_input_div = self.input_factor_div +                last_frame_time = self.clock.tick(self.cycles_per_second) +                #last_render_time += last_frame_time          except QuitEvent:              pass @@ -112,23 +148,107 @@ class GuiApp:          pygame.quit() -class GuiAppSub1(GuiApp): +class ProfileDataObserver: + +    def event_current_profile_changed(self, new_profile): +        pass + + +class ObservedSubject: +    def __init__(self): +        self.observers = [] + +    def add_observer(self, observer): +        self.observers.append(observer) + +    def del_observer(self, observer): +        self.observers.remove(observer) + +    def notify_event(self, event_name, *args, **kws): +        for observer in self.observers: +            getattr(observer, event_name)(*args, **kws) + + +class ProfileData(ObservedSubject):      def __init__(self):          super().__init__() +        self.profiledb = ProfileDB() +        self.profiles_len = len(self.profiledb.get_profiles()) +        self.current_profile_index = 0 + +    def change_active_profile(self, new_index): +        if new_index < 0: +            new_index = 0 +        elif new_index >= self.profiles_len: +            new_index = self.profiles_len-1 +        if self.current_profile_index != new_index: +            print('new index', self.current_profile_index, '->', new_index) +            self.current_profile_index = new_index +            print(id(self), 'new index', self.current_profile_index) +            self.notify_event('event_current_profile_changed', +                              self.get_current_profile()) + +    def change_profile_increase(self): +        self.change_active_profile(self.current_profile_index +1) + +    def change_profile_decrease(self): +        self.change_active_profile(self.current_profile_index -1) + +    def get_current_profile(self): +        return self.profiledb.get_profiles()[self.current_profile_index]['name'] + +    def get_current_display(self): +        return self.profiledb.get_profiles()[self.current_profile_index]['display'] + + +class ProfileRenderer(ProfileDataObserver): + +    def __init__(self, profiledata): +        self.profiledata = profiledata +        self.surface_to_render = None +        profiledata.add_observer(self) +        self.font_filename = pygame.font.match_font('bitstreamverasans') +        print('ProfileRenderer font:', self.font_filename) +        self.font = pygame.font.Font(self.font_filename, 24) +        self.font_antialias = True +        self.font_fg_color = (0, 200, 200) + +    def event_current_profile_changed(self, new_profile): +        self.surface_to_render = None +        print('changing rendering profile to', new_profile) + +    def render(self, surface): +        if self.surface_to_render is None: +            profile_name = self.profiledata.get_current_profile() +            new_surface = self.font.render(self.profiledata.get_current_display(), self.font_antialias, self.font_fg_color) +            self.surface_to_render = new_surface +        surface.blit(self.surface_to_render, (50, 50)) + + +class GuiAppSub1(GuiApp): +    def __init__(self): +        super().__init__() +        self.input_timer = 0 +        self.input_timeout = 1000//10          self.state = AppState()          self.base_window_fill_color = (0, 0, 0)          self.user_move_vector = (0, 0) -        with Path('~/games/.saves/gamedata.yaml').expanduser().open() as fp: -            self.gamedb = yaml.safe_load(fp) -        self.menu_items = [x['title'] for x in self.gamedb['games']] +        #with Path('~/games/.saves/gamedata.yaml').expanduser().open() as fp: +        #    self.gamedb = yaml.safe_load(fp) +        self.game_db = GameDB() +        #self.menu_items = [x['title'] for x in self.gamedb['games']] +        self.menu_items = list(self.game_db.get_ids())          self.menu_font_cache = ({}, [])          self.menu_font_cache_max = 40 -        self.image_right_arrow = pygame.image.load('arrow-right.png') +        self.image_right_arrow = pygame.image.load('arrow-right.png').convert()          #self.last_movement_update_time = self.clock.          self.joysticks = {}          self.joysticks_axis_threshold = 0 +        self.profile_data = ProfileData() +        self.profile_renderer = ProfileRenderer(self.profile_data) +      def menu_font_render(self, text):          cached_surface = self.menu_font_cache[0].get(text, None) @@ -153,7 +273,8 @@ class GuiAppSub1(GuiApp):          return new_surface -    def process_input(self): +    def process_input(self, last_frame_time): +          movement_up_keys = (              pygame.K_UP,              pygame.K_k, @@ -168,22 +289,22 @@ class GuiAppSub1(GuiApp):              x, y = self.user_move_vector              if event.type == pygame.KEYDOWN:                  if event.key in (*movement_up_keys, *movement_down_keys): -                    y += 1 if event.key in movement_down_keys else -1 +                    y = 1 if event.key in movement_down_keys else -1                      go_super = 0                  elif event.key in (pygame.K_LEFT, pygame.K_RIGHT): -                    x += 1 if event.key == pygame.K_LEFT else -1 +                    x = -1 if event.key == pygame.K_LEFT else 1                      go_super = 0              elif event.type == pygame.KEYUP:                  x, y = self.user_move_vector                  if event.key in (*movement_up_keys, *movement_down_keys): -                    y -= 1 if event.key in movement_down_keys else -1 +                    y = 0                      go_super = 0                  elif event.key in (pygame.K_LEFT, pygame.K_RIGHT): -                    x -= 1 if event.key == pygame.K_LEFT else -1 +                    x = 0                      go_super = 0              elif event.type in (pygame.JOYBUTTONDOWN, pygame.JOYBUTTONUP):                  go_super = 0 -                factor = 1 if pygame.JOYBUTTONDOWN else -1 +                factor = 1 if pygame.JOYBUTTONDOWN else 0                  joystick = self.joysticks[event.instance_id]                  print('gamepad event', event)                  #if event.button == 0: @@ -226,9 +347,14 @@ class GuiAppSub1(GuiApp):                      self.user_move_vector = (x, y)                  print('new move vector:', self.user_move_vector)              else: -                super().process_input(event) +                super().process_input(last_frame_time, event) + +    def update(self, last_frame_time): +        #self.input_timer += last_frame_time +        #if self.input_timer < self.input_timeout: +        #    return +        #self.input_timer = 0 -    def update(self):          menu_new_index = self.state.menu_selected_index          if self.user_move_vector[1] < 0:              menu_new_index -= 1 @@ -240,7 +366,14 @@ class GuiAppSub1(GuiApp):              menu_new_index = len(self.menu_items)-1          self.state.menu_selected_index = menu_new_index -    def render(self): +        if self.user_move_vector[0] < 0: +            self.profile_data.change_profile_decrease() +        elif self.user_move_vector[0] > 0: +            self.profile_data.change_profile_increase() + +        self.user_move_vector = (0, 0) + +    def render(self, last_frame_time):          self.window.fill(self.base_window_fill_color)          # Initial y @@ -299,6 +432,7 @@ class GuiAppSub1(GuiApp):          #pygame.draw.rect(self.window,          #                (0,0,255),          #                (120,120,400,240)) +        self.profile_renderer.render(self.window)          pygame.display.update() | 
