xxxxxxxxxx
205
let w = 10;
let h = 10;
let s = 40;
let vel;
let player;
let spd = 0.1;
let spd_cap = 0.1;
let emitters = [];
let bullets = [];
let flask = [
0,0,0,0,0,0,0,0,0,0,
0,0,0,1,1,1,1,0,0,0,
0,0,0,0,1,1,0,0,0,0,
0,0,0,0,1,1,0,0,0,0,
0,0,1,1,1,1,1,1,0,0,
0,1,1,1,1,1,1,1,1,0,
0,1,1,1,1,1,1,1,1,0,
0,0,1,1,1,1,1,1,0,0,
0,0,0,1,1,1,1,0,0,0,
0,0,0,0,0,0,0,0,0,0,
];
let keys = {};
let hit = {};
let lastTime = 0;
function setup() {
createCanvas(400, 400);
player = createVector(4.5, 1.5);
vel = createVector(0, 0);
emitters.push(new Emitter(5, 5, 1, 0.5));
emitters.push(new Emitter(5, 5, -1, 0.5));
}
function draw() {
background(220);
const currTime = millis();
const d = (currTime - lastTime) / 1000;
lastTime = currTime;
handleInput(d);
render();
update(d);
}
function update(d) {
hit[keyName(player.x | 0, player.y | 0)] = true;
emitters.forEach(emitter => {
emitter.update(d);
});
bullets = bullets.filter(bullet => bullet.update(d));
}
function render() {
drawTiles();
drawPlayer();
emitters.forEach(emitter => {
emitter.draw();
});
bullets.forEach(bullet => {
bullet.draw();
});
}
function keyName(i, j) {
return i + ":" + j;
}
function idx(i, j) {
return i + j * w;
}
function keyPressed() {
keys[key] = true;
// dash
if(key == " ") {
spd = spd_cap * 4;
}
}
function keyReleased() {
delete keys[key]
}
function handleInput() {
let mv = createVector(0, 0);
if(keys["w"]) mv.y -= 1;
if(keys["s"]) mv.y += 1;
if(keys["a"]) mv.x -= 1;
if(keys["d"]) mv.x += 1;
mv = mv.normalize();
// dash
if(spd - spd_cap > 0.001) {
spd = (spd - spd_cap) * 0.8 + spd_cap;
}
let oldx = player.x;
let oldy = player.y;
vel.x = mv.x;
vel.y = mv.y;
player.x += vel.x * spd;
player.y += vel.y * spd;
if(!validTile(player.x, oldy)) {
player.x = oldx;
}
if(!validTile(oldx, player.y)) {
player.y = oldy;
}
if(!validTile(player.x, player.y)) {
player.x = oldx;
player.y = oldy;
}
}
function validTile(i, j) {
return flask[idx(i | 0, j | 0)] == 1;
}
function drawPlayer() {
fill(200);
ellipse(player.x * s, player.y * s, s/2, s/2);
}
function drawTiles() {
for(let j = 0; j < h; j ++) {
for(let i = 0; i < w; i ++) {
if(keyName(i, j) in hit) {
fill(200);
} else if(flask[idx(i, j)] == 1) {
fill(100);
} else {
fill(0);
}
rect(i * s, j * s, s, s);
}
}
}
class Emitter {
constructor(x, y, rotSpeed, fireSpeed) {
this.x = x;
this.y = y;
this.a = 0;
this.rotSpeed = rotSpeed;
this.fireSpeed = fireSpeed;
this.timer = this.fireSpeed;
}
update(d) {
this.timer += d;
this.a += this.rotSpeed * d;
if(this.timer > this.fireSpeed) {
this.timer = 0;
const b = new Bullet(this.x, this.y, p5.Vector.fromAngle(this.a));
bullets.push(b);
}
}
draw() {
circle(this.x * s, this.y * s, s/2);
}
}
class Bullet {
constructor(x, y, vel) {
this.pos = createVector(x, y);
this.vel = vel;
}
update(d) {
this.pos.add(p5.Vector.mult(this.vel, d));
return validTile(this.pos.x, this.pos.y);
}
draw() {
circle(this.pos.x * s, this.pos.y * s, s/4);
}
}