Files
trickster-tiles/README.md
2026-05-15 21:46:23 +02:00

88 lines
2.5 KiB
Markdown

# Trickster Tiles
A small pixel-art platformer built with [Phaser 3](https://phaser.io/), TypeScript and Vite. Hop, jump, and outwit moving spikes and disappearing tiles across 10 levels.
## Controls
| Action | Keys |
| --- | --- |
| Move | `←` `→` / `A` `D` |
| Jump | `SPACE` / `↑` / `W` |
| Start | `SPACE` / `ENTER` / mouse click (on title screen) |
Falling off the bottom of the screen restarts the current level. Reaching the exit advances to the next.
## Running
```bash
npm install
npm run dev # local dev server (Vite)
npm run build # type-check + production build into dist/
npm run preview # serve the production build
```
Requires Node.js 18+.
## Project layout
```
src/
main.ts Phaser.Game bootstrap
scenes/
BootScene.ts Title screen, sprite preloading
GameScene.ts Gameplay loop, collisions, level transitions
entities/
Player.ts Input handling + movement
Platform.ts Solid platform (one-way landing)
Exit.ts Level exit goal
obstacles/
ObstacleSpikeBase.ts Shared spike init
ObstacleSpikeNormal.ts Static spike
ObstacleSpikeTricky.ts Spike that jumps away when approached
ObstaclePlatformDisappearing.ts Platform that fades on proximity
lib/
levelTypes.ts Tile enum, ASCII parser, defineLevel()
LevelLoader.ts Builds entities from a level matrix
levels/
01_level.ts ... 10_level.ts Individual level definitions
index.ts Aggregated LEVELS array
public/
sprites/ SVG sprites loaded by BootScene
```
## Level format
Levels are written as a short array of ASCII rows passed to `defineLevel(name, rows)`. Missing top rows are auto-padded with empty rows up to `LEVEL_ROWS` (15), so most levels only need to describe the bottom of the playfield.
Tile characters:
| Char | Tile |
| --- | --- |
| `.` | Empty |
| `#` | Platform |
| `P` | Player spawn |
| `E` | Exit |
| `~` | Disappearing platform |
| `^` | Static spike |
| `T` | Tricky spike (moves when the player approaches) |
Example (`src/levels/05_level.ts`):
```ts
import { defineLevel } from "../lib/levelTypes";
export const level05 = defineLevel("Pit Crossing", [
".E.................P",
"####...######...####",
"####^^^######^^^####",
]);
```
To add a new level: create `src/levels/NN_level.ts`, import and append it in `src/levels/index.ts`.
## Tech
- Phaser 3 (Arcade Physics)
- TypeScript (strict mode)
- Vite