Adds Game Jam Ready Templates & ReiLua API Updates
(Most of the code is Copilot Generated LOL)
This commit is contained in:
321
template/README.md
Normal file
321
template/README.md
Normal file
@@ -0,0 +1,321 @@
|
||||
# ReiLua-Enhanced Game Template
|
||||
|
||||
A complete game template for rapid development with ReiLua-Enhanced.
|
||||
|
||||
## 📁 Structure
|
||||
|
||||
```
|
||||
template/
|
||||
├── main.lua # Entry point
|
||||
├── lib/ # Core libraries
|
||||
│ ├── classic.lua # OOP class system
|
||||
│ ├── gamestate.lua # State management
|
||||
│ └── animation.lua # Sprite animation system
|
||||
├── states/ # Game states
|
||||
│ ├── menu.lua # Menu screen
|
||||
│ └── game.lua # Main gameplay
|
||||
└── assets/ # Game assets (images, sounds, etc.)
|
||||
```
|
||||
|
||||
## 🚀 Quick Start
|
||||
|
||||
### Development
|
||||
|
||||
1. **Copy template to your game folder:**
|
||||
```bash
|
||||
xcopy /E /I template MyGame
|
||||
cd MyGame
|
||||
```
|
||||
|
||||
2. **Run your game:**
|
||||
```bash
|
||||
path\to\ReiLua.exe --log --no-logo
|
||||
```
|
||||
|
||||
3. **Start coding!**
|
||||
- Edit `states/menu.lua` for your menu
|
||||
- Edit `states/game.lua` for gameplay
|
||||
- Add assets to `assets/` folder
|
||||
|
||||
### Release Build
|
||||
|
||||
1. **Copy files to build directory:**
|
||||
```bash
|
||||
cd ReiLua-Enhanced\build
|
||||
xcopy /E /I ..\MyGame\*.lua .
|
||||
xcopy /E /I ..\MyGame\lib lib
|
||||
xcopy /E /I ..\MyGame\states states
|
||||
mkdir assets
|
||||
xcopy /E /I ..\MyGame\assets assets
|
||||
```
|
||||
|
||||
2. **Build release:**
|
||||
```bash
|
||||
cd ..
|
||||
scripts\build_release.bat
|
||||
```
|
||||
|
||||
3. **Your game is ready!**
|
||||
- `build/ReiLua.exe` (or your custom name)
|
||||
- Everything embedded in one executable
|
||||
|
||||
## 📚 Libraries Included
|
||||
|
||||
### Classic (OOP)
|
||||
Object-oriented class system by rxi.
|
||||
|
||||
```lua
|
||||
local Object = require("lib.classic")
|
||||
local Player = Object:extend()
|
||||
|
||||
function Player:new(x, y)
|
||||
self.x = x
|
||||
self.y = y
|
||||
end
|
||||
|
||||
function Player:update(dt)
|
||||
-- Update logic
|
||||
end
|
||||
|
||||
local player = Player(100, 100)
|
||||
```
|
||||
|
||||
### GameState
|
||||
State management system inspired by hump.gamestate.
|
||||
|
||||
```lua
|
||||
local GameState = require("lib.gamestate")
|
||||
local menu = require("states.menu")
|
||||
|
||||
-- Register callbacks
|
||||
GameState.registerEvents()
|
||||
|
||||
-- Switch state
|
||||
GameState.switch(menu)
|
||||
|
||||
-- Push state (with return)
|
||||
GameState.push(pauseMenu)
|
||||
GameState.pop() -- Returns to previous state
|
||||
```
|
||||
|
||||
**State Callbacks:**
|
||||
- `state:enter(previous, ...)` - Entering state
|
||||
- `state:leave()` - Leaving state
|
||||
- `state:resume(previous, ...)` - Returning via pop()
|
||||
- `state:update(dt)` - Frame update
|
||||
- `state:draw()` - Rendering
|
||||
- `state:event(event)` - Input events
|
||||
|
||||
### Animation
|
||||
Sprite sheet animation system.
|
||||
|
||||
```lua
|
||||
local Animation = require("lib.animation")
|
||||
|
||||
-- Load texture
|
||||
local playerTexture = RL.LoadTexture("assets/player.png")
|
||||
|
||||
-- Create animation (32x32 frame size)
|
||||
local anim = Animation.new(playerTexture, 32, 32, {
|
||||
idle = {frames = {1, 2, 3, 4}, fps = 8, loop = true},
|
||||
walk = {frames = {5, 6, 7, 8, 9, 10}, fps = 12, loop = true},
|
||||
jump = {frames = {11, 12, 13}, fps = 10, loop = false}
|
||||
})
|
||||
|
||||
-- Play animation
|
||||
anim:play("idle")
|
||||
|
||||
-- In update loop
|
||||
anim:update(dt)
|
||||
|
||||
-- In draw loop
|
||||
anim:draw(x, y)
|
||||
|
||||
-- Or simple draw (no rotation/scale)
|
||||
anim:drawSimple(x, y)
|
||||
|
||||
-- Advanced features
|
||||
anim:setFlip(true, false) -- Flip horizontally
|
||||
anim:setScale(2, 2) -- Scale 2x
|
||||
anim:setTint(RL.RED) -- Color tint
|
||||
anim:pause() -- Pause animation
|
||||
anim:resume() -- Resume
|
||||
anim:stop() -- Stop and reset
|
||||
```
|
||||
|
||||
## 🎮 Example States
|
||||
|
||||
### Menu State (states/menu.lua)
|
||||
- Keyboard navigation (Up/Down)
|
||||
- Start game / Options / Exit
|
||||
- Clean UI rendering
|
||||
|
||||
### Game State (states/game.lua)
|
||||
- Player movement (WASD/Arrows)
|
||||
- Pause menu (ESC/P)
|
||||
- Animation integration example
|
||||
- Basic game loop
|
||||
|
||||
## 🎨 Adding Assets
|
||||
|
||||
### Sprite Sheets
|
||||
Place sprite sheets in `assets/` folder:
|
||||
|
||||
```
|
||||
assets/
|
||||
├── player.png # Player sprite sheet (grid-based)
|
||||
├── enemy.png # Enemy sprites
|
||||
├── explosion.png # Explosion animation
|
||||
└── background.png # Background image
|
||||
```
|
||||
|
||||
**Sprite Sheet Format:**
|
||||
- Grid-based (equal-sized frames)
|
||||
- Frames read left-to-right, top-to-bottom
|
||||
- Example: 32x32 frames in 256x256 texture = 8x8 grid (64 frames)
|
||||
|
||||
### Sounds & Music
|
||||
```lua
|
||||
-- In state:enter()
|
||||
self.music = RL.LoadMusicStream("assets/music.ogg")
|
||||
self.jumpSound = RL.LoadSound("assets/jump.wav")
|
||||
|
||||
-- In state:update()
|
||||
RL.UpdateMusicStream(self.music)
|
||||
|
||||
-- Play sound
|
||||
RL.PlaySound(self.jumpSound)
|
||||
```
|
||||
|
||||
## 🔧 Configuration
|
||||
|
||||
### Window Settings (main.lua)
|
||||
```lua
|
||||
local GAME_TITLE = "My Awesome Game"
|
||||
local WINDOW_WIDTH = 1280
|
||||
local WINDOW_HEIGHT = 720
|
||||
local TARGET_FPS = 60
|
||||
local START_FULLSCREEN = false -- Start in fullscreen?
|
||||
```
|
||||
|
||||
For complete window configuration (fullscreen, resizable, etc.), see [WINDOW_CONFIG.md](WINDOW_CONFIG.md).
|
||||
|
||||
### Exit Key Behavior
|
||||
By default, the template disables ESC as an exit key so you can use it for pause menus:
|
||||
```lua
|
||||
RL.SetExitKey(0) -- 0 = No exit key
|
||||
```
|
||||
|
||||
To change this behavior, see [COMMON_ISSUES.md](COMMON_ISSUES.md#esc-key-closes-the-game).
|
||||
|
||||
### Global Hotkeys
|
||||
- **F1 / F11** - Toggle fullscreen
|
||||
- **ESC** - Pause game (in game state)
|
||||
|
||||
## 📖 State Management Patterns
|
||||
|
||||
### Simple State Switch
|
||||
```lua
|
||||
-- From menu to game
|
||||
GameState.switch(gameState)
|
||||
```
|
||||
|
||||
### State Stack (Pause Menu)
|
||||
```lua
|
||||
-- Push pause menu (game continues in background)
|
||||
GameState.push(pauseMenu)
|
||||
|
||||
-- Return to game
|
||||
GameState.pop()
|
||||
```
|
||||
|
||||
### Passing Data Between States
|
||||
```lua
|
||||
-- Pass score to game over screen
|
||||
GameState.switch(gameOverState, score, highScore)
|
||||
|
||||
-- In game over state:
|
||||
function gameOverState:enter(previous, score, highScore)
|
||||
self.score = score
|
||||
self.highScore = highScore
|
||||
end
|
||||
```
|
||||
|
||||
## 🎯 Best Practices
|
||||
|
||||
### Performance
|
||||
- Load assets in `state:enter()`, not `update()`
|
||||
- Unload assets in `state:leave()`
|
||||
- Use object pooling for bullets/particles
|
||||
- Profile with `--log` flag
|
||||
|
||||
### Organization
|
||||
- One file per state
|
||||
- Keep states small and focused
|
||||
- Use OOP for game entities (Player, Enemy, etc.)
|
||||
- Separate rendering from logic
|
||||
|
||||
### Asset Loading
|
||||
```lua
|
||||
function state:enter()
|
||||
-- Show loading if needed
|
||||
local assets = {"player.png", "enemy.png", "music.ogg"}
|
||||
RL.BeginAssetLoading(#assets)
|
||||
|
||||
for _, asset in ipairs(assets) do
|
||||
RL.UpdateAssetLoading(asset)
|
||||
-- Load asset...
|
||||
end
|
||||
|
||||
RL.EndAssetLoading()
|
||||
end
|
||||
```
|
||||
|
||||
## 🐛 Debugging
|
||||
|
||||
### Development Mode
|
||||
```bash
|
||||
ReiLua.exe --log --no-logo
|
||||
```
|
||||
- Shows console output
|
||||
- Skips splash screens
|
||||
- Fast iteration
|
||||
|
||||
### Common Issues
|
||||
|
||||
**Animation not showing:**
|
||||
- Check texture loaded: `if not texture then print("Failed!") end`
|
||||
- Verify frame size matches sprite sheet
|
||||
- Check animation is playing: `anim:play("idle")`
|
||||
|
||||
**State not switching:**
|
||||
- Verify `GameState.registerEvents()` called in `RL.init()`
|
||||
- Check state has required functions (`:update()`, `:draw()`)
|
||||
- Use `print()` in `:enter()` to verify state switch
|
||||
|
||||
**Assets not loading:**
|
||||
- Use relative paths: `"assets/player.png"` not `"C:/..."`
|
||||
- Check file exists with `RL.FileExists()`
|
||||
- View console with `--log` flag
|
||||
|
||||
## 📦 Building for Release
|
||||
|
||||
See main ReiLua-Enhanced documentation:
|
||||
- [EMBEDDING.md](../docs/EMBEDDING.md) - Embedding guide
|
||||
- [BUILD_SCRIPTS.md](../docs/BUILD_SCRIPTS.md) - Build automation
|
||||
- [CUSTOMIZATION.md](../docs/CUSTOMIZATION.md) - Branding/icons
|
||||
|
||||
## 📄 License
|
||||
|
||||
- **classic.lua** - MIT License (rxi)
|
||||
- **gamestate.lua** - Inspired by hump (MIT)
|
||||
- **animation.lua** - MIT License
|
||||
- **Template** - Free to use for any project
|
||||
|
||||
## 🎮 Ready to Make Games!
|
||||
|
||||
This template gives you everything needed to start building games immediately. Focus on gameplay, not boilerplate!
|
||||
|
||||
For more examples and documentation, see the main ReiLua-Enhanced repository.
|
||||
|
||||
Happy game jamming! 🚀
|
||||
Reference in New Issue
Block a user