bp-prism-game
Version:
The BP Prism Game
143 lines • 17 kB
JavaScript
import { ObservableTypeEnum } from '../enum/observable-type.enum';
import { MissileClass } from '../missile/missile.class';
/**
* The projectile service
*/
export class MissileService {
/**
* The constructor
*
* @param gameService The GameService
* @param ctx The ctx
*/
constructor(gameService, ctx) {
this.gameService = gameService;
this.ctx = ctx;
this.missiles = [];
this.currentMissilePosition = this.gameService.getGunnerPosition();
this.currentMissilePosition.x += 2.5;
this.currentMissileRotation = 0;
this.isGamePaused = false;
}
/**
* Init the service with the listener
*/
init() {
this.gameService.getMasterObservable().subscribe((event) => {
if (event.type === ObservableTypeEnum.gameOver) {
this.canFire = !event.booleanData;
}
else if (event.type === ObservableTypeEnum.missileLaunched) {
this.currentMissilePosition = event.assetCoordinateData;
this.launchMissile(event);
}
else if (event.type === ObservableTypeEnum.missileDestroyed) {
this.markMissileDestroyed(event);
}
else if (event.type === ObservableTypeEnum.prismBlastFire) {
this.firePrismBlastMissiles();
}
else if (event.type === ObservableTypeEnum.gamePaused) {
this.isGamePaused = event.booleanData;
}
});
}
/**
* Mark a Missile Destroyed
* @param event The event
*/
markMissileDestroyed(event) {
this.missiles[event.numberData].isDestroyed = true;
this.missiles[event.numberData].isAnimated = false;
}
/**
* Find any unused missiles
*/
findUnusedMissile() {
return this.missiles.filter((missile) => missile.isDestroyed)[0];
}
/**
* Return all Active Missiles
*/
getActiveMissiles() {
return this.missiles.filter((missile) => missile.isAnimated);
}
/**
* Remove all the missiles
*/
removeMissiles() {
this.getActiveMissiles().map((missile) => {
missile.isDestroyed = true;
missile.isAnimated = false;
});
}
/**
* Fire the Prism Blast Missiles
*/
firePrismBlastMissiles() {
for (let index = 0; index < 128; index++) {
this.currentMissileRotation = (index + 1) * 5.625;
let missile = this.findUnusedMissile();
if (!missile) {
missile = new MissileClass(this.gameService, this.ctx, this.missiles.length);
this.missiles.push(missile);
}
missile.isDestroyed = false;
missile.isAnimated = false;
missile.move(this.currentMissilePosition);
missile.setMissileData({
rotation: this.currentMissileRotation,
position: this.currentMissilePosition
});
// This required to keep it in front of the game component clearRect
setTimeout(() => {
missile.setMissileColor((index % 7) + 1);
missile.isAnimated = true;
}, (index + 1) * 25);
}
}
/**
* Animate the missiles
* @param now the current time stamp
*/
animate(now = 0) {
if (!this.isGamePaused) {
this.missiles
.filter((missile) => missile.isAnimated)
.map((missile) => {
missile.animate(now);
});
}
}
/**
* Launch a Missile
* @param event The event
*/
launchMissile(event) {
if (this.canFire) {
for (let index = 0; index < 3; index++) {
this.currentMissileRotation = event.assetRotationData;
if (index === 1) {
this.currentMissileRotation += 135;
}
if (index === 2) {
this.currentMissileRotation -= 135;
}
let missile = this.findUnusedMissile();
if (!missile) {
missile = new MissileClass(this.gameService, this.ctx, this.missiles.length);
this.missiles.push(missile);
}
missile.isDestroyed = false;
missile.move(event.assetCoordinateData);
missile.setMissileData({
rotation: this.currentMissileRotation,
position: event.assetCoordinateData
});
missile.isAnimated = true;
missile.unsetMissileColor();
}
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlzc2lsZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJpc20vc3JjL2xpYi9zZXJ2aWNlL21pc3NpbGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFJeEQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQXNCekI7Ozs7O09BS0c7SUFDSCxZQUFvQixXQUF3QixFQUFVLEdBQTZCO1FBQS9ELGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBMEI7UUFDakYsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNuRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQztRQUNyQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNJLElBQUk7UUFDVCxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBc0IsRUFBRSxFQUFFO1lBQzFFLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUU7Z0JBQzlDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO2FBQ25DO2lCQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxrQkFBa0IsQ0FBQyxlQUFlLEVBQUU7Z0JBQzVELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFL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QzdFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUM3QjtnQkFDRCxPQUFPLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztnQkFFNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFDeEMsT0FBTyxDQUFDLGNBQWMsQ0FBQztvQkFDckIsUUFBUSxFQUFFLElBQUksQ0FBQyxzQkFBc0I7b0JBQ3JDLFFBQVEsRUFBRSxLQUFLLENBQUMsbUJBQW1CO2lCQUNkLENBQUMsQ0FBQztnQkFDekIsT0FBTyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBRTFCLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQzdCO1NBQ0Y7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHYW1lU2VydmljZSB9IGZyb20gJy4vZ2FtZS5zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGVNb2RlbCB9IGZyb20gJy4uL21vZGVsL29ic2VydmFibGUubW9kZWwnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZVR5cGVFbnVtIH0gZnJvbSAnLi4vZW51bS9vYnNlcnZhYmxlLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBNaXNzaWxlQ2xhc3MgfSBmcm9tICcuLi9taXNzaWxlL21pc3NpbGUuY2xhc3MnO1xuaW1wb3J0IHsgTWlzc2lsZUxhdW5jaE1vZGVsIH0gZnJvbSAnLi4vbWlzc2lsZS9tb2RlbC9taXNzaWxlLWxhdW5jaC5tb2RlbCc7XG5pbXBvcnQgeyBJQXNzZXQgfSBmcm9tICcuLi9pbnRlcmZhY2UvYXNzZXQuaW50ZXJmYWNlJztcblxuLyoqXG4gKiBUaGUgcHJvamVjdGlsZSBzZXJ2aWNlXG4gKi9cbmV4cG9ydCBjbGFzcyBNaXNzaWxlU2VydmljZSB7XG4gIC8qKlxuICAgKiBUaGUgbWlzc2lsZXNcbiAgICovXG4gIHByaXZhdGUgbWlzc2lsZXM6IE1pc3NpbGVDbGFzc1tdO1xuICAvKipcbiAgICogVGhlIGNhbiBmaXJlXG4gICAqL1xuICBwcml2YXRlIGNhbkZpcmU6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBtaXNzaWxlIHJvdGF0aW9uXG4gICAqL1xuICBwcml2YXRlIGN1cnJlbnRNaXNzaWxlUm90YXRpb246IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IG1pc3NpbGUgUG9zaXRpb25cbiAgICovXG4gIHByaXZhdGUgY3VycmVudE1pc3NpbGVQb3NpdGlvbjogSUFzc2V0O1xuICAvKipcbiAgICogVGhlIGdhbWUgaXMgcGF1c2VkXG4gICAqL1xuICBwcml2YXRlIGlzR2FtZVBhdXNlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGNvbnN0cnVjdG9yXG4gICAqXG4gICAqIEBwYXJhbSBnYW1lU2VydmljZSBUaGUgR2FtZVNlcnZpY2VcbiAgICogQHBhcmFtIGN0eCBUaGUgY3R4XG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGdhbWVTZXJ2aWNlOiBHYW1lU2VydmljZSwgcHJpdmF0ZSBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCkge1xuICAgIHRoaXMubWlzc2lsZXMgPSBbXTtcbiAgICB0aGlzLmN1cnJlbnRNaXNzaWxlUG9zaXRpb24gPSB0aGlzLmdhbWVTZXJ2aWNlLmdldEd1bm5lclBvc2l0aW9uKCk7XG4gICAgdGhpcy5jdXJyZW50TWlzc2lsZVBvc2l0aW9uLnggKz0gMi41O1xuICAgIHRoaXMuY3VycmVudE1pc3NpbGVSb3RhdGlvbiA9IDA7XG4gICAgdGhpcy5pc0dhbWVQYXVzZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0IHRoZSBzZXJ2aWNlIHdpdGggdGhlIGxpc3RlbmVyXG4gICAqL1xuICBwdWJsaWMgaW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmdhbWVTZXJ2aWNlLmdldE1hc3Rlck9ic2VydmFibGUoKS5zdWJzY3JpYmUoKGV2ZW50OiBPYnNlcnZhYmxlTW9kZWwpID0+IHtcbiAgICAgIGlmIChldmVudC50eXBlID09PSBPYnNlcnZhYmxlVHlwZUVudW0uZ2FtZU92ZXIpIHtcbiAgICAgICAgdGhpcy5jYW5GaXJlID0gIWV2ZW50LmJvb2xlYW5EYXRhO1xuICAgICAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSBPYnNlcnZhYmxlVHlwZUVudW0ubWlzc2lsZUxhdW5jaGVkKSB7XG4gICAgICAgIHRoaXMuY3VycmVudE1pc3NpbGVQb3NpdGlvbiA9IGV2ZW50LmFzc2V0Q29vcmRpbmF0ZURhdGE7XG4gICAgICAgIHRoaXMubGF1bmNoTWlzc2lsZShldmVudCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09IE9ic2VydmFibGVUeXBlRW51bS5taXNzaWxlRGVzdHJveWVkKSB7XG4gICAgICAgIHRoaXMubWFya01pc3NpbGVEZXN0cm95ZWQoZXZlbnQpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSBPYnNlcnZhYmxlVHlwZUVudW0ucHJpc21CbGFzdEZpcmUpIHtcbiAgICAgICAgdGhpcy5maXJlUHJpc21CbGFzdE1pc3NpbGVzKCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09IE9ic2VydmFibGVUeXBlRW51bS5nYW1lUGF1c2VkKSB7XG4gICAgICAgIHRoaXMuaXNHYW1lUGF1c2VkID0gZXZlbnQuYm9vbGVhbkRhdGE7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFyayBhIE1pc3NpbGUgRGVzdHJveWVkXG4gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnRcbiAgICovXG4gIHByaXZhdGUgbWFya01pc3NpbGVEZXN0cm95ZWQoZXZlbnQ6IE9ic2VydmFibGVNb2RlbCk6IHZvaWQge1xuICAgIHRoaXMubWlzc2lsZXNbZXZlbnQubnVtYmVyRGF0YV0uaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIHRoaXMubWlzc2lsZXNbZXZlbnQubnVtYmVyRGF0YV0uaXNBbmltYXRlZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW55IHVudXNlZCBtaXNzaWxlc1xuICAgKi9cbiAgcHJpdmF0ZSBmaW5kVW51c2VkTWlzc2lsZSgpOiBNaXNzaWxlQ2xhc3Mge1xuICAgIHJldHVybiB0aGlzLm1pc3NpbGVzLmZpbHRlcigobWlzc2lsZTogTWlzc2lsZUNsYXNzKSA9PiBtaXNzaWxlLmlzRGVzdHJveWVkKVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYWxsIEFjdGl2ZSBNaXNzaWxlc1xuICAgKi9cbiAgcHVibGljIGdldEFjdGl2ZU1pc3NpbGVzKCk6IE1pc3NpbGVDbGFzc1tdIHtcbiAgICByZXR1cm4gdGhpcy5taXNzaWxlcy5maWx0ZXIoKG1pc3NpbGU6IE1pc3NpbGVDbGFzcykgPT4gbWlzc2lsZS5pc0FuaW1hdGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIHRoZSBtaXNzaWxlc1xuICAgKi9cbiAgcHVibGljIHJlbW92ZU1pc3NpbGVzKCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0QWN0aXZlTWlzc2lsZXMoKS5tYXAoKG1pc3NpbGU6IE1pc3NpbGVDbGFzcykgPT4ge1xuICAgICAgbWlzc2lsZS5pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICBtaXNzaWxlLmlzQW5pbWF0ZWQgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlIHRoZSBQcmlzbSBCbGFzdCBNaXNzaWxlc1xuICAgKi9cbiAgcHJpdmF0ZSBmaXJlUHJpc21CbGFzdE1pc3NpbGVzKCk6IHZvaWQge1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCAxMjg7IGluZGV4KyspIHtcbiAgICAgIHRoaXMuY3VycmVudE1pc3NpbGVSb3RhdGlvbiA9IChpbmRleCArIDEpICogNS42MjU7XG5cbiAgICAgIGxldCBtaXNzaWxlID0gdGhpcy5maW5kVW51c2VkTWlzc2lsZSgpO1xuICAgICAgaWYgKCFtaXNzaWxlKSB7XG4gICAgICAgIG1pc3NpbGUgPSBuZXcgTWlzc2lsZUNsYXNzKHRoaXMuZ2FtZVNlcnZpY2UsIHRoaXMuY3R4LCB0aGlzLm1pc3NpbGVzLmxlbmd0aCk7XG4gICAgICAgIHRoaXMubWlzc2lsZXMucHVzaChtaXNzaWxlKTtcbiAgICAgIH1cblxuICAgICAgbWlzc2lsZS5pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgICAgbWlzc2lsZS5pc0FuaW1hdGVkID0gZmFsc2U7XG4gICAgICBtaXNzaWxlLm1vdmUodGhpcy5jdXJyZW50TWlzc2lsZVBvc2l0aW9uKTtcbiAgICAgIG1pc3NpbGUuc2V0TWlzc2lsZURhdGEoe1xuICAgICAgICByb3RhdGlvbjogdGhpcy5jdXJyZW50TWlzc2lsZVJvdGF0aW9uLFxuICAgICAgICBwb3NpdGlvbjogdGhpcy5jdXJyZW50TWlzc2lsZVBvc2l0aW9uXG4gICAgICB9IGFzIE1pc3NpbGVMYXVuY2hNb2RlbCk7XG5cbiAgICAgIC8vIFRoaXMgcmVxdWlyZWQgdG8ga2VlcCBpdCBpbiBmcm9udCBvZiB0aGUgZ2FtZSBjb21wb25lbnQgY2xlYXJSZWN0XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbWlzc2lsZS5zZXRNaXNzaWxlQ29sb3IoKGluZGV4ICUgNykgKyAxKTtcbiAgICAgICAgbWlzc2lsZS5pc0FuaW1hdGVkID0gdHJ1ZTtcbiAgICAgIH0sIChpbmRleCArIDEpICogMjUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBbmltYXRlIHRoZSBtaXNzaWxlc1xuICAgKiBAcGFyYW0gbm93ICB0aGUgY3VycmVudCB0aW1lIHN0YW1wXG4gICAqL1xuICBhbmltYXRlKG5vdyA9IDApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNHYW1lUGF1c2VkKSB7XG4gICAgICB0aGlzLm1pc3NpbGVzXG4gICAgICAgIC5maWx0ZXIoKG1pc3NpbGU6IE1pc3NpbGVDbGFzcykgPT4gbWlzc2lsZS5pc0FuaW1hdGVkKVxuICAgICAgICAubWFwKChtaXNzaWxlOiBNaXNzaWxlQ2xhc3MpID0+IHtcbiAgICAgICAgICBtaXNzaWxlLmFuaW1hdGUobm93KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExhdW5jaCBhIE1pc3NpbGVcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudFxuICAgKi9cbiAgcHJpdmF0ZSBsYXVuY2hNaXNzaWxlKGV2ZW50OiBPYnNlcnZhYmxlTW9kZWwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jYW5GaXJlKSB7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgMzsgaW5kZXgrKykge1xuICAgICAgICB0aGlzLmN1cnJlbnRNaXNzaWxlUm90YXRpb24gPSBldmVudC5hc3NldFJvdGF0aW9uRGF0YTtcblxuICAgICAgICBpZiAoaW5kZXggPT09IDEpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRNaXNzaWxlUm90YXRpb24gKz0gMTM1O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCA9PT0gMikge1xuICAgICAgICAgIHRoaXMuY3VycmVudE1pc3NpbGVSb3RhdGlvbiAtPSAxMzU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbWlzc2lsZSA9IHRoaXMuZmluZFVudXNlZE1pc3NpbGUoKTtcbiAgICAgICAgaWYgKCFtaXNzaWxlKSB7XG4gICAgICAgICAgbWlzc2lsZSA9IG5ldyBNaXNzaWxlQ2xhc3ModGhpcy5nYW1lU2VydmljZSwgdGhpcy5jdHgsIHRoaXMubWlzc2lsZXMubGVuZ3RoKTtcbiAgICAgICAgICB0aGlzLm1pc3NpbGVzLnB1c2gobWlzc2lsZSk7XG4gICAgICAgIH1cbiAgICAgICAgbWlzc2lsZS5pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgICAgIG1pc3NpbGUubW92ZShldmVudC5hc3NldENvb3JkaW5hdGVEYXRhKTtcbiAgICAgICAgbWlzc2lsZS5zZXRNaXNzaWxlRGF0YSh7XG4gICAgICAgICAgcm90YXRpb246IHRoaXMuY3VycmVudE1pc3NpbGVSb3RhdGlvbixcbiAgICAgICAgICBwb3NpdGlvbjogZXZlbnQuYXNzZXRDb29yZGluYXRlRGF0YVxuICAgICAgICB9IGFzIE1pc3NpbGVMYXVuY2hNb2RlbCk7XG4gICAgICAgIG1pc3NpbGUuaXNBbmltYXRlZCA9IHRydWU7XG5cbiAgICAgICAgbWlzc2lsZS51bnNldE1pc3NpbGVDb2xvcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19