SportsBallEngine/GETTING_STARTED.md
2025-12-15 16:03:37 -08:00

375 lines
10 KiB
Markdown

# 🚀 Getting Started with SportsBallEngine
This guide will help you understand and start working with the SportsBallEngine codebase.
## Quick Overview
SportsBallEngine is a **cross-platform 3D game engine** written in Swift 6, designed specifically for **professional sports games** across multiple disciplines (soccer, football, basketball, hockey, and more). It uses strict separation between platform-agnostic core and platform-specific implementations.
## What Was Generated (Phase 1)
Based on `prompt_phase1.md`, the following foundational structure was created:
### 📦 Package Structure
```
SportsBallEngine_1/
├── Package.swift # Swift Package Manager manifest
├── README.md # Main documentation
├── ARCHITECTURE.md # Detailed architecture guide
├── GETTING_STARTED.md # This file
├── .gitignore # Git ignore rules
└── Sources/
├── SportsBallEngine/ # Main entry point
│ └── main.swift # Platform detection & initialization
├── RendererAPI/ # Protocol definitions (CORE)
│ ├── RendererProtocol.swift # Rendering abstraction
│ ├── InputProtocol.swift # Input abstraction
│ ├── WindowProtocol.swift # Window abstraction
│ └── AudioProtocol.swift # Audio abstraction
├── EngineCore/ # Platform-agnostic core
│ └── Engine.swift # Main game loop
├── PhysicsEngine/ # Sports-optimized physics
│ └── PhysicsWorld.swift # Physics simulation
├── AssetLoader/ # Asset management
│ └── AssetManager.swift # Asset loading & caching
├── VulkanRenderer/ # Vulkan backend (Linux/Windows)
│ └── VulkanRenderer.swift
├── DX12Renderer/ # DirectX 12 backend (Windows)
│ └── DX12Renderer.swift
├── PlatformLinux/ # Linux platform layer
│ └── LinuxPlatform.swift # Window, Input, Audio for Linux
└── PlatformWin32/ # Windows platform layer
└── Win32Platform.swift # Window, Input, Audio for Windows
```
### 🎯 Key Files to Understand
#### 1. **main.swift** - Entry Point
This is where the magic happens! It:
- Detects the current platform (Linux/Windows/macOS)
- Creates platform-specific implementations
- Injects them into the platform-agnostic `EngineCore`
- Starts the main game loop
```swift
// Platform detection
#if os(Linux)
let renderer = VulkanRenderer()
let windowManager = LinuxWindowManager()
#elseif os(Windows)
let renderer = DX12Renderer() // or VulkanRenderer
let windowManager = Win32WindowManager()
#endif
// Inject into core
let engine = GameEngine(
renderer: renderer,
windowManager: windowManager,
inputHandler: inputHandler,
audioEngine: audioEngine
)
// Start the engine
try await engine.start()
```
#### 2. **RendererAPI Protocols** - The Contract
These protocols define the **interface** between the core and platform layers:
- `Renderer` - All rendering operations
- `WindowManager` - Window management
- `InputHandler` - Keyboard, mouse, gamepad input
- `AudioEngine` - 3D spatial audio
**No platform-specific code here!** Just pure Swift protocols.
#### 3. **Engine.swift** - The Heart
This is the main game loop using a fixed timestep approach for deterministic physics:
```swift
// Fixed timestep for physics (deterministic)
while accumulator >= fixedTimeStep {
fixedUpdate(deltaTime: fixedTimeStep)
accumulator -= fixedTimeStep
}
// Variable timestep for rendering (smooth)
render(interpolationAlpha: accumulator / fixedTimeStep)
```
#### 4. **Platform Implementations** - The Glue
Each platform has implementations of all protocols:
- **Linux**: Uses GLFW/SDL + Vulkan
- **Windows**: Uses Win32 API + DirectX 12 (or Vulkan)
- **Future macOS**: Will use Cocoa + Metal
## Building the Project
### Prerequisites
```bash
# Swift 6.0+
swift --version
# Linux dependencies (if on Linux)
sudo apt install libvulkan-dev libglfw3-dev
# Windows dependencies (if on Windows)
# Install Visual Studio 2022 with C++ tools
# Install Vulkan SDK or DirectX 12 SDK
```
### Build Commands
```bash
# Clone/navigate to project
cd SportsBallEngine_1
# Build in debug mode
swift build
# Build in release mode (optimized)
swift build -c release
# Run the engine
swift run
# Run with custom options
swift run SportsBallEngine -- --renderer vulkan --width 2560 --height 1440
```
### Expected Output
```
============================================================
🏀 SportsBallEngine - Cross-Platform 3D Game Engine
============================================================
📍 Platform: Linux
🔧 Swift Version: 6.0
🔨 Creating platform abstractions...
🐧 LinuxWindowManager created
🌋 VulkanRenderer created
🐧 LinuxInputHandler created
🐧 LinuxAudioEngine created
🪟 Creating window...
→ Creating Linux window...
✓ Linux window created: SportsBallEngine (1920x1080)
⚙️ Initializing engine core...
🎮 SportsBallEngine initialized
============================================================
🎮 Starting game engine...
============================================================
Controls:
ESC - Exit application
```
## Understanding the Code
### Protocol-Based Architecture in Action
**Problem**: How do you write a game engine that runs on multiple platforms without `#if` statements everywhere?
**Solution**: Strict layer separation with protocols!
#### ❌ Bad Approach (Platform-specific code everywhere)
```swift
// DON'T DO THIS!
class Renderer {
func draw() {
#if os(Linux)
vulkanDraw()
#elif os(Windows)
dx12Draw()
#endif
}
}
```
#### ✅ Good Approach (Protocol-based abstraction)
```swift
// Define protocol (in RendererAPI)
protocol Renderer {
func draw(scene: Scene) throws
}
// Implement for each platform
class VulkanRenderer: Renderer {
func draw(scene: Scene) throws {
// Vulkan-specific code
}
}
class DX12Renderer: Renderer {
func draw(scene: Scene) throws {
// DirectX 12-specific code
}
}
// Core code uses protocol (no platform awareness)
class GameEngine {
let renderer: any Renderer // Could be Vulkan or DX12!
func render() {
try renderer.draw(scene: currentScene)
}
}
```
### Sports Game Features
The engine is specifically designed for sports games:
#### 1. **Physics System** (`PhysicsWorld.swift`)
- Ball physics with spin and air drag
- Player collision detection
- Sports-specific constraints
```swift
// Special handling for balls
if ballBodies.contains(id) {
let dragCoefficient: Float = 0.1
let drag = -body.velocity * dragCoefficient
body.acceleration += drag / body.mass
}
```
#### 2. **Asset System** (`AssetManager.swift`)
- Skeletal animation support
- Animation blending (future)
- High-res character models
- Stadium environment loading
```swift
// Load player model with skeleton
let mesh = await assetLoader.loadMesh("player.fbx")
let skeleton = await assetLoader.loadSkeleton("player_skeleton.json")
let animation = await assetLoader.loadAnimation("run.anim")
```
#### 3. **Rendering** (Vulkan/DX12)
- High-fidelity character rendering
- Large stadium environments
- Dynamic lighting
- Particle effects (future)
## Next Steps
### Phase 2 Development (See `prompt_phase2.md`)
The next phase will add:
- Complete Vulkan/DX12 implementation with real bindings
- Skeletal animation system
- State machine for player AI
- Networking for multiplayer
- Advanced physics (spin, magnus effect)
### Customizing for Your Game
#### Adding Game Logic
Create a new module in the `EngineCore`:
```swift
// Sources/EngineCore/SportsGameLogic.swift
struct Player {
var position: SIMD3<Float>
var team: Team
var stats: PlayerStats
}
struct SportsGameState {
var players: [Player]
var ball: Ball
var score: Score
}
```
#### Adding Custom Rendering
Implement custom shaders and materials:
```swift
// In your renderer implementation
func createSportsShader() {
// Load SPIR-V shaders (Vulkan) or HLSL (DirectX)
// Implement player skin rendering, grass effects, etc.
}
```
### Learning Resources
1. **Read ARCHITECTURE.md** - Detailed system design
2. **Read the protocol files** - Understand the contracts
3. **Study Engine.swift** - Learn the game loop
4. **Explore PhysicsWorld.swift** - See sports physics
## Troubleshooting
### Build Errors
**Error**: `cannot find module 'CVulkan'`
- You need to add actual Vulkan bindings (Phase 2)
- Current code uses placeholders
**Error**: `platform-specific code in EngineCore`
- Check imports - EngineCore should NOT import platform modules
- Use protocols instead
### Runtime Issues
**Black screen**
- Renderer implementations are currently stubs
- They demonstrate architecture but don't render yet
- Phase 2 will add real rendering code
**No input response**
- Input implementations need platform library bindings
- Currently stubs for architectural demonstration
## Contributing
When adding code, follow these rules:
1.**Platform-agnostic code**`EngineCore`, `PhysicsEngine`, `AssetLoader`
2.**Protocol definitions**`RendererAPI`
3.**Platform-specific code**`Platform{Name}`, `{API}Renderer`
4.**NO platform imports in core modules**
5.**NO game logic in platform layers**
## Summary
You now have:
- ✅ Complete module structure
- ✅ Protocol-based platform abstraction
- ✅ Sports-optimized physics engine
- ✅ Asset management system
- ✅ Rendering backend stubs (Vulkan, DX12)
- ✅ Platform layers (Linux, Windows)
- ✅ Main entry point with platform detection
This is a **production-ready architecture** with **educational placeholder implementations**.
The next phase will add real platform bindings and complete renderer implementations!
---
**Questions?** Check:
- `README.md` - High-level overview
- `ARCHITECTURE.md` - Detailed design
- `prompt_phase1.md` - Original requirements
- `prompt_phase2.md` - Next steps