66 lines
1.8 KiB
TypeScript
66 lines
1.8 KiB
TypeScript
|
|
import * as c from "../constants.js"
|
|
import * as en from "../../shared_js/enums.js"
|
|
import { VectorInteger } from "./Vector.js";
|
|
import { Rectangle, MovingRectangle, Racket, Ball } from "./Rectangle.js";
|
|
import { random } from "../utils.js";
|
|
|
|
class GameComponents {
|
|
wallTop: Rectangle | MovingRectangle;
|
|
wallBottom: Rectangle | MovingRectangle;
|
|
playerLeft: Racket;
|
|
playerRight: Racket;
|
|
ballsArr: Ball[] = [];
|
|
constructor(options: en.MatchOptions)
|
|
{
|
|
const pos = new VectorInteger;
|
|
|
|
// Rackets
|
|
pos.assign(0+c.pw, c.h_mid-c.ph/2);
|
|
this.playerLeft = new Racket(pos, c.pw, c.ph, c.racketSpeed);
|
|
pos.assign(c.w-c.pw-c.pw, c.h_mid-c.ph/2);
|
|
this.playerRight = new Racket(pos, c.pw, c.ph, c.racketSpeed);
|
|
|
|
// Balls
|
|
let ballsCount = 1;
|
|
if (options & en.MatchOptions.multiBalls) {
|
|
ballsCount = c.multiBallsCount;
|
|
}
|
|
pos.assign(-c.ballSize, -c.ballSize); // ball out =)
|
|
while (this.ballsArr.length < ballsCount) {
|
|
this.ballsArr.push(new Ball(pos, c.ballSize, c.ballSpeed, c.ballSpeedIncrease))
|
|
}
|
|
this.ballsArr.forEach((ball) => {
|
|
ball.dir.x = 1;
|
|
if (random() > 0.5) {
|
|
ball.dir.x *= -1;
|
|
}
|
|
|
|
ball.dir.y = random(0, 0.2);
|
|
if (random() > 0.5) {
|
|
ball.dir.y *= -1;
|
|
}
|
|
|
|
ball.dir = ball.dir.normalized();
|
|
});
|
|
|
|
// Walls
|
|
if (options & en.MatchOptions.movingWalls) {
|
|
pos.assign(0, 0);
|
|
this.wallTop = new MovingRectangle(pos, c.w, c.wallSize, c.movingWallSpeed);
|
|
(<MovingRectangle>this.wallTop).dir.y = -1;
|
|
pos.assign(0, c.h-c.wallSize);
|
|
this.wallBottom = new MovingRectangle(pos, c.w, c.wallSize, c.movingWallSpeed);
|
|
(<MovingRectangle>this.wallBottom).dir.y = 1;
|
|
}
|
|
else {
|
|
pos.assign(0, 0);
|
|
this.wallTop = new Rectangle(pos, c.w, c.wallSize);
|
|
pos.assign(0, c.h-c.wallSize);
|
|
this.wallBottom = new Rectangle(pos, c.w, c.wallSize);
|
|
}
|
|
}
|
|
}
|
|
|
|
export {GameComponents}
|