bp-space-invaders
Version:
The BP Space Invaders Game
122 lines • 18.1 kB
JavaScript
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=