bouncy penger
This commit is contained in:
parent
fea6e3879c
commit
e1d3de9c05
152
app.c
152
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];
|
||||
|
|
2
build.sh
2
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";
|
||||
|
|
|
@ -9,5 +9,9 @@
|
|||
<p id='scale'></p>
|
||||
<button id='descaling'>scale - 1</button>
|
||||
<button id='scaling'>scale + 1</button>
|
||||
<button id='reset'>reset velocity</button>
|
||||
<br>
|
||||
<p>press arrow key to move</p>
|
||||
<p>press space key to boost</p>
|
||||
</body>
|
||||
</html>
|
||||
|
|
20
load.js
20
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);
|
||||
});
|
||||
|
||||
})()
|
||||
|
|
Loading…
Reference in New Issue