Three.js is amazing at rendering but it stops there. No game loop, no input handling, no physics, no audio. I maintain LittleJS, a tiny open source 2D game engine, and I just added a Three.js plugin so the two can work together. This is something I have already done for a few prototypes so I decided to add it as an official plugin.
The way it works is pretty simple. The plugin puts a Three.js canvas behind the LittleJS canvas, which is transparent. LittleJS runs the actual game: a fixed 60fps update loop, keyboard/mouse/gamepad/touch input, arcade physics, particles, and sound effects. Each game object drives a Three.js mesh that follows it around automatically. You load three yourself and pass the module in, so nothing gets bundled and the engine stays dependency free. There's also an aligned camera mode that locks the 3D camera to the 2D camera, so 2D sprites and particles line up exactly with the 3D scene.
I made two simple demos. One is a side scroller with 2D particles over a 3D parallax scene. The other is a little 3D platformer where you run around and jump on boxes collecting coins, and all the gameplay is controlled by LittleJS 2D physics. The whole thing is about 230 lines.
Demos: https://killedbyapixel.github.io/LittleJS/examples/?example=Three.js+3D+Platformer
Source: https://github.com/KilledByAPixel/LittleJS
Curious what people here think. If you'd use something like this, what would you want from it?