Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

pytanie dotyczące event handlera i update funkcji.

Ostatnio zmodyfikowano wczoraj o godz. 21:02
Autor Wiadomość
aaadam
Temat założony przez niniejszego użytkownika
pytanie dotyczące event handlera i update funkcji.
» 2025-12-12 16:19:39
Witam, dawno już nie prograłowałem gier ale ostanio wróciłem, ostatnio się dowiedziałem, że warto np w taki sposób pisać gry:

What stays in handle_event():

✅ Pause (ESC) - needs immediate response
✅ Game over input (R, ESC) - needs immediate response
✅ Upgrade menu - has its own event handler

What moves to update():

✅ Dash (Spacebar)
✅ Bomb (Right click)
✅ Debug toggle (F3)

wcześniej klikanie, oraz eventy myszy mialem w event_handlerze, zastanawiam się czy to dobre podejście do tego:
po refaktoringu moja funkcja event_haandler wyglada tak i wywołuje sie przed update:
   

     def handle_event(self, event):
        """Handle game events"""

        # ✅ Pause toggle (keep in event loop for immediate response)
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                if not self.game_over and not self.upgrade_menu.active:
                    self.paused = not self.paused
                    logger.info(f"Game {'paused' if self.paused else 'resumed'}")
                    return

        # Handle game over input
        if self.game_over:
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_r:
                    self.restart()
                    return
                elif event.key == pygame.K_ESCAPE:
                    self.running = False
                    return

        # Handle upgrade menu input
        if self.upgrade_menu.active:
            selected_index = self.upgrade_menu.handle_input(event)
            if selected_index is not None:
                self._apply_upgrade(selected_index)
                return
poniżej początek funkcji update:

    def update(self, dt):
        """Update game state"""
        if self.paused or self.game_over:
            return

        self.game_time += dt

        # ✅ UPDATE INPUT FIRST
        self.input_handler.update(self.camera.offset)

        # ✅ Get input from handler
        self.mouse_screen_pos = self.input_handler.get_mouse_screen_pos()
        self.mouse_world_pos = self.input_handler.get_mouse_world_pos()
        dx, dy = self.input_handler.get_movement_vector()

        # ✅ HANDLE ACTIONS (before player update)

        # Dash action
        if self.input_handler.dash_pressed():
            self.player.try_dash(dx, dy)

        # Bomb action
        if self.input_handler.bomb_pressed():
            self.player.place_bomb(self.bombs)
Jakiś ekspert może się wypowiedzieć ? czy to po prostu nie ma znaczenia bo to i tak po sobie tak na prawdę występuje ponieważ główna funkcja wygląda tak :
   

   while game.running:
        dt = clock.tick(WindowConfig.FPS) / 1000.0
        # Handle events
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game.running = False
            game.handle_event(event)

        # Update game state
        game.update(dt)
wiem, że to nie c lub c++ ale to mi chodzi bardziej o ogólne podejście do tematu nie zależnie od języka programowania:)
Pozdrawiam
P-183625
DejaVu
» 2025-12-12 16:59:19
Podejście do tematu jest takie, aby dążyć do zamykania funkcjonalności w dobrze nazwanych metodach, aby 'flow instrukcji' w miejscu, gdzie więcej się dzieje, sprowadzał się do ifów w których decyzje są podejmowanie głównie na podstawie wyników wyołań z metod oraz potem wywołują kolejny ciąg metod. Czyli np. w C++:

C/C++
void FunkcjaObslugujacaEventy( ... )
{
   
if( event.key == KeyEscape )
   
game.Pause( !game.IsPaused() )
   
   
if( event.key == KeyR )
       
 game.Restart();
   
   
if( event.mouse == LeftButtonClick )
       
 game.Fire( player );
   
   
}

W osobnej klasie trzymasz logikę i tylko wywołujesz metody w miejscu, w którym dochodzi do interakcji/złożonej if-ologii.
P-183626
aaadam
Temat założony przez niniejszego użytkownika
» 2025-12-12 20:59:25
oki rozumiem, a jeżeli chodzi o eventy, mam po staremu czyli Tight Coupling, warto iść w Event Bus?

The Event Bus uses the PUBLISH/SUBSCRIBE pattern:

OLD WAY (Tight Coupling):
    enemy.kill()
    audio_manager.play_sound("enemy_death")    # Direct call
    effect_manager.enemy_death(enemy)          # Direct call
    stats.increment_kills()                    # Direct call
    achievement_system.check_milestone()       # Direct call
   
    Problem: enemy.kill() must know about ALL these systems!

NEW WAY (Event Bus - Loose Coupling):
    event_bus.emit("enemy_killed", enemy=enemy_type)
   
    # Systems subscribe independently:
    event_bus.subscribe("enemy_killed", audio.on_enemy_killed)
    event_bus.subscribe("enemy_killed", effects.on_enemy_killed)
    event_bus.subscribe("enemy_killed", stats.on_enemy_killed)
    event_bus.subscribe("enemy_killed", achievements.on_enemy_killed)
   
    Benefit: Systems don't need to know about each other!

P-183629
skovv
» 2025-12-12 21:02:15
Rób jak Ci wygodnie, jak będziesz to rozumiał.
P-183630
« 1 »
  Strona 1 z 1