Basically trying to adapt love.js to the latest and greatest versions of LÖVE and Emscripten.
- Specification Test; (Compatibility Version) (threads, coroutines, shaders!)
- Another Kind of World; (Compatibility Version)
- groverburger's 3D engine (g3d); (Compatibility Version) (shaders, click canvas to lock)
- Supported Graphical Features Test; (Compatibility Version)
love.js game.love game -c
Build a game with the compatibility version.
Install the package from npm
; no need to download this repo:
npm i love.js
or globally:
npm -g i love.js
npx love.js [options] <input> <output>
or
love.js [options] <input> <output>
or (on Windows cmd and Powershell, according to Davidobot#48)
npx love.js.cmd [options] <input> <output>
<input>
can either be a folder or a .love
file.
<output>
is a folder that will hold debug and release web pages.
You can also replace love.js
in the above command with index.js
(or node index.js
on Windows) directly if the numpy install is giving you problems.
-h, --help output usage information
-V, --version output the version number
-t, --title <string> specify game name
-m, --memory [bytes] how much memory your game will require [16777216]
-c, --compatibility specify flag to use compatibility version
- Run a web server (while
cd
-ed into the<output>
folder):
- eg:
python -m http.server 8000
- Open
localhost:8000
in the browser of your choice.
- Compatibility version (
-c
) should work with most browsers. The difference is that pthreads aren't used. This results in dodgy audio. - The normal version works in the latest Chrome and should work with the latest Firefox version.
The normal version can throw Uncaught ReferenceError: SharedArrayBuffer is not defined
. Fix is discussed here. TL;DR
Enable the following HTML reponse headers on the website you're hosting your project on:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
If you want to publish your game on one of the game hosting platforms, like itch.io for example:
- if they include these headers, use the standard version
- if they don't, use the compatibility mode instead (
-c
)On itch.io, they are disabled by default, but they provide experimental support for it. Read more about this here.
- Memory is now dynamically resized even with pthreads thanks to this. Still needs a large-enough initial memory until I figure out how to properly wait for the memory to be sized-up before initialising all the file-system stuff (pointers here).
- Shaders work (check out 3D demo), but require stricter type-checking. The OpenGL ES Shading Language is type safe. There are no implicit conversions between types (source). So something like
vec4 effect(vec4 color, Image tex, vec2 texture_coords, vec2 screen_coords)
{
vec4 texturecolor = Texel(tex, texture_coords);
return texturecolor * color / 2;
}
won't work, but changing line 4 to the code below will make everything run just fine:
return texturecolor * color / 2.0;
-
If you use
love.mouse.setGrabbed
orlove.mouse.setRelative
, the user needs to click on the canvas to "lock" the mouse. -
Use
love.filesystem.getInfo(file_name)
before trying to read a potentially non-existent file. -
If you use a depth buffer, add the following line:
t.window.depth = 16
to yourconfig.lua
file to make sure normals aren't inverted in Firefox. -
If you'd like to run javascript from within your game, you might find the following repo useful.
Clone the megasource and love and then run build_lovejs.sh
(with minor changes for file paths).
That should just work™. Make sure you have CMake installed, clone emsdk and edit build_lovejs.sh
to point to the right paths.
Set up emsdk with the following settings:
./emsdk install 2.0.0
./emsdk activate 2.0.0
Note, using v:2.0.0 is important as newer versions have depreciated getMemory
Clone the megasource and love and then run build_lovejs.bat
(with minor changes for file paths) in PowerShell.
Make sure you have CMake and Make (e.g. through chocolatey), and that you have the latest Visual Studio build bundles installed. Clone emsdk and edit build_lovejs.bat
to point to the right paths.