UNPKG

bp-prism-game

Version:
143 lines 17 kB
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