You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
4.0 KiB
153 lines
4.0 KiB
2 years ago
|
"use strict"
|
||
|
|
||
|
class Player{
|
||
|
|
||
|
constructor(x, y){
|
||
|
this.pos = createVector(x, y);
|
||
|
this.vel = createVector(0, 0);
|
||
|
this.acc = createVector(0, 0.25);
|
||
|
this.radius = 50;
|
||
|
this.brick = null;
|
||
|
this.colorSetup();
|
||
|
}
|
||
|
|
||
|
update(){
|
||
|
this.move();
|
||
|
}
|
||
|
|
||
|
display(){
|
||
|
this.show();
|
||
|
}
|
||
|
|
||
|
move(){
|
||
|
if (this.brick){
|
||
|
this.vel.y = 0;
|
||
|
this.pos.add(this.brick.vel);
|
||
|
this.pos.y = this.brick.pos.y - this.radius;
|
||
|
}
|
||
|
|
||
|
this.pos.add(this.vel);
|
||
|
this.vel.add(this.acc);
|
||
|
|
||
|
this.vel.x *= 0.95;
|
||
|
|
||
|
let limit = this.maxVelocityX;
|
||
|
if (this.vel.x < -limit) this.vel.x = -limit;
|
||
|
if (this.vel.x > limit) this.vel.x = limit;
|
||
|
}
|
||
|
|
||
|
show(){
|
||
|
stroke(red(this.color) * 0.5, green(this.color) * 0.5, blue(this.color) * 0.5);
|
||
|
strokeWeight(1);
|
||
|
|
||
|
//Body
|
||
|
fill(this.color);
|
||
|
ellipse(this.pos.x, this.pos.y, this.radius * 2);
|
||
|
|
||
|
//Eyes
|
||
|
let radius = this.radius * 0.3;
|
||
|
let dispoX = 1 / (1 + pow(0.7, this.vel.x)) - 0.5;
|
||
|
let dispoY = 1 / (1 + pow(0.7, this.vel.y)) - 0.5;
|
||
|
let outerDispoX = dispoX * this.radius / 2;
|
||
|
let outerDispoY = dispoY * this.radius / 2;
|
||
|
let innerDispoX = outerDispoX + dispoX * radius / 2;
|
||
|
let innerDispoY = outerDispoY + dispoY * radius / 2;
|
||
|
|
||
|
fill(colors.player.eyes.outer);
|
||
|
ellipse(this.pos.x + radius + outerDispoX, this.pos.y - radius + outerDispoY, radius, radius * 4/3);
|
||
|
ellipse(this.pos.x - radius + outerDispoX, this.pos.y - radius + outerDispoY, radius, radius * 4/3);
|
||
|
|
||
|
fill(colors.player.eyes.inner);
|
||
|
ellipse(this.pos.x + radius + innerDispoX, this.pos.y - radius + innerDispoY, radius / 2, radius * 2/3);
|
||
|
ellipse(this.pos.x - radius + innerDispoX, this.pos.y - radius + innerDispoY, radius / 2, radius * 2/3);
|
||
|
|
||
|
//Mouth
|
||
|
let rotation = dispoX / 2;
|
||
|
|
||
|
fill(red(this.color) / 3, green(this.color) / 3, blue(this.color) / 3);
|
||
|
arc(this.pos.x, this.pos.y + this.radius * 0.2 + dispoY * this.radius / 2, this.radius, this.radius * 0.8, PI / 16 + rotation, PI - PI / 16 + rotation, CHORD);
|
||
|
}
|
||
|
|
||
|
collision(bricks, world){
|
||
|
|
||
|
//Bricks
|
||
|
if (!this.touches(this.brick)){
|
||
|
let brick = null;
|
||
|
for (let b of bricks){
|
||
|
if (this.touches(b)){
|
||
|
brick = b;
|
||
|
break;
|
||
|
} else brick = null;
|
||
|
}
|
||
|
this.brick = brick;
|
||
|
}
|
||
|
|
||
|
let trashHold = 10;
|
||
|
//World borders
|
||
|
if (this.pos.x - this.radius < world.pos.x) this.pos.x = world.pos.x + this.radius;
|
||
|
if (this.pos.x + this.radius > world.pos.x + world.dim.x) this.pos.x = world.pos.x + world.dim.x - this.radius;
|
||
|
if (this.pos.y - this.radius < world.pos.y){
|
||
|
this.pos.y = world.pos.y + this.radius;
|
||
|
this.vel.y *= -1;
|
||
|
}
|
||
|
if (this.pos.y - this.radius > world.pos.y + world.dim.y) game.lost();
|
||
|
}
|
||
|
|
||
|
touches(object){
|
||
|
if (!object) return false;
|
||
|
|
||
|
let hitbox = object.getHitbox();
|
||
|
|
||
|
if (object instanceof Brick){
|
||
|
if (this.pos.x + this.radius / 2 > hitbox.pos.x && this.pos.x - this.radius / 2 < hitbox.pos.x + hitbox.dim.x &&
|
||
|
(this.pos.y + this.radius <= hitbox.pos.y && (this.pos.y + this.radius + this.vel.y >= hitbox.pos.y + hitbox.vel.y
|
||
|
|| this.pos.y + this.radius + this.vel.y >= hitbox.pos.y))){
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
if (object instanceof Coin){
|
||
|
let distX = abs(this.pos.x - (hitbox.pos.x + hitbox.dim.x / 2));
|
||
|
let distY = abs(this.pos.y - (hitbox.pos.y + hitbox.dim.y / 2));
|
||
|
if ((distX <= (hitbox.dim.x / 2) || distY <= (hitbox.dim.y / 2))
|
||
|
&& distX < (hitbox.dim.x / 2 + this.radius)
|
||
|
&& distY < (hitbox.dim.y / 2 + this.radius)) return true;
|
||
|
let dx = distX - hitbox.dim.x / 2;
|
||
|
let dy = distY - hitbox.dim.y / 2;
|
||
|
if (dx * dx + dy * dy <= this.radius * this.radius) return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
walk(d){
|
||
|
this.acc.x = d;
|
||
|
}
|
||
|
|
||
|
break(){
|
||
|
this.acc.x = 0;
|
||
|
}
|
||
|
|
||
|
jump(){
|
||
|
if (!this.brick) return;
|
||
|
this.vel.y = -abs(this.vel.x * 0.3) - this.jumpVelocity + this.brick.vel.y;
|
||
|
this.brick = null;
|
||
|
new Sound(Sound.Jump()).play();
|
||
|
}
|
||
|
|
||
|
fall(d){
|
||
|
this.acc.y += d * 0.5;
|
||
|
}
|
||
|
|
||
|
setColor(color){
|
||
|
this.color = color;
|
||
|
}
|
||
|
|
||
|
colorSetup(){
|
||
|
let h = int(random(360));
|
||
|
h = floor(h / 60) * 60;
|
||
|
let c = color(colors.player.body);
|
||
|
colorMode(HSB);
|
||
|
this.color = color(h, saturation(c), brightness(c));
|
||
|
colorMode(RGB);
|
||
|
}
|
||
|
|
||
|
}
|