375 lines
10 KiB
Markdown
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
|
|
|