UNPKG

bp-space-invaders

Version:
115 lines 16.6 kB
import { Component, ElementRef, ViewChild } from '@angular/core'; import { GameService } from '../../service/game.service'; import { NumberClass } from '../number.class'; import { GameCookieService } from '../../service/game-cookie.service'; import * as i0 from "@angular/core"; import * as i1 from "../../service/game.service"; import * as i2 from "../../service/game-cookie.service"; import * as i3 from "@angular/common"; export class NumberComponent { constructor(gameService, gameCookieService) { this.gameService = gameService; this.gameCookieService = gameCookieService; this.assets = [ { key: 'zero', name: '0' }, { key: 'one', name: '1' }, { key: 'two', name: '2' }, { key: 'three', name: '3' }, { key: 'four', name: '4' }, { key: 'five', name: '5' }, { key: 'six', name: '6' }, { key: 'seven', name: '7' }, { key: 'eight', name: '8' }, { key: 'nine', name: '9' } ]; } ngOnInit() { const rows = 20; const columns = 20; this.ctx = this.gameService.initBoard(this.canvas, rows, columns, 25); this.addNumber({ x: 0, y: 0, height: rows, width: columns }); this.isAnimateOnce = true; this.toggleAssets(this.gameCookieService.getSecondaryDebugData()); this.animate(); } addNumber(boundary) { const number = new NumberClass(this.gameService, this.ctx, boundary, 1); number.setNumber(0, false); number.isDestroyed = true; number.isAnimateOnce = true; this.number = number; } animateAsset() { this.number.isDestroyed = false; cancelAnimationFrame(this.requestId); this.animate(); } draw() { this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); this.gameService.addOutlines(this.ctx, 5, 0.025); } animate() { this.draw(); this.number.animate(); if (!this.isAnimateOnce) { this.requestId = requestAnimationFrame(this.animate.bind(this)); } } toggleAssets(key) { this.draw(); this.assets.map((asset, $index) => { if (key === asset.key) { this.number.setNumber($index, false); this.gameCookieService.setDebugData({ secondaryAssetName: key }); } }); this.animateAsset(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: NumberComponent, deps: [{ token: i1.GameService }, { token: i2.GameCookieService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: NumberComponent, selector: "bp-number", viewQueries: [{ propertyName: "canvas", first: true, predicate: ["board"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"game-container\">\n <div class=\"asset-title\">Numbers</div>\n <div class=\"game-board-container\">\n <canvas #board class=\"game-board\"></canvas>\n </div>\n <div class=\"button-container\">\n <button (click)=\"animateAsset()\" class=\"animation-button button\">Animate</button>\n <div *ngFor=\"let asset of assets\">\n <button (click)=\"toggleAssets(asset.key)\" class=\"animation-button button\">\n {{ asset.name }}\n </button>\n </div>\n </div>\n</div>\n", styles: [".game-container .asset-title{margin:25px;width:100%;text-align:center}.game-container .game-board-container{display:flex;flex-direction:row;justify-content:center}.game-container .game-board-container .game-board{border:solid 2px grey;background-color:#000}.game-container .button-container{position:relative;margin-top:25px;display:flex;flex-wrap:wrap;flex-direction:row;justify-content:space-evenly}.game-container .button-container .animation-button{background-color:#4caf50}.game-container .button-container .button{flex-wrap:wrap;font-size:16px;margin-top:10px;padding:15px 30px;cursor:pointer;width:165px;border:1px solid black}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: NumberComponent, decorators: [{ type: Component, args: [{ selector: 'bp-number', template: "<div class=\"game-container\">\n <div class=\"asset-title\">Numbers</div>\n <div class=\"game-board-container\">\n <canvas #board class=\"game-board\"></canvas>\n </div>\n <div class=\"button-container\">\n <button (click)=\"animateAsset()\" class=\"animation-button button\">Animate</button>\n <div *ngFor=\"let asset of assets\">\n <button (click)=\"toggleAssets(asset.key)\" class=\"animation-button button\">\n {{ asset.name }}\n </button>\n </div>\n </div>\n</div>\n", styles: [".game-container .asset-title{margin:25px;width:100%;text-align:center}.game-container .game-board-container{display:flex;flex-direction:row;justify-content:center}.game-container .game-board-container .game-board{border:solid 2px grey;background-color:#000}.game-container .button-container{position:relative;margin-top:25px;display:flex;flex-wrap:wrap;flex-direction:row;justify-content:space-evenly}.game-container .button-container .animation-button{background-color:#4caf50}.game-container .button-container .button{flex-wrap:wrap;font-size:16px;margin-top:10px;padding:15px 30px;cursor:pointer;width:165px;border:1px solid black}\n"] }] }], ctorParameters: () => [{ type: i1.GameService }, { type: i2.GameCookieService }], propDecorators: { canvas: [{ type: ViewChild, args: ['board', { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwYWNlLWludmFkZXJzL3NyYy9saWIvbnVtYmVyL3Rlc3QtY29tcG9uZW50L251bWJlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGFjZS1pbnZhZGVycy9zcmMvbGliL251bWJlci90ZXN0LWNvbXBvbmVudC9udW1iZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFOUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7O0FBV3RFLE1BQU0sT0FBTyxlQUFlO0lBcUMxQixZQUFvQixXQUF3QixFQUFVLGlCQUFvQztRQUF0RSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDeEYsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaO2dCQUNFLEdBQUcsRUFBRSxNQUFNO2dCQUNYLElBQUksRUFBRSxHQUFHO2FBQ2lCO1lBQzVCO2dCQUNFLEdBQUcsRUFBRSxLQUFLO2dCQUNWLElBQUksRUFBRSxHQUFHO2FBQ2lCO1lBQzVCO2dCQUNFLEdBQUcsRUFBRSxLQUFLO2dCQUNWLElBQUksRUFBRSxHQUFHO2FBQ2lCO1lBQzVCO2dCQUNFLEdBQUcsRUFBRSxPQUFPO2dCQUNaLElBQUksRUFBRSxHQUFHO2FBQ2lCO1lBQzVCO2dCQUNFLEdBQUcsRUFBRSxNQUFNO2dCQUNYLElBQUksRUFBRSxHQUFHO2FBQ2lCO1lBQzVCO2dCQUNFLEdBQUcs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Q0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDO29CQUNsQyxrQkFBa0IsRUFBRSxHQUFHO2lCQUNOLENBQUMsQ0FBQzthQUN0QjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7OEdBOUpVLGVBQWU7a0dBQWYsZUFBZSxnS0NqQjVCLDJmQWNBOzsyRkRHYSxlQUFlO2tCQUwzQixTQUFTOytCQUNFLFdBQVc7Z0hBU3JCLE1BQU07c0JBREwsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBHYW1lU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2UvZ2FtZS5zZXJ2aWNlJztcbmltcG9ydCB7IEFzc2V0Q29uZmlndXJhdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXNzZXQtY29uZmlndXJhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBOdW1iZXJDbGFzcyB9IGZyb20gJy4uL251bWJlci5jbGFzcyc7XG5pbXBvcnQgeyBCb3VuZGFyeVNldHVwTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbC9ib3VuZGFyeS1zZXQubW9kZWwnO1xuaW1wb3J0IHsgR2FtZUNvb2tpZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL2dhbWUtY29va2llLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGVidWdEYXRhTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbC9kZWJ1Zy1kYXRhLm1vZGVsJztcblxuLyoqXG4gKiBUaGUgQWxpZW4gQ29tcG9uZW50XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JwLW51bWJlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9udW1iZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9udW1iZXIuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBOdW1iZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvKipcbiAgICogVGhlIGNhbnZhc1xuICAgKi9cbiAgQFZpZXdDaGlsZCgnYm9hcmQnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBjYW52YXM6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xuXG4gIC8qKlxuICAgKiBDVFNcbiAgICovXG4gIHByaXZhdGUgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG5cbiAgLyoqXG4gICAqIHJlcXVlc3QgSWRcbiAgICovXG4gIHByaXZhdGUgcmVxdWVzdElkOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHJlcXVlc3RcbiAgICovXG4gIHByaXZhdGUgaXNBbmltYXRlT25jZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGFsaWVuXG4gICAqL1xuICBwcml2YXRlIG51bWJlcjogTnVtYmVyQ2xhc3M7XG5cbiAgLyoqXG4gICAqIERlYnVnIEFzc2V0c1xuICAgKi9cbiAgcHVibGljIGFzc2V0czogQXNzZXRDb25maWd1cmF0aW9uTW9kZWxbXTtcblxuICAvKipcbiAgICogVGhlIENvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBnYW1lU2VydmljZSBUaGUgR2FtZVNlcnZpY2UgZnJvbSBESVxuICAgKiBAcGFyYW0gZ2FtZUNvb2tpZSBUaGUgR2FtZSBDb29raWUgU2VydmljZVxuICAgKi9cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBnYW1lU2VydmljZTogR2FtZVNlcnZpY2UsIHByaXZhdGUgZ2FtZUNvb2tpZVNlcnZpY2U6IEdhbWVDb29raWVTZXJ2aWNlKSB7XG4gICAgdGhpcy5hc3NldHMgPSBbXG4gICAgICB7XG4gICAgICAgIGtleTogJ3plcm8nLFxuICAgICAgICBuYW1lOiAnMCdcbiAgICAgIH0gYXMgQXNzZXRDb25maWd1cmF0aW9uTW9kZWwsXG4gICAgICB7XG4gICAgICAgIGtleTogJ29uZScsXG4gICAgICAgIG5hbWU6ICcxJ1xuICAgICAgfSBhcyBBc3NldENvbmZpZ3VyYXRpb25Nb2RlbCxcbiAgICAgIHtcbiAgICAgICAga2V5OiAndHdvJyxcbiAgICAgICAgbmFtZTogJzInXG4gICAgICB9IGFzIEFzc2V0Q29uZmlndXJhdGlvbk1vZGVsLFxuICAgICAge1xuICAgICAgICBrZXk6ICd0aHJlZScsXG4gICAgICAgIG5hbWU6ICczJ1xuICAgICAgfSBhcyBBc3NldENvbmZpZ3VyYXRpb25Nb2RlbCxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZm91cicsXG4gICAgICAgIG5hbWU6ICc0J1xuICAgICAgfSBhcyBBc3NldENvbmZpZ3VyYXRpb25Nb2RlbCxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZml2ZScsXG4gICAgICAgIG5hbWU6ICc1J1xuICAgICAgfSBhcyBBc3NldENvbmZpZ3VyYXRpb25Nb2RlbCxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnc2l4JyxcbiAgICAgICAgbmFtZTogJzYnXG4gICAgICB9IGFzIEFzc2V0Q29uZmlndXJhdGlvbk1vZGVsLFxuICAgICAge1xuICAgICAgICBrZXk6ICdzZXZlbicsXG4gICAgICAgIG5hbWU6ICc3J1xuICAgICAgfSBhcyBBc3NldENvbmZpZ3VyYXRpb25Nb2RlbCxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZWlnaHQnLFxuICAgICAgICBuYW1lOiAnOCdcbiAgICAgIH0gYXMgQXNzZXRDb25maWd1cmF0aW9uTW9kZWwsXG4gICAgICB7XG4gICAgICAgIGtleTogJ25pbmUnLFxuICAgICAgICBuYW1lOiAnOSdcbiAgICAgIH0gYXMgQXNzZXRDb25maWd1cmF0aW9uTW9kZWxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uIEluaXRcbiAgICovXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IHJvd3MgPSAyMDtcbiAgICBjb25zdCBjb2x1bW5zID0gMjA7XG4gICAgdGhpcy5jdHggPSB0aGlzLmdhbWVTZXJ2aWNlLmluaXRCb2FyZCh0aGlzLmNhbnZhcywgcm93cywgY29sdW1ucywgMjUpO1xuICAgIHRoaXMuYWRkTnVtYmVyKHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwLFxuICAgICAgaGVpZ2h0OiByb3dzLFxuICAgICAgd2lkdGg6IGNvbHVtbnNcbiAgICB9IGFzIEJvdW5kYXJ5U2V0dXBNb2RlbCk7XG4gICAgdGhpcy5pc0FuaW1hdGVPbmNlID0gdHJ1ZTtcblxuICAgIHRoaXMudG9nZ2xlQXNzZXRzKHRoaXMuZ2FtZUNvb2tpZVNlcnZpY2UuZ2V0U2Vjb25kYXJ5RGVidWdEYXRhKCkpO1xuICAgIHRoaXMuYW5pbWF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB0aGUgYWxpZW5zXG4gICAqL1xuICBwcml2YXRlIGFkZE51bWJlcihib3VuZGFyeTogQm91bmRhcnlTZXR1cE1vZGVsKTogdm9pZCB7XG4gICAgY29uc3QgbnVtYmVyID0gbmV3IE51bWJlckNsYXNzKHRoaXMuZ2FtZVNlcnZpY2UsIHRoaXMuY3R4LCBib3VuZGFyeSwgMSk7XG4gICAgbnVtYmVyLnNldE51bWJlcigwLCBmYWxzZSk7XG4gICAgbnVtYmVyLmlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICBudW1iZXIuaXNBbmltYXRlT25jZSA9IHRydWU7XG5cbiAgICB0aGlzLm51bWJlciA9IG51bWJlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmltYXRlIHRoZSBvYmplY3Qgb25jZVxuICAgKi9cbiAgYW5pbWF0ZUFzc2V0KCk6IHZvaWQge1xuICAgIHRoaXMubnVtYmVyLmlzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5yZXF1ZXN0SWQpO1xuICAgIHRoaXMuYW5pbWF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIGJvYXJkXG4gICAqL1xuICBwcml2YXRlIGRyYXcoKSB7XG4gICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY3R4LmNhbnZhcy53aWR0aCwgdGhpcy5jdHguY2FudmFzLmhlaWdodCk7XG4gICAgdGhpcy5nYW1lU2VydmljZS5hZGRPdXRsaW5lcyh0aGlzLmN0eCwgNSwgMC4wMjUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuaW1hdGVcbiAgICovXG4gIHB1YmxpYyBhbmltYXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZHJhdygpO1xuICAgIHRoaXMubnVtYmVyLmFuaW1hdGUoKTtcbiAgICBpZiAoIXRoaXMuaXNBbmltYXRlT25jZSkge1xuICAgICAgdGhpcy5yZXF1ZXN0SWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5hbmltYXRlLmJpbmQodGhpcykgYXMgRnJhbWVSZXF1ZXN0Q2FsbGJhY2spO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b2dnbGVBc3NldHNcbiAgICpcbiAgICogQHBhcmFtIGtleSBUaGUgYXNzZXQgdG8gZGlzcGxheVxuICAgKi9cbiAgdG9nZ2xlQXNzZXRzKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kcmF3KCk7XG4gICAgdGhpcy5hc3NldHMubWFwKChhc3NldDogQXNzZXRDb25maWd1cmF0aW9uTW9kZWwsICRpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSBhc3NldC5rZXkpIHtcbiAgICAgICAgdGhpcy5udW1iZXIuc2V0TnVtYmVyKCRpbmRleCwgZmFsc2UpO1xuICAgICAgICB0aGlzLmdhbWVDb29raWVTZXJ2aWNlLnNldERlYnVnRGF0YSh7XG4gICAgICAgICAgc2Vjb25kYXJ5QXNzZXROYW1lOiBrZXlcbiAgICAgICAgfSBhcyBEZWJ1Z0RhdGFNb2RlbCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmFuaW1hdGVBc3NldCgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZ2FtZS1jb250YWluZXJcIj5cbiAgPGRpdiBjbGFzcz1cImFzc2V0LXRpdGxlXCI+TnVtYmVyczwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZ2FtZS1ib2FyZC1jb250YWluZXJcIj5cbiAgICA8Y2FudmFzICNib2FyZCBjbGFzcz1cImdhbWUtYm9hcmRcIj48L2NhbnZhcz5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJidXR0b24tY29udGFpbmVyXCI+XG4gICAgPGJ1dHRvbiAoY2xpY2spPVwiYW5pbWF0ZUFzc2V0KClcIiBjbGFzcz1cImFuaW1hdGlvbi1idXR0b24gYnV0dG9uXCI+QW5pbWF0ZTwvYnV0dG9uPlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGFzc2V0IG9mIGFzc2V0c1wiPlxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwidG9nZ2xlQXNzZXRzKGFzc2V0LmtleSlcIiBjbGFzcz1cImFuaW1hdGlvbi1idXR0b24gYnV0dG9uXCI+XG4gICAgICAgIHt7IGFzc2V0Lm5hbWUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19