From e1d3de9c05683006fd407d398f1d20499af55dcc Mon Sep 17 00:00:00 2001 From: nemo Date: Wed, 13 Nov 2024 16:46:30 +0100 Subject: [PATCH] bouncy penger --- app.c | 152 +++++++++++++++++++++++++++++++++++------------------ build.sh | 2 +- index.html | 4 ++ load.js | 20 ++++++- 4 files changed, 123 insertions(+), 55 deletions(-) diff --git a/app.c b/app.c index 505dd4d..1efe61e 100644 --- a/app.c +++ b/app.c @@ -1,28 +1,23 @@ #include "penger.c" -#define BLUE 0xffff0000 +#define GREEN 0xff00ff00 #define RED 0xff0000ff +#define BLUE 0xffff0000 #define BLACK 0xff000000 +#define GRAVITY 9 + const unsigned int width = 800; const unsigned int height = 600; unsigned int BUFFER[width * height]; -int scale(void); +int get_scale(void); typedef struct v2 { float x, y; } v2; -#define NB 10 -v2 pos[NB]; - -#define GRAVITY 5 - -#define SPEED 500 -v2 dir[NB]; - -unsigned int radius = 30; +v2 penger_pos = {400, 300}; float random(void); @@ -31,62 +26,115 @@ int rand(int min, int max) return min + random() * (max - min); } +typedef enum Key { + SHIFT = 16, + SPACE = 32, + ARROW_LEFT = 37, + ARROW_RIGHT = 39, + ARROW_UP = 38, + ARROW_DOWN = 40, + KEY_COUNT, +} Key; + +Key keys[KEY_COUNT] = {0}; + +void key_pressed(int key) +{ + if (key < 0 || key >= KEY_COUNT) return; + keys[key] = 1; +} + +void key_released(int key) +{ + if (key < 0 || key >= KEY_COUNT) return; + keys[key] = 0; +} + +v2 velocity = {0, 0}; + +void reset_velocity(void) +{ + velocity = (v2){0, 0}; +} + +void rebondi(v2 *pos, int scale) +{ + if (pos->x - penger_width*scale/2 < 0) { + pos->x = penger_width*scale/2; + velocity.x /= -1.5; + } + if (pos->y - penger_height*scale/2 < 0) { + pos->y = penger_height*scale/2; + velocity.y /= -1.5; + } + if (pos->x + penger_width*scale/2 >= width) { + pos->x = width - penger_width*scale/2; + velocity.x /= -1.5; + } + if (pos->y + penger_height*scale/2 >= height) { + pos->y = height - penger_height*scale/2; + velocity.y /= -1.5; + } +} + void init() { - for (int i = 0; i < NB; i++) { - pos[i].x = rand(radius, width - radius); - pos[i].y = rand(radius, height - radius); - - dir[i].x = SPEED; - dir[i].y = SPEED; - } } void go(float dt) { - for (int i = 0; i < NB; i++) { - v2 npos; - npos.x = pos[i].x + dir[i].x * dt; - npos.y = pos[i].y + dir[i].y * dt; + int scale = get_scale(); - if (npos.x - radius < 0 || npos.x + radius > width) { - dir[i].x = -dir[i].x; - } - if (npos.y - radius < 0 || npos.y + radius > height) { - dir[i].y = -dir[i].y; - } - - pos[i].x += dir[i].x * dt; - pos[i].y += dir[i].y * dt; + if (keys[SPACE]) { + velocity.y += velocity.y < 0 ? -10 : 10; + velocity.x += rand(-10, 10); } - for (int h = 0; h < height; h++) { - for (int w = 0; w < width; w++) { - unsigned int color = BLUE; - for (int p = 0; p < NB; p++) { - unsigned int dw = (unsigned int) pos[p].x - w; - unsigned int dh = (unsigned int) pos[p].y - h; - unsigned int d = dw * dw + dh * dh; - - if (d <= radius*radius) { - unsigned short int red = (float) d/(radius*radius) * 255; - color = BLACK + red; - break; - } - } - BUFFER[h*width + w] = color; - } + if (!keys[ARROW_UP] && !keys[ARROW_DOWN]) { + velocity.y += GRAVITY * dt; + penger_pos.y += velocity.y; + } + if (!keys[ARROW_LEFT] && !keys[ARROW_RIGHT]) { + penger_pos.x += velocity.x; } - v2 penger_origin = {(float) width/2 - 32*scale()/2, (float) height/2 - 32*scale()/2}; + float speed = 10.0f; + if ((keys[ARROW_UP] || keys[ARROW_DOWN]) && (keys[ARROW_LEFT] || keys[ARROW_RIGHT])) + speed = 6.324f; // sqrt(speed) * 2 with speed = 10 + if (keys[SHIFT]) + speed /= 2.0f; + + if (keys[ARROW_RIGHT]) { + penger_pos.x += speed; + if (velocity.x < 0) velocity.x *= -1; + } + if (keys[ARROW_LEFT]) { + penger_pos.x -= speed; + if (velocity.x > 0) velocity.x *= -1; + } + if (keys[ARROW_DOWN]) + penger_pos.y += speed; + if (keys[ARROW_UP]) + penger_pos.y -= speed; + + for (int i = 0; i < width * height; i++) + BUFFER[i] = GREEN; + + + rebondi(&penger_pos, scale); + + v2 penger_origin = {0}; + penger_origin.x = penger_pos.x - penger_width*scale/2; + penger_origin.y = penger_pos.y - penger_height*scale/2; + for (int y = 0; y < penger_height; y++) { for (int i = 0; i < penger_width; i++) { if (penger_img[y][i] <= 0x00FFFFFF) continue; - for (int s1 = 0; s1 < scale(); s1++) { - for (int s2 = 0; s2 < scale(); s2++) { - int idx_x = penger_origin.x + i*scale()+s1; - int idx_y = penger_origin.y + y*scale()+s2; + for (int s1 = 0; s1 < scale; s1++) { + for (int s2 = 0; s2 < scale; s2++) { + int idx_x = penger_origin.x + i*scale+s1; + int idx_y = penger_origin.y + y*scale+s2; if (idx_x < 0 || idx_x >= width || idx_y < 0 || idx_y >= height) continue; BUFFER[idx_y*width + idx_x] = penger_img[y][i]; diff --git a/build.sh b/build.sh index bc5799c..e103d18 100755 --- a/build.sh +++ b/build.sh @@ -1,6 +1,6 @@ #!/bin/bash -export_sym="init go BUFFER width height" +export_sym="init go key_pressed key_released reset_velocity BUFFER width height" export_cmd="" for e in $export_sym; do export_cmd="$export_cmd -Wl,--export=$e"; diff --git a/index.html b/index.html index eee1621..c6e8f2c 100644 --- a/index.html +++ b/index.html @@ -9,5 +9,9 @@

+ +
+

press arrow key to move

+

press space key to boost

diff --git a/load.js b/load.js index 95ce091..0e45823 100644 --- a/load.js +++ b/load.js @@ -1,9 +1,12 @@ -var scale = 12; +var scale = 7; + +var global_instance; window.onload = () => { var scale_but = document.getElementById("scaling"); var descale_but = document.getElementById("descaling"); var scale_p = document.getElementById("scale"); + var reset_but = document.getElementById("reset"); scale_p.innerText = "scale: " + scale; scale_but.onclick = () => { scale++; @@ -13,6 +16,9 @@ window.onload = () => { scale--; scale_p.innerText = "scale: " + scale; } + reset_but.onclick = () => { + global_instance.exports.reset_velocity(); + } }; function make_environment(...envs) { @@ -33,10 +39,12 @@ function make_environment(...envs) { const { instance } = await WebAssembly.instantiateStreaming(fetch("./app.wasm"), { "env": make_environment({ 'random': Math.random, - 'scale': () => {return scale}, + 'get_scale': () => {return scale}, }) }); +global_instance = instance; + const memory = new Uint32Array(instance.exports.memory.buffer); const width = memory[instance.exports.width.value / 4]; @@ -76,4 +84,12 @@ function loop(timestamp) { } window.requestAnimationFrame(first); +addEventListener('keydown', (e) => { + instance.exports.key_pressed(e.keyCode); +}); + +addEventListener('keyup', (e) => { + instance.exports.key_released(e.keyCode); +}); + })()