How limenqi/formula-2d works
Formula 2D is a multiplayer 2D racing game with client-side driving, an authoritative UDP server, FPGA-backed physics and HDMI rendering, and AWS leaderboard support. Clients register, send timed player updates, and receive server snapshots; the server manages the race, updates hardware state, and submits results. The graph preserves the documented hardware, networking, leaderboard, and software-render comparison capabilities. Some source was not excerpted, so edges for those relationships rely on the README or indexed references; optional hardware links are marked unverified.
Main entry points: server/game_loop.py Race loop · client/game_loop.py Client game loop · main.py Client entry · menu_loop.py Lobby and setup
Components 24
Client gameplay
- Client entry
client_side/client/main.py - Client registration
client_side/client/menu_loop.py - Client game loop
client_side/client/game_loop.py - Client physics
client_side/game/physics.py - Player state
client_side/game/models.py - Client config
client_side/game/config.py - Packet protocol
client_side/net/protocol.py - Client UDP
client_side/net/udp.py
Authoritative server
- Server entry
server_side/server/main.py - Lobby and setup
server_side/server/menu_loop.py - Race loop
server_side/server/game_loop.py - Authoritative state
server_side/game/engine.py - Server config
server_side/game/config.py - Packet protocol
server_side/net/protocol.py - Server UDP
server_side/net/udp.py - Race results
server_side/server/game_ending.py
FPGA hardware
- Hardware interface
server_side/game/hw_interface.py - Physics AXI IP
vivado/ip_repo/physics_axi_ip/physics_axi_ip_1.0/src/physics_top.v - HDMI renderer
vivado/racing_axi/racing_axi.srcs/sources_1/imports/filles_axi/racing_renderer_axi.v
Services and rendering
- AWS leaderboard
- AWS calls
server_side/server/aws_functions.py - Software map renderer
server_side/software_render/map_renderer.py
Other components
- Player
- PYNQ board
Connections 30
- Player → Client entry: starts
README.md - Client entry → Client registration: runs
client_side/client/main.py - Client entry → Client game loop: runs
client_side/client/main.py - Client entry → Client physics: initializes
client_side/client/main.py - Client registration → Client UDP: creates socket
client_side/client/menu_loop.py - Client registration → Packet protocol: encodes registration
client_side/client/menu_loop.py - Client game loop → Client physics: steps motion
client_side/client/game_loop.py - Client game loop → Packet protocol: encodes updates
client_side/client/game_loop.py - Client game loop → Packet protocol: decodes snapshots
client_side/client/game_loop.py - Client game loop → Client UDP: sends and receives
- Client physics → Player state: updates
client_side/game/physics.py - Packet protocol → Player state: serializes
client_side/net/protocol.py - Server entry → Lobby and setup: runs
server_side/server/main.py - Server entry → Race loop: runs
server_side/server/main.py - Server entry → Race results: submits results
server_side/server/main.py - Lobby and setup → Server UDP: opens socket
server_side/server/menu_loop.py - Lobby and setup → Race loop: hands off game
server_side/server/menu_loop.py - Lobby and setup → AWS calls: uses services
server_side/server/menu_loop.py - Race loop → Packet protocol: decodes updates
server_side/server/game_loop.py - Race loop → Packet protocol: encodes snapshots
server_side/server/game_loop.py - Race loop → Authoritative state: applies updates
server_side/server/game_loop.py - Race loop → Hardware interface: writes race state
server_side/server/game_loop.py - Race loop → Server UDP: sends snapshots
- Race results → AWS calls: requests leaderboard
server_side/server/game_ending.py - AWS calls → AWS leaderboard: calls API
README.md - Hardware interface → Physics AXI IP: controls
- Hardware interface → HDMI renderer: writes render state
- PYNQ board → Hardware interface: hosts
README.md - PYNQ board → HDMI renderer: outputs HDMI
README.md - Software map renderer → Player state: draws players
server_side/software_render/map_renderer.py