- OOP & gamedev experiment inspired by Crimsonland.
- For learning: code quality equally important as gameplay.
- Arena/twin-stick shooter concept, but with infinite procedurally generated world.
- Top-down 2d, standard keyboard & mouse controls.
- Enemies assault player from all sides, movement and kiting important.
- Pick up weapons, abilities & power-ups.
- Level up and select upgrades & stats.
- Per-profile unlocks & stats - saved to localstate and/or DB.
TypeScript, Canvas
asap: player death/win/lose
then: static entities (terrain, water, plants, hazards, fire, traps), aoe damage?
consider: sprites, art library, music, sound effects, improving and tweaking collision, player progression/profile/unlocks
class | feature | details | status |
---|---|---|---|
Game | loop & hierarchy | ✔️ | |
Controls | intercept & buffer input | ✔️ | |
Player | movement | ✔️ | |
Player | entity collision | ✔️ | |
World | world constructor | only determines max area for now | ✔️ |
Game | world edge | draw & collision | ✔️ |
Game Menu Controls | pause game | conditional update in Game | ✔️ |
Menu Controls | select options | wasd and/or mouse | ✔️ |
Game Menu Controls | start/reset | hotkey too? | ✔️ |
Game Player | camera follows player | ✔️ | |
HUD | hud draw method | extract from Game | ✔️ |
Entity | movement v2 | direction & acceleration -> velocity | ✔️ |
Entity | friction/drag/deceleration | ✔️ | |
Game/Save | settings/score/unlocks? | localStorage JSON | |
Entity Spawner | generate enemies over time | randomly placed inside world for now | ✔️ |
Entity | spawn outside vision | depends on camera (canvas) size | ✔️ |
MovingEntity | move towards player | ✔️ | |
Entity | take damage & destruction | enemies.delete(this) should work | ✔️ |
Game Player | win/lose conditions | lose: death, win: score/kills/time | |
Player | use ability | screen (visible enemies?) wipe, heal item | ✔️ |
Player | ability variety | more consumables and/or cooldown based | |
Controls Player? | mouse aim | only when mouse inside canvas or not? | ✔️ |
Weapon Controls | fire projectile | mouse1, vector player -> aim direction | ✔️ |
Game Weapon | spawn in world | ✔️ | |
Player Weapon | pick up weapon | on collision? attached? visuals? | ✔️ |
Entity Projectile | move & collide | overload entity calculatevector (no friction) | ✔️ |
Entity Enemy | enemy ranged attacks | vector enemy -> player | ✔️ |
World Player Entity | powerups | activated on collision,various effects | |
Player Game Controls | upgrades | xp, pause and select stat++ and/or ability | |
World | static entities (terrain) | with collision | |
World | hazards | fire/lightning etc, damage based on delta time | |
World | varying visuals | random gradients at first for some variance | |
Graphics | sprites/pixel art | find free stuff with consistent theme | |
Graphics/Particles | blood, explosions etc. | visual effect only, despawn after X time? | |
World | procedural generation | seeded world, find algorithm | |
World | area cells | 3x3 or 5x5 matrix, player always in center | |
World | infinite area | generate cells around player (outside vision) | |
Sound | sound effects | find free library with good sound design | |
Sound | music | freely licensed doom/metal-ish | ✔️ |
Save | auth and/or database | Netlify serverless/AWS lambda & MongoDB Atlas | |
code | tests | Jest | |
code | CI/CD | Netlify? | |
content | more variety | more enemies, weapons, upgrades, worlds(?) etc. |
Game
|-- canvas
|-- Debug
|-- Menu
|-- HUD
|-- Controls
|-- World
| |-- width/height
|-- MovingEntity/Player
| |-- health & maxHealth
| |-- width & height
| |-- position = {x,y}
| |-- velocity = Vector
| |-- acceleration = Vector
| |-- speed() & maxSpeed
|-- MovingEntity/Enemy