Monthly Archives: October 2025

Pro Evolution Soccer 6: A Timeless Classic

Pro Evolution Soccer 6 (PES 6), released by Konami in late 2006, remains one of the most celebrated football simulations ever made. Praised for its fluid passing, intelligent AI, and satisfying set-pieces, PES 6 struck a perfect balance between realism and arcade-style fun. Its controls were intuitive yet deep, rewarding both quick reflexes and tactical foresight.

What truly set PES 6 apart was its enduring fan community. Even nearly two decades on, unofficial patches add up-to-date squads, new kits, and stadiums. Modders have created complete overhauls—from modern leagues to women’s football—keeping the engine alive long after official support ended. For many players, firing up PES 6 feels like revisiting a golden era of gaming.

Below is a look at some players who were in their teens or early twenties in PES 6 and are still active at top clubs in 2025. They represent the bridge between that classic era and today’s game.

PlayerAge in PES 6 (2006)Current Age (2025)Position (PES 6 Era)PES 6 Team (2006)Current Club (2025)EA FC 26 Rating
Lionel Messi1938Attacking Midfielder / Right WingerBarcelonaInter Miami (USA)86
Cristiano Ronaldo2140Left Winger / ForwardManchester UnitedAl Nassr (Saudi Arabia)85
Karim Benzema1937StrikerOlympique LyonnaisAl Ittihad (Saudi Pro League)85
Luka Modrić2039Central MidfielderDinamo ZagrebReal Madrid (Spain)85
Edin Džeko2039StrikerFK TepliceFiorentina (Italy)84
Ángel Di María1837Winger / Attacking MidfielderRosario CentralRosario Central (Argentina)82
Sergio Ramos2039Centre-Back / Right-BackSevillaMonterrey (Liga MX)81
Raúl Albiol2039Centre-Back / Defensive MidfielderReal MadridVillarreal CF (Spain)80
Santi Cazorla2140Central Midfielder / AMVillarreal CFReal Oviedo (Spain)75
Javier Hernández1837StrikerGuadalajara (Chivas)Guadalajara (Chivas)74
Remko Pasveer2242GoalkeeperDe GraafschapAjax (Netherlands)74
Roque Santa Cruz2443StrikerBayern MunichLibertad (Paraguay)69

If we pick an all-star XI from our PES 6 veterans and average their EA FC 26 ratings, we land on an 82 overall:

– GK Remko Pasveer (74) – RB Sergio Ramos (81) – CB Raúl Albiol (80) – LB Santi Cazorla (75) – CM Luka Modrić (85) – CM Ángel Di María (82) – RW Lionel Messi (86) – LW Javier Hernández (74) – CF Karim Benzema (85) – CF Cristiano Ronaldo (85) – CF Edin Džeko (84)

Compare that to the current top team in EA FC 26 (e.g. Manchester City), whose starting XI averages around 86. Our veterans side sits about four points adrift of today’s elite—but remain competitive enough to beat most squads in a head-to-head.

Nearly twenty years after its release, the fact that PES 6’s rising stars still command top-flight ratings shows the enduring magic of both the game and its legends: the longevity of the game is reflected by the players.

Missed out on anyone, comment below.

Building a Scalable 2D Game Scene Architecture: From Back to Front

Creating a clean, scalable scene architecture for a 2D game is more than just organizing visuals—it’s about building a system that supports gameplay, UI, effects, and camera logic in a way that’s intuitive and future-proof. In this post, we’ll walk through a layered architecture that separates concerns, supports depth-based gameplay, and keeps your UI crisp and your effects polished.

Whether you’re building a vertical shooter, a platformer, or a retro arcade game, this structure gives you the flexibility to scale without chaos.

🧱 Scene Graph Overview

At the core is root_scene, which contains all visual and logical layers. These layers are organized from background to foreground, with clear roles and transformation rules.

root_scene
├── game_group                            # Camera-controlled gameplay container
│   ├── hidden_group                     # Off-screen/inactive entities (object pooling)
│   ├── background_group                 # Default background layer + depth container
│   │   ├── background_bottom_group      # Farthest background visuals (sky, base)
│   │   ├── background_mid_group         # Parallax mid-layers, distant FX
│   │   ├── background_top_group         # Closest background visuals
│   ├── objects_group                    # Default gameplay layer + depth container
│   │   ├── objects_depth_bottom_group   # Farthest gameplay entities
│   │   ├── objects_depth_mid_group      # Primary gameplay layer (player, pickups)
│   │   ├── objects_depth_top_group      # Foreground gameplay entities
│   ├── foreground_group                 # Foreground visuals + depth container
│   │   ├── foreground_bottom_group      # Farthest foreground elements
│   │   ├── foreground_mid_group         # Mid-range foreground visuals
│   │   ├── foreground_top_group         # Closest foreground overlays
│   ├── visual_fx_group                  # Explosions, particles, transient visuals
│
├── hud_group                            # Score, gauges, indicators (screen-anchored)
├── menu_group                           # Title screen, credits (non-blocking UI)
├── modal_group                          # Pause, game over, dialogs (blocking overlays)
├── debug_group                          # Dev-only overlays, performance HUD
├── screen_fx_group                      # CRT shader, bloom, vignette (post-processing)
  

🧠 Layer Roles & Camera Behavior

Each layer has a defined purpose and relationship with the camera. Gameplay and visual layers move with the camera, while UI and post-processing layers remain fixed or apply globally. Note that background and foreground groups can also be used in menu layers along with menu group.

LayerPurposeTransforms with Camera
game_groupMaster container for gameplay layers✅ Yes
hidden_groupObject pooling, inactive/off-screen entities✅ Yes
background_groupDefault background layer✅ Yes
background_bottom_groupFarthest background visuals (sky, base)✅ Yes
background_mid_groupParallax mid-layers, distant FX✅ Yes
background_top_groupClosest background visuals✅ Yes
objects_groupDefault gameplay layer✅ Yes
objects_depth_bottom_groupFarthest gameplay entities✅ Yes
objects_depth_mid_groupCore gameplay layer (player, enemies, pickups)✅ Yes
objects_depth_top_groupForeground gameplay entities✅ Yes
foreground_groupDefault foreground layer✅ Yes
foreground_bottom_groupFarthest foreground visuals✅ Yes
foreground_mid_groupMid-range foreground visuals✅ Yes
foreground_top_groupClosest foreground overlays✅ Yes
visual_fx_groupExplosions, particles, screen shake✅ Yes
hud_groupScore, gauges, indicators❌ No
menu_groupTitle screen, credits❌ No
modal_groupPause, game over, dialogs❌ No
debug_groupDev overlays, performance HUD❌ No
screen_fx_groupPost-processing shaders (CRT, bloom, vignette)❌ No (global)

🧰 API Naming Conventions

To keep things clean and predictable, each layer has dedicated adders and getters. This ensures encapsulation and avoids direct manipulation of scene graph internals.

🔧 Adders

python

add_to_hidden_group(obj)
add_to_background_group(obj)
add_to_background_bottom_group(obj)
add_to_background_mid_group(obj)
add_to_background_top_group(obj)

add_to_objects_group(obj)
add_to_objects_depth_bottom_group(obj)
add_to_objects_depth_mid_group(obj)
add_to_objects_depth_top_group(obj)

add_to_foreground_group(obj)
add_to_foreground_bottom_group(obj)
add_to_foreground_mid_group(obj)
add_to_foreground_top_group(obj)

add_to_visual_fx_group(obj)
add_to_hud_group(obj)
add_to_menu_group(obj)
add_to_modal_group(obj)
add_to_debug_group(obj)
add_to_screen_fx_group(obj)
  

🔍 Getters

python

get_hidden_group()
get_background_group()
get_background_bottom_group()
get_background_mid_group()
get_background_top_group()

get_objects_group()
get_objects_depth_bottom_group()
get_objects_depth_mid_group()
get_objects_depth_top_group()

get_foreground_group()
get_foreground_bottom_group()
get_foreground_mid_group()
get_foreground_top_group()

get_visual_fx_group()
get_hud_group()
get_menu_group()
get_modal_group()
get_debug_group()
get_screen_fx_group()
  

📏 Ownership & Layering Rules

To maintain clarity and prevent misuse, each type of entity has a designated home:

  • Gameplay entitiesobjects_group or one of its depth layers
  • Background visualsbackground_group or its depth layers
  • Foreground visualsforeground_group or its depth layers
  • HUD elementshud_group
  • Menusmenu_group
  • Blocking overlaysmodal_group
  • Debug toolsdebug_group only
  • Visual effectsvisual_fx_group
  • Post-processing shadersscreen_fx_group
  • Camera transformations → applied only to game_group and its children

🚫 Layering Constraints

To avoid rendering chaos and maintain performance:

  • ❌ No toFront() calls in gameplay layers
  • ✅ UI systems may adjust local order within their own group
  • ✅ Depth layers maintain internal z-ordering

✅ Benefits of This Architecture

  • Clear separation of concerns: Each layer has a distinct visual and logical role
  • Scalable and maintainable: Easy to audit, extend, and debug
  • Camera-friendly: game_group isolates gameplay transformations from UI
  • Depth flexibility: objects_group, background_group, and foreground_group support layered interactions
  • UI integrity: HUD and modals remain crisp and unaffected by zoom/shake
  • Post-processing polish: screen_fx_group applies final visual effects globally

🧪 Final Thoughts

This architecture isn’t just a technical blueprint—it’s a philosophy of clarity. By separating gameplay, background, foreground, UI, and effects into well-defined layers, you empower your team to build faster, debug smarter, and scale confidently.

If you’re working on a game and want help adapting this structure to your engine or genre, I’d love to collaborate. Let’s build something beautiful.