UNPKG

bp-space-invaders

Version:
122 lines 18.1 kB
import { COLORS, DESTRUCTION_ANIMATION } from './alien-constants'; import { ObservableTypeEnum } from '../../enum/observable-type.enum'; import { AssetClass } from '../../asset/asset.class'; export class AlienClass extends AssetClass { constructor(gameService, ctx, boundarySetup, guid, assetPoints) { super(gameService, ctx, boundarySetup, guid); this.assetPoints = assetPoints; this.bombTimer = { start: performance.now(), elapsed: 0 }; } spawn() { this.assetAnimation = this.assetAnimations[0]; this.engineAnimation = []; this.destructionAnimations = DESTRUCTION_ANIMATION; this.destructionAnimation = this.destructionAnimations[0]; super.spawn(); } draw() { this.ctx.save(); this.ctx.translate(this.x, this.y); this.drawAlien(); this.ctx.restore(); } drawAlien() { this.assetAnimation.forEach((row, y) => { row.forEach((value, x) => { if (value > 0) { this.ctx.fillStyle = COLORS[value]; this.ctx.fillRect(x, y, 1, 1); } }); }); } isHit(missileAsset) { if (!this.isDestroyed) { this.isDestroyed = this.gameService.isHit({ x: this.x, y: this.y, shape: this.shape }, missileAsset); const alienType = this.isAlienAsset ? ObservableTypeEnum.alienDestroyed : ObservableTypeEnum.alienBossDestroyed; if (this.isDestroyed) { this.gameService.emitMasterObservableEvent({ type: alienType, numberData: this.uid, pointData: this.points }); missileAsset.isDestroyed = true; } } } creep(asset) { asset.shape = this.shape; return this.gameService.valid(asset, this.boundary); } randomizeDropBomb() { if (this.canFireWeapon) { const randomBombNumber = Math.floor(Math.random() * 10 + 1); return randomBombNumber >= 4 && randomBombNumber <= 6; } return false; } drawAlienDestruction() { this.destructionAnimation.forEach((row, y) => { row.forEach((value, x) => { if (value > 0) { this.ctx.fillStyle = COLORS[value]; this.ctx.fillRect(this.x + x, this.y + y, 1, 1); } }); }); } destructionAnimate(now = 0) { this.destructionTimer.elapsed = now - this.destructionTimer.start; if (this.destructionAnimationCounter === this.destructionAnimations.length) { cancelAnimationFrame(this.destructionRequestId); return; } if (this.destructionTimer.elapsed > 50) { this.destructionTimer.start = now; this.destructionAnimation = this.destructionAnimations[this.destructionAnimationCounter++ % this.destructionAnimations.length]; } this.drawAlienDestruction(); this.destructionRequestId = requestAnimationFrame(this.destructionAnimate.bind(this)); } animate(now = 0) { this.assetTimer.elapsed = now - this.assetTimer.start; this.bombTimer.elapsed = now - this.bombTimer.start; if (this.isDestroyed) { this.destructionAnimate(); return; } this.destructionAnimationCounter = 0; if (this.assetTimer.elapsed > 900) { this.assetTimer.start = now; this.assetAnimation = this.assetAnimations[this.animationCounter++ % this.assetAnimations.length]; } if (this.bombTimer.elapsed > 1000) { this.bombTimer.start = now; if (this.randomizeDropBomb()) { this.gameService.emitMasterObservableEvent({ type: ObservableTypeEnum.bombDropped, assetCoordinateData: { x: this.x + this.getAssetWidth() / 2 - 1, y: this.y + this.getAssetHeight() - 5 } }); } } this.draw(); } get points() { return this.assetPoints; } isAlien() { return this.isAlienAsset; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxpZW4uY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGFjZS1pbnZhZGVycy9zcmMvbGliL2FsaWVucy9hbGllbi9hbGllbi5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFJbEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDckUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBT3JELE1BQU0sT0FBZ0IsVUFBVyxTQUFRLFVBQVU7SUFxQmpELFlBQ0UsV0FBd0IsRUFDeEIsR0FBNkIsRUFDN0IsYUFBaUMsRUFDakMsSUFBWSxFQUNKLFdBQW1CO1FBRTNCLEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUZyQyxnQkFBVyxHQUFYLFdBQVcsQ0FBUTtRQUkzQixJQUFJLENBQUMsU0FBUyxHQUFHO1lBQ2YsS0FBSyxFQUFFLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDeEIsT0FBTyxFQUFFLENBQUM7U0FDRyxDQUFDO0lBQ2xCLENBQUM7SUFLa0IsS0FBSztRQUN0QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLHFCQUFxQixDQUFDO1FBQ25ELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFLUyxJQUFJO1FBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FB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VElPTiB9IGZyb20gJy4vYWxpZW4tY29uc3RhbnRzJztcbmltcG9ydCB7IElBc3NldCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZS9hc3NldC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgR2FtZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL2dhbWUuc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbC9vYnNlcnZhYmxlLm1vZGVsJztcbmltcG9ydCB7IE9ic2VydmFibGVUeXBlRW51bSB9IGZyb20gJy4uLy4uL2VudW0vb2JzZXJ2YWJsZS10eXBlLmVudW0nO1xuaW1wb3J0IHsgQXNzZXRDbGFzcyB9IGZyb20gJy4uLy4uL2Fzc2V0L2Fzc2V0LmNsYXNzJztcbmltcG9ydCB7IFRpbWVyTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbC90aW1lci5tb2RlbCc7XG5pbXBvcnQgeyBCb3VuZGFyeVNldHVwTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbC9ib3VuZGFyeS1zZXQubW9kZWwnO1xuXG4vKipcbiAqIFRoZSBBbGllbiBDbGFzc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWxpZW5DbGFzcyBleHRlbmRzIEFzc2V0Q2xhc3Mge1xuICAvKipcbiAgICogVGhlIE1pc3NpbGUgVGltZXJcbiAgICovXG4gIHByb3RlY3RlZCBib21iVGltZXI6IFRpbWVyTW9kZWw7XG4gIC8qKlxuICAgKiBUaGUgY2FuIGZpcmUgd2VhcG9uXG4gICAqL1xuICBwdWJsaWMgY2FuRmlyZVdlYXBvbjogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBhbGllblR5cGVcbiAgICovXG4gIHByb3RlY3RlZCBpc0FsaWVuQXNzZXQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBnYW1lU2VydmljZSBUaGUgR2FtZVNlcnZpY2VcbiAgICogQHBhcmFtIGN0eCBUaGUgY3R4XG4gICAqIEBwYXJhbSBib3VuZGFyeVNldHVwIFRoZSBCb3VuZGFyeVNldHVwTW9kZWxcbiAgICogQHBhcmFtIGd1aWQgVGhlIGd1aWQgb2YgdGhlIGFsaWVuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBnYW1lU2VydmljZTogR2FtZVNlcnZpY2UsXG4gICAgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gICAgYm91bmRhcnlTZXR1cDogQm91bmRhcnlTZXR1cE1vZGVsLFxuICAgIGd1aWQ6IG51bWJlcixcbiAgICBwcml2YXRlIGFzc2V0UG9pbnRzOiBudW1iZXJcbiAgKSB7XG4gICAgc3VwZXIoZ2FtZVNlcnZpY2UsIGN0eCwgYm91bmRhcnlTZXR1cCwgZ3VpZCk7XG5cbiAgICB0aGlzLmJvbWJUaW1lciA9IHtcbiAgICAgIHN0YXJ0OiBwZXJmb3JtYW5jZS5ub3coKSxcbiAgICAgIGVsYXBzZWQ6IDBcbiAgICB9IGFzIFRpbWVyTW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogU3Bhd24gdGhlIGFsaWVuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3Bhd24oKTogdm9pZCB7XG4gICAgdGhpcy5hc3NldEFuaW1hdGlvbiA9IHRoaXMuYXNzZXRBbmltYXRpb25zWzBdO1xuICAgIHRoaXMuZW5naW5lQW5pbWF0aW9uID0gW107XG4gICAgdGhpcy5kZXN0cnVjdGlvbkFuaW1hdGlvbnMgPSBERVNUUlVDVElPTl9BTklNQVRJT047XG4gICAgdGhpcy5kZXN0cnVjdGlvbkFuaW1hdGlvbiA9IHRoaXMuZGVzdHJ1Y3Rpb25BbmltYXRpb25zWzBdO1xuICAgIHN1cGVyLnNwYXduKCk7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyBldmVyeXRoaW5nIG5lY2Vzc2FyeVxuICAgKi9cbiAgcHJvdGVjdGVkIGRyYXcoKTogdm9pZCB7XG4gICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgIHRoaXMuY3R4LnRyYW5zbGF0ZSh0aGlzLngsIHRoaXMueSk7XG4gICAgdGhpcy5kcmF3QWxpZW4oKTtcbiAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgYWxpZW5cbiAgICovXG4gIHByaXZhdGUgZHJhd0FsaWVuKCk6IHZvaWQge1xuICAgIHRoaXMuYXNzZXRBbmltYXRpb24uZm9yRWFjaCgocm93LCB5KSA9PiB7XG4gICAgICByb3cuZm9yRWFjaCgodmFsdWUsIHgpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlID4gMCkge1xuICAgICAgICAgIHRoaXMuY3R4LmZpbGxTdHlsZSA9IENPTE9SU1t2YWx1ZV07XG4gICAgICAgICAgdGhpcy5jdHguZmlsbFJlY3QoeCwgeSwgMSwgMSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIElzIHRoZSBhbGllbiBoaXRcbiAgICogQHBhcmFtIG1pc3NpbGVBc3NldCBUaGUgTWlzc2lsZSBBc3NldFxuICAgKi9cbiAgaXNIaXQobWlzc2lsZUFzc2V0OiBJQXNzZXQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNEZXN0cm95ZWQpIHtcbiAgICAgIHRoaXMuaXNEZXN0cm95ZWQgPSB0aGlzLmdhbWVTZXJ2aWNlLmlzSGl0KFxuICAgICAgICB7XG4gICAgICAgICAgeDogdGhpcy54LFxuICAgICAgICAgIHk6IHRoaXMueSxcbiAgICAgICAgICBzaGFwZTogdGhpcy5zaGFwZVxuICAgICAgICB9IGFzIElBc3NldCxcbiAgICAgICAgbWlzc2lsZUFzc2V0XG4gICAgICApO1xuXG4gICAgICBjb25zdCBhbGllblR5cGUgPSB0aGlzLmlzQWxpZW5Bc3NldCA/IE9ic2VydmFibGVUeXBlRW51bS5hbGllbkRlc3Ryb3llZCA6IE9ic2VydmFibGVUeXBlRW51bS5hbGllbkJvc3NEZXN0cm95ZWQ7XG5cbiAgICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSB7XG4gICAgICAgIHRoaXMuZ2FtZVNlcnZpY2UuZW1pdE1hc3Rlck9ic2VydmFibGVFdmVudCh7XG4gICAgICAgICAgdHlwZTogYWxpZW5UeXBlLFxuICAgICAgICAgIG51bWJlckRhdGE6IHRoaXMudWlkLFxuICAgICAgICAgIHBvaW50RGF0YTogdGhpcy5wb2ludHNcbiAgICAgICAgfSBhcyBPYnNlcnZhYmxlTW9kZWwpO1xuICAgICAgICBtaXNzaWxlQXNzZXQuaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyB0aGUgYWxpZW4gdG8gY3JlZXBcbiAgICogQHBhcmFtIGFzc2V0IFRoZSBBc3NldFxuICAgKi9cbiAgY3JlZXAoYXNzZXQ6IElBc3NldCk6IGJvb2xlYW4ge1xuICAgIGFzc2V0LnNoYXBlID0gdGhpcy5zaGFwZTtcbiAgICByZXR1cm4gdGhpcy5nYW1lU2VydmljZS52YWxpZChhc3NldCwgdGhpcy5ib3VuZGFyeSk7XG4gIH1cblxuICAvKipcbiAgICogUmFuZG9taXplIHdoZW4gYW4gYWxpZW4gY2FuIGRyb3AgYSBib21iXG4gICAqL1xuICBwcml2YXRlIHJhbmRvbWl6ZURyb3BCb21iKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNhbkZpcmVXZWFwb24pIHtcbiAgICAgIGNvbnN0IHJhbmRvbUJvbWJOdW1iZXIgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMCArIDEpO1xuICAgICAgcmV0dXJuIHJhbmRvbUJvbWJOdW1iZXIgPj0gNCAmJiByYW5kb21Cb21iTnVtYmVyIDw9IDY7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIGFsaWVuXG4gICAqL1xuICBwcml2YXRlIGRyYXdBbGllbkRlc3RydWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJ1Y3Rpb25BbmltYXRpb24uZm9yRWFjaCgocm93LCB5KSA9PiB7XG4gICAgICByb3cuZm9yRWFjaCgodmFsdWUsIHgpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlID4gMCkge1xuICAgICAgICAgIHRoaXMuY3R4LmZpbGxTdHlsZSA9IENPTE9SU1t2YWx1ZV07XG4gICAgICAgICAgdGhpcy5jdHguZmlsbFJlY3QodGhpcy54ICsgeCwgdGhpcy55ICsgeSwgMSwgMSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuaW1hdGUgdGhlIGFsaWVuXG4gICAqIEBwYXJhbSBub3cgdGhlIGN1cnJlbnQgdGltZVxuICAgKi9cbiAgcHJvdGVjdGVkIGRlc3RydWN0aW9uQW5pbWF0ZShub3cgPSAwKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cnVjdGlvblRpbWVyLmVsYXBzZWQgPSBub3cgLSB0aGlzLmRlc3RydWN0aW9uVGltZXIuc3RhcnQ7XG5cbiAgICBpZiAodGhpcy5kZXN0cnVjdGlvbkFuaW1hdGlvbkNvdW50ZXIgPT09IHRoaXMuZGVzdHJ1Y3Rpb25BbmltYXRpb25zLmxlbmd0aCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5kZXN0cnVjdGlvblJlcXVlc3RJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGVzdHJ1Y3Rpb25UaW1lci5lbGFwc2VkID4gNTApIHtcbiAgICAgIHRoaXMuZGVzdHJ1Y3Rpb25UaW1lci5zdGFydCA9IG5vdztcbiAgICAgIHRoaXMuZGVzdHJ1Y3Rpb25BbmltYXRpb24gPVxuICAgICAgICB0aGlzLmRlc3RydWN0aW9uQW5pbWF0aW9uc1t0aGlzLmRlc3RydWN0aW9uQW5pbWF0aW9uQ291bnRlcisrICUgdGhpcy5kZXN0cnVjdGlvbkFuaW1hdGlvbnMubGVuZ3RoXTtcbiAgICB9XG5cbiAgICB0aGlzLmRyYXdBbGllbkRlc3RydWN0aW9uKCk7XG4gICAgdGhpcy5kZXN0cnVjdGlvblJlcXVlc3RJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLmRlc3RydWN0aW9uQW5pbWF0ZS5iaW5kKHRoaXMpIGFzIEZyYW1lUmVxdWVzdENhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmltYXRlIHRoZSBhbGllblxuICAgKiBAcGFyYW0gbm93IHRoZSBjdXJyZW50IHRpbWVcbiAgICovXG4gIHB1YmxpYyBhbmltYXRlKG5vdyA9IDApOiB2b2lkIHtcbiAgICB0aGlzLmFzc2V0VGltZXIuZWxhcHNlZCA9IG5vdyAtIHRoaXMuYXNzZXRUaW1lci5zdGFydDtcbiAgICB0aGlzLmJvbWJUaW1lci5lbGFwc2VkID0gbm93IC0gdGhpcy5ib21iVGltZXIuc3RhcnQ7XG5cbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkge1xuICAgICAgdGhpcy5kZXN0cnVjdGlvbkFuaW1hdGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRlc3RydWN0aW9uQW5pbWF0aW9uQ291bnRlciA9IDA7XG5cbiAgICBpZiAodGhpcy5hc3NldFRpbWVyLmVsYXBzZWQgPiA5MDApIHtcbiAgICAgIHRoaXMuYXNzZXRUaW1lci5zdGFydCA9IG5vdztcbiAgICAgIHRoaXMuYXNzZXRBbmltYXRpb24gPSB0aGlzLmFzc2V0QW5pbWF0aW9uc1t0aGlzLmFuaW1hdGlvbkNvdW50ZXIrKyAlIHRoaXMuYXNzZXRBbmltYXRpb25zLmxlbmd0aF07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYm9tYlRpbWVyLmVsYXBzZWQgPiAxMDAwKSB7XG4gICAgICB0aGlzLmJvbWJUaW1lci5zdGFydCA9IG5vdztcbiAgICAgIGlmICh0aGlzLnJhbmRvbWl6ZURyb3BCb21iKCkpIHtcbiAgICAgICAgdGhpcy5nYW1lU2VydmljZS5lbWl0TWFzdGVyT2JzZXJ2YWJsZUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiBPYnNlcnZhYmxlVHlwZUVudW0uYm9tYkRyb3BwZWQsXG4gICAgICAgICAgYXNzZXRDb29yZGluYXRlRGF0YToge1xuICAgICAgICAgICAgeDogdGhpcy54ICsgdGhpcy5nZXRBc3NldFdpZHRoKCkgLyAyIC0gMSxcbiAgICAgICAgICAgIHk6IHRoaXMueSArIHRoaXMuZ2V0QXNzZXRIZWlnaHQoKSAtIDVcbiAgICAgICAgICB9IGFzIElBc3NldFxuICAgICAgICB9IGFzIE9ic2VydmFibGVNb2RlbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5kcmF3KCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBhc3NldCBwb2ludHNcbiAgICogQHBhcmFtIHBvaW50cyBUaGUgbnVtYmVyIG9mIHBvaW50c1xuICAgKi9cbiAgZ2V0IHBvaW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5hc3NldFBvaW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgYXNzZXQgaXMgYW4gYWxpZW4gb3IgYWxpZW4gYm9zc1xuICAgKi9cbiAgcHVibGljIGlzQWxpZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNBbGllbkFzc2V0O1xuICB9XG59XG4iXX0=