diff --git a/.gitignore b/.gitignore
index 3af53d7..f163d7c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,4 @@ hand.c
index.html
museum.c
pengers.h
+node_modules/
diff --git a/README.md b/README.md
index 638ebeb..5617fba 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,3 @@
-# WASM test
+# PENGER PARTY
-this is a test to understand how wasm work, this repo contains exemple of :
-
-- compiling wasm module from c
-- loading wasm module in js
-- importing / exporting symbol
-- PENGER
-
-it's also a 'template' for copy pasting js boilerplate.
+Let's penger together
diff --git a/docker-compose.yml b/docker-compose.yml
index d617474..974225f 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -3,8 +3,10 @@ version: "3"
services:
web:
container_name: "web"
- image: "httpd"
+ image: "node"
ports:
- "6969:80"
+ - "8080:8080"
volumes:
- - ".:/usr/local/apache2/htdocs/"
+ - ".:/app"
+ command: "node /app/server.js"
diff --git a/index.html.template b/index.html.template
index 3f20d8e..a24967f 100644
--- a/index.html.template
+++ b/index.html.template
@@ -11,6 +11,9 @@
width: 64px;
image-rendering: pixelated;
}
+ .players-img {
+ margin-right: 10px;
+ }
h1 {
text-align: center;
font-size: 1.5em;
@@ -47,6 +50,14 @@
Penger is afraid of your stinky hand
+
Multiplayer:
+
+ play with the pseudo name:
+
+
+
+
Players:
+
Choose your penger:
diff --git a/load.js b/load.js
index cee4076..edef881 100644
--- a/load.js
+++ b/load.js
@@ -1,8 +1,46 @@
-var scale = 2;
+const connection = new WebSocket('ws://localhost:8080');
+connection.onmessage = (e) => {
+ var req = JSON.parse(e.data);
+ if (req.name == 'pseudo') {
+ document.getElementById('players').innerHTML = req.value;
+ var pengers_img = document.getElementsByClassName('penger-img');
+ var list = [];
+ for (var i = 0; i < pengers_img.length; i++) {
+ list[list.length] = pengers_img[i].src;
+ }
+ var players_img = document.getElementsByClassName('players-img');
+ for (var i = 0; i < players_img.length; i++) {
+ players_img[i].src = list[players_img[i].getAttribute('penger-id')];
+ }
+ }
+};
var global_instance;
var global_memory;
+var scale = 2;
+
+window.onload = () => {
+ var canvas = document.getElementById("demo-canvas");
+ canvas.onmousemove = (e) => {
+ var r = canvas.getBoundingClientRect();
+ wasm_function('set_mouse')(e.clientX - r.x, e.clientY - r.y);
+ }
+ var pengers_img = document.getElementsByClassName('penger-img');
+ for (var i = 0; i < pengers_img.length; i++) {
+ pengers_img[i].onclick = (e) => {
+ var id = e.target.getAttribute('penger-id');
+ wasm_set_variable('id', id)
+ connection.send('{"name": "id", "value": "'+id+'"}');
+ };
+ }
+ var play = document.getElementById('play');
+ play.onclick = () => {
+ var pseudo = document.getElementById('pseudo').value;
+ connection.send('{"name": "pseudo", "value": "'+pseudo+'"}');
+ };
+};
+
function wasm_variable(name)
{
return global_memory[global_instance.exports[name].value / 4];
@@ -16,18 +54,6 @@ function wasm_function(name)
return global_instance.exports[name];
}
-window.onload = () => {
- var canvas = document.getElementById("demo-canvas");
- var pengers_img = document.getElementsByClassName('penger-img');
- canvas.onmousemove = (e) => {
- var r = canvas.getBoundingClientRect();
- wasm_function('set_mouse')(e.clientX - r.x, e.clientY - r.y);
- }
- for (var i = 0; i < pengers_img.length; i++) {
- pengers_img[i].onclick = (e) => {wasm_set_variable('id', e.target.getAttribute('penger-id'))}
- }
-};
-
(async() => {
// jsp, je l'ai pris de la: https://github.com/tsoding/olive.c
@@ -82,7 +108,9 @@ wasm_function('init')();
let prev = null;
function first(timestamp) {
- wasm_set_variable('id', Math.random() * document.getElementsByClassName('penger-img').length);
+ var id = Math.floor(Math.random() * document.getElementsByClassName('penger-img').length);
+ wasm_set_variable('id', id);
+ connection.send('{"name": "id", "value": "'+id+'"}');
prev = timestamp;
wasm_function('draw')(0.16);
window.requestAnimationFrame(loop);
@@ -97,7 +125,12 @@ function loop(timestamp) {
}
window.requestAnimationFrame(first);
+var is_on_canva = false;
+document.getElementById("demo-canvas").addEventListener("mouseenter", () => {is_on_canva = true;});
+document.getElementById("demo-canvas").addEventListener("mouseout", () => {is_on_canva = false;});
+
addEventListener('keydown', (e) => {
+ if (!is_on_canva) return;
wasm_function('key_pressed')(e.keyCode);
if(["Space","ArrowLeft","ArrowRight"].indexOf(e.code) > -1) {
e.preventDefault();
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..ff81560
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,36 @@
+{
+ "name": "webassembly",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "webassembly",
+ "version": "1.0.0",
+ "license": "ISC",
+ "dependencies": {
+ "ws": "^8.18.0"
+ }
+ },
+ "node_modules/ws": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
+ "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..2b7dfaa
--- /dev/null
+++ b/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "webassembly",
+ "version": "1.0.0",
+ "description": "",
+ "main": "load.js",
+ "scripts": {
+ "start": "node server.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/CaptainBoulbi/wasm-test.git"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "bugs": {
+ "url": "https://github.com/CaptainBoulbi/wasm-test/issues"
+ },
+ "homepage": "https://github.com/CaptainBoulbi/wasm-test#readme",
+ "dependencies": {
+ "ws": "^8.18.0"
+ }
+}
diff --git a/server.js b/server.js
new file mode 100644
index 0000000..6b5fdb3
--- /dev/null
+++ b/server.js
@@ -0,0 +1,78 @@
+const fs = require('fs');
+const http = require("http");
+const ws = require('ws');
+
+const HTTP_PORT = 80;
+const WS_PORT = 8080;
+const DIR = "/app";
+
+function update_player_list()
+{
+ var list = "";
+ sockets.forEach((s) => { if (s.game.pseudo == undefined || s.game.pseudo == "") return; list += "
" + s.game.pseudo + ""; });
+ sockets.forEach((s) => { s.send('{"name": "pseudo", "value": "'+list+'"}'); });
+}
+
+const requestListener = function (req, res) {
+ var url = req.url;
+
+ if (url == "/" || url == "/index.html") {
+ res.setHeader("Content-Type", "text/html");
+ res.writeHead(200);
+ res.end(fs.readFileSync(DIR + "/index.html"));
+ return;
+ }
+
+ if (url == "/app.wasm") {
+ res.setHeader("Content-Type", "application/wasm");
+ res.writeHead(200);
+ res.end(fs.readFileSync(DIR + url));
+ return;
+ }
+
+ if (url == "/load.js") {
+ res.setHeader("Content-Type", "text/javascript");
+ res.writeHead(200);
+ res.end(fs.readFileSync(DIR + url));
+ return;
+ }
+
+ if (url.startsWith("/museum/")) {
+ res.setHeader("Content-Type", "image/png");
+ res.writeHead(200);
+ res.end(fs.readFileSync(DIR + url));
+ return;
+ }
+
+ res.setHeader("Content-Type", "text/html");
+ res.writeHead(404);
+ res.end(`Page not found`);
+};
+
+const http_server = http.createServer(requestListener);
+http_server.listen(HTTP_PORT, () => {
+ console.log(`Server is running on port ${HTTP_PORT}`);
+});
+
+const ws_server = new ws.Server({ port: WS_PORT });
+
+var sockets = [];
+ws_server.on('connection', (socket) => {
+ socket.game = {};
+ sockets.push(socket);
+ console.log("connect: ", sockets.length );
+
+ socket.on('message', (msg) => {
+ var msg_str = Buffer.from(msg).toString('latin1');
+ var req = JSON.parse(msg_str);
+ socket.game[req.name] = req.value;
+ update_player_list();
+ console.log(socket.game);
+ });
+
+ socket.on('close', () => {
+ sockets = sockets.filter(s => s !== socket);
+ console.log("close: ", sockets.length);
+ update_player_list();
+ });
+});