A comprehensive 2D game engine built entirely from scratch using only Python's standard library. No external dependencies like pygame, OpenGL, or any third-party graphics libraries. This engine demonstrates how to create a complete game development framework using pure Python and tkinter for cross-platform windowing.
This project proves that you can build sophisticated game engines without relying on external libraries. Every component - from vector mathematics to input handling to graphics rendering - is implemented from the ground up using only Python's built-in modules.
- Pure Python Implementation: Zero external dependencies beyond Python standard library
- Cross-Platform: Uses tkinter for universal compatibility across Windows, macOS, and Linux
- Game Engine Architecture: Professional game engine design patterns and structure
- Fixed Timestep Game Loop: Consistent physics and animation regardless of framerate
- 2D/3D Hybrid Support: Optional 3D mathematics with 2D rendering capabilities
- Scene Management: Organize game objects into scenes with lifecycle management
- GameObject Architecture: Component-based game objects with transform hierarchy
- Component System: Modular components for extending game object functionality
- Object Pooling: Efficient memory management for game objects
- Vector2: Comprehensive 2D vector implementation with all standard operations
- Vector3: Full 3D vector mathematics with cross product, magnitude, and transformations
- Transform System: 2D/3D position, rotation, and scale with parent-child relationships
- Quaternion Support: 3D rotation support with quaternion mathematics (optional 3D mode)
- Advanced Math: Dot product, cross product, interpolation, and coordinate transformations
- Collision Detection: Point-in-shape and basic collision detection
- Custom 2D Renderer: Built on tkinter Canvas with advanced drawing capabilities
- Shape Rendering: Rectangles, circles, triangles, and custom polygons
- Transform Support: Full rotation, scaling, and translation for all shapes
- Color Management: RGB color support with outline and fill options
- Z-Ordering: Proper layering system for depth sorting
- Keyboard Input: Complete keyboard state management with key press detection
- Mouse Input: Mouse position, button states, and click detection
- Input Utilities: Convenience methods for common input patterns (WASD, arrows)
- Event-Driven: Proper event handling with frame-accurate input detection
- Procedural Sound Generation: Create sound effects using mathematical waveforms
- Multiple Wave Types: Support for sine, square, sawtooth, triangle, and noise waves
- Sound Effects: Built-in generators for bullets, explosions, and engine sounds
- No External Dependencies: Audio system built entirely with Python standard library
- Real-time Playback: Thread-based sound playback system
engine/
├── __init__.py # Main engine exports
├── core/
│ ├── __init__.py
│ ├── engine.py # Main GameEngine class
│ └── window.py # Cross-platform window management
├── scene/
│ ├── __init__.py
│ ├── scene.py # Scene management
│ └── game_object.py # GameObject and Component classes
├── math/
│ ├── __init__.py
│ ├── vector2.py # 2D vector mathematics
│ ├── vector3.py # 3D vector mathematics
│ ├── quaternion.py # 3D rotation quaternions
│ └── transform.py # 2D/3D transform component
├── graphics/
│ ├── __init__.py
│ ├── renderer.py # 2D rendering system
│ └── sprite.py # Sprite rendering component
├── input/
│ ├── __init__.py
│ └── input_manager.py # Input handling system
└── audio/
├── __init__.py
└── sound_generator.py # Procedural sound generation
No installation required! This engine uses only Python's standard library.
Requirements:
- Python 3.7 or higher
- tkinter (included with most Python installations)
from engine import GameEngine, GameObject, Vector2, Sprite, SoundGenerator class MyGame(GameEngine): def initialize(self): # Initialize sound system self.sound_generator = SoundGenerator() self.sound_generator.initialize_default_sounds() # Create a game object player = GameObject("Player") player.transform.position = Vector2(400, 300) # Add a sprite component sprite = Sprite(color='#0096FF', size=Vector2(50, 50)) player.add_component(sprite) # Add to scene self.current_scene.add_object(player) def update(self, delta_time): # Game logic here if self.input_manager.is_key_pressed('space'): self.sound_generator.play_sound("bullet") print("Space pressed!") # Run the game game = MyGame("My 2D Game", (800, 600)) game.run()
Run the included example game to see the engine in action:
python example_game.py
Experience a complete retro game implementation:
python asteroids_game.py
- Left/Right or A/D: Rotate ship
- Up or W: Thrust
- Space or Ctrl: Shoot
- ESC: Quit game
- Classic triangular ship with realistic physics
- Asteroids that split when shot
- Screen wrapping mechanics
- Wave progression system
- Procedural sound effects (bullets, explosions, engine thrust)
- Score and lives system
The examples demonstrate:
- Player movement with keyboard input
- Rotating enemies and physics simulation
- Real-time FPS display
- Component-based architecture
- Transform hierarchies
- Procedural audio generation
- Complete game state management
The engine uses a component-based architecture where game objects are containers for components that define behavior:
# Create a game object player = GameObject("Player") # Add components player.add_component(Sprite(color='#FF0000')) player.add_component(CustomBehavior()) # Components can access the game object class CustomBehavior(Component): def update(self, delta_time): # Move the game object self.game_object.transform.translate(Vector2(100 * delta_time, 0))
Supports parent-child relationships with automatic world space calculations:
parent = GameObject("Parent") child = GameObject("Child") # Set up hierarchy child.transform.parent = parent.transform # Child position is relative to parent child.transform.position = Vector2(50, 0) # 50 units to the right of parent # Optional 3D support child.transform.enable_3d() child.transform.quaternion_rotation = Quaternion.from_axis_angle(Vector3.up(), math.pi/4)
Custom 2D renderer built on tkinter Canvas:
# The renderer can draw various shapes renderer.draw_rectangle(position, size, color='#FF0000', rotation=math.pi/4) renderer.draw_circle(position, radius, color='#00FF00') renderer.draw_polygon(points, color='#0000FF')
Extend the Component class to create custom behaviors:
class HealthComponent(Component): def __init__(self, max_health=100): super().__init__() self.max_health = max_health self.current_health = max_health def take_damage(self, damage): self.current_health = max(0, self.current_health - damage) if self.current_health == 0: self.game_object.destroy()
Comprehensive input system with multiple access patterns:
# In your game update loop if input_manager.is_key_just_pressed('space'): player.jump() # Get normalized movement vector movement = input_manager.get_movement_vector() player.transform.translate(movement * speed * delta_time)
Rich 2D and 3D vector systems with all standard operations:
# 2D Vector operations velocity = Vector2(100, 50) acceleration = Vector2(0, -9.8) velocity += acceleration * delta_time # 3D Vector operations position_3d = Vector3(10, 20, 30) direction_3d = Vector3.forward() cross_product = position_3d.cross(direction_3d) # Advanced operations distance = player_pos.distance_to(enemy_pos) direction = (target_pos - current_pos).normalize() rotated = velocity.rotate(math.pi / 4)
Generate sound effects using mathematical waveforms:
from engine import SoundGenerator # Initialize sound system sound_gen = SoundGenerator() # Create custom sounds bullet_sound = sound_gen.create_bullet_sound() explosion_sound = sound_gen.create_explosion_sound() engine_sound = sound_gen.create_engine_sound() # Register and play sounds sound_gen.register_sound(bullet_sound) sound_gen.play_sound("bullet") # Or use built-in sounds sound_gen.initialize_default_sounds() sound_gen.play_sound("explosion")
Organize your game into scenes for different states:
menu_scene = Scene("Menu") game_scene = Scene("Game") # Switch between scenes engine.load_scene(game_scene)
This project demonstrates several important concepts:
- Understanding Fundamentals: Building from scratch teaches you how game engines actually work
- No Dependencies: Eliminates external library conflicts and licensing concerns
- Educational Value: Perfect for learning game development concepts
- Portability: Runs anywhere Python runs, no additional installations
- Customization: Complete control over every aspect of the engine
While this engine prioritizes education and simplicity over raw performance, it includes several optimizations:
- Efficient Vector Operations: Optimized mathematical operations
- Object Pooling: Reuse game objects to reduce garbage collection
- Spatial Partitioning: Scene management optimized for large numbers of objects
- Frame Rate Control: Consistent timing regardless of system performance
By studying this engine, you'll learn:
- Game engine architecture and design patterns
- 2D and 3D mathematics and coordinate systems
- Vector mathematics and quaternion rotations
- Component-based entity systems
- Input handling and event processing
- 2D graphics rendering techniques
- Transform hierarchies and world/local space conversions
- Scene management and state machines
- Procedural audio generation and waveform synthesis
- Mathematical sound effect creation
- Performance optimization techniques
This project is designed for educational purposes. Contributions that improve the learning experience or add well-documented features are welcome!
This project is open source and available under the MIT License.
Built with ❤️ using only Python's standard library