UNPKG

bp-prism-game

Version:
143 lines 17.1 kB
import { ObservableTypeEnum } from '../enum/observable-type.enum'; import { AssetAlignEnum } from './enum/asset-align.enum'; import { AssetAlignVerticalEnum } from './enum/asset-align-vertical.enum'; /** * The Asset Class */ export class AssetClass { /** * Constructor * @param gameService The game service * @param ctx The ctx * @param assetUid the uid of the asset * @param imageType The optional animation number */ constructor(gameService, ctx, assetUid, imageType) { this.gameService = gameService; this.ctx = ctx; this.assetUid = assetUid; this.imageType = imageType; this.assetScale = { x: 1, y: 1 }; this.x = 0; this.y = 0; this.images = []; this.assetHeight = 0; this.assetWidth = 0; this.isAnimated = false; this.isDestroyed = false; this.isGameOver = false; this.isGamePaused = false; this.isImageLoaded = false; this.assetTimer = { start: performance.now(), elapsed: 0 }; this.animationCounter = 0; this.boundary = this.gameService.getBoundary(); this.init(); } /** * Init the asset */ init() { this.gameService.getMasterObservable().subscribe((result) => { if (result.type === ObservableTypeEnum.keyDownEvent || result.type === ObservableTypeEnum.keyUpEvent) { this.processKeyStroke(result); } else if (result.type === ObservableTypeEnum.gameOver) { this.isGameOver = result.booleanData; } else if (result.type === ObservableTypeEnum.gamePaused) { this.isGamePaused = result.booleanData; } }); } /** * The extended animate class */ /* eslint-disable-next-line */ animate() { } /** * Get the Asset height */ getAssetHeight() { return this.assetHeight * this.assetScale.y; } /** * Get the Asset Width */ getAssetWidth() { return this.assetWidth * this.assetScale.x; } /** * set The Asset Dimensions * @param height The asset height * @param width The asset width */ setAssetDimensions(height, width) { this.assetHeight = height; this.assetWidth = width; } /** * Get the asset uid */ get uid() { return this.assetUid; } /** * Process the key stroke * @param eventCode the key event code */ /* eslint-disable-next-line */ processKeyStroke(event) { } /** * Move the asset * @param asset The asset input */ move(asset) { this.x = asset.x; this.y = asset.y; } /** * Determine if we should stop the animation */ stopAnimation() { return this.isDestroyed || this.isGameOver || this.isGamePaused; } /** * Position the Asset */ positionAsset(alignPosition, justifyPosition) { let x = 0; let y = 0; if (alignPosition === AssetAlignEnum.center) { x = (this.boundary.right - this.getAssetWidth()) / 2; } else if (alignPosition === AssetAlignEnum.leftThird) { x = this.boundary.right / 3 - this.getAssetWidth() / 2; } else if (alignPosition === AssetAlignEnum.leftFourth) { x = this.boundary.right / 4 - this.getAssetWidth() / 2; } else if (alignPosition === AssetAlignEnum.rightThird) { x = (this.boundary.right * 2) / 3 - this.getAssetWidth() / 2; } else if (alignPosition === AssetAlignEnum.rightFourth) { x = (this.boundary.right * 3) / 4 - this.getAssetWidth() / 2; } else if (alignPosition === AssetAlignEnum.right) { x = this.boundary.right - this.getAssetWidth(); } if (justifyPosition === AssetAlignVerticalEnum.bottom) { y = this.boundary.floor - this.getAssetHeight(); } else if (justifyPosition === AssetAlignVerticalEnum.middle) { y = (this.boundary.floor - this.getAssetHeight()) / 2; } return { x: Math.round(x), y: Math.round(y) }; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmlzbS9zcmMvbGliL2Fzc2V0L2Fzc2V0LmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBR2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUsxRTs7R0FFRztBQUNILE1BQU0sT0FBZ0IsVUFBVTtJQThEOUI7Ozs7OztPQU1HO0lBQ0gsWUFDWSxXQUF3QixFQUN4QixHQUE2QixFQUM3QixRQUFnQixFQUNoQixTQUEyQjtRQUgzQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixRQUFHLEdBQUgsR0FBRyxDQUEwQjtRQUM3QixhQUFRLEdBQVIsUUFBUSxDQUFRO1FBQ2hCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBRXJDLElBQUksQ0FBQyxVQUFVLEdBQUc7WUFDaEIsQ0FBQyxFQUFFLENBQUM7WUFDSixDQUFDLEVBQUUsQ0FBQztTQUNjLENBQUM7UUFDckIsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVYLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWpCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBRXBCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUks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SyxDQUFDLENBQUMsQ0FBQztZQUNoQixDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDUCxDQUFDO0lBQ2QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUFzc2V0IH0gZnJvbSAnLi4vaW50ZXJmYWNlL2Fzc2V0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBHYW1lU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2UvZ2FtZS5zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGVNb2RlbCB9IGZyb20gJy4uL21vZGVsL29ic2VydmFibGUubW9kZWwnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZVR5cGVFbnVtIH0gZnJvbSAnLi4vZW51bS9vYnNlcnZhYmxlLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBUaW1lck1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvdGltZXIubW9kZWwnO1xuaW1wb3J0IHsgQm91bmRhcnlNb2RlbCB9IGZyb20gJy4uL21vZGVsL2JvdW5kYXJ5Lm1vZGVsJztcbmltcG9ydCB7IEFzc2V0QWxpZ25FbnVtIH0gZnJvbSAnLi9lbnVtL2Fzc2V0LWFsaWduLmVudW0nO1xuaW1wb3J0IHsgQXNzZXRBbGlnblZlcnRpY2FsRW51bSB9IGZyb20gJy4vZW51bS9hc3NldC1hbGlnbi12ZXJ0aWNhbC5lbnVtJztcbmltcG9ydCB7IEFzc2V0U2NhbGVNb2RlbCB9IGZyb20gJy4uL21vZGVsL2Fzc2V0LXNjYWxlLm1vZGUnO1xuaW1wb3J0IHsgSW1hZ2VMb2NhdGlvbk1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvaW1hZ2UvaW1hZ2UtbG9jYXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgSW1hZ2VMb2FkZWRFbnVtIH0gZnJvbSAnLi4vZW51bS9pbWFnZS1sb2FkZWQuZW51bSc7XG5cbi8qKlxuICogVGhlIEFzc2V0IENsYXNzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBc3NldENsYXNzIGltcGxlbWVudHMgSUFzc2V0IHtcbiAgLyoqXG4gICAqIFRoZSB4IGNvb3JkaW5hdGVcbiAgICovXG4gIHB1YmxpYyB4OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgeSBjb29yZGluYXRlXG4gICAqL1xuICBwdWJsaWMgeTogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHJlcXVlc3QgaWQgZnJvbSB0aGUgYW5pbWF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVxdWVzdElkOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgQXNzZXQgVGltbWVyXG4gICAqL1xuICBwcm90ZWN0ZWQgYXNzZXRUaW1lcjogVGltZXJNb2RlbDtcbiAgLyoqXG4gICAqIEFuaW1hdGlvbiBDb3VudGVyXG4gICAqL1xuICBwcm90ZWN0ZWQgYW5pbWF0aW9uQ291bnRlcjogbnVtYmVyO1xuICAvKipcbiAgICogdGhlIGJvYXJkYXJ5IG1vZGVsXG4gICAqL1xuICBwcm90ZWN0ZWQgYm91bmRhcnk6IEJvdW5kYXJ5TW9kZWw7XG4gIC8qKlxuICAgKiBJcyB0aGUgYXNzZXQgaXMgZGVzdHJveWVkXG4gICAqL1xuICBwdWJsaWMgaXNEZXN0cm95ZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJZiB0aGUgYXNzZXQgY2FuIGJlIGFuaW1hdGVkXG4gICAqL1xuICBwdWJsaWMgaXNBbmltYXRlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIElmIHRoZSBhc3NldCBrbm93bnMgdGhlIGdhbWUgaXMgb3ZlclxuICAgKi9cbiAgcHJvdGVjdGVkIGlzR2FtZU92ZXI6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJZiB0aGUgYXNzZXQga25vd25zIHRoZSBnYW1lIGlzIHBhdXNlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGlzR2FtZVBhdXNlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBzY2FsZSBvZiB0aGUgb2JqZWN0XG4gICAqL1xuICBwdWJsaWMgYXNzZXRTY2FsZTogQXNzZXRTY2FsZU1vZGVsO1xuICAvKipcbiAgICogVGhlIGltYWdlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGltYWdlczogSW1hZ2VMb2NhdGlvbk1vZGVsW107XG4gIC8qKlxuICAgKiBJZiB0aGUgaW1hZ2UgaXMgbG9hZGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNJbWFnZUxvYWRlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBhc3NldCBoZWlnaHRcbiAgICovXG4gIHByaXZhdGUgYXNzZXRIZWlnaHQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBhc3NldCB3aWR0aFxuICAgKi9cbiAgcHJpdmF0ZSBhc3NldFdpZHRoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBnYW1lU2VydmljZSBUaGUgZ2FtZSBzZXJ2aWNlXG4gICAqIEBwYXJhbSBjdHggVGhlIGN0eFxuICAgKiBAcGFyYW0gYXNzZXRVaWQgdGhlIHVpZCBvZiB0aGUgYXNzZXRcbiAgICogQHBhcmFtIGltYWdlVHlwZSBUaGUgb3B0aW9uYWwgYW5pbWF0aW9uIG51bWJlclxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGdhbWVTZXJ2aWNlOiBHYW1lU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gICAgcHJvdGVjdGVkIGFzc2V0VWlkOiBudW1iZXIsXG4gICAgcHJvdGVjdGVkIGltYWdlVHlwZT86IEltYWdlTG9hZGVkRW51bVxuICApIHtcbiAgICB0aGlzLmFzc2V0U2NhbGUgPSB7XG4gICAgICB4OiAxLFxuICAgICAgeTogMVxuICAgIH0gYXMgQXNzZXRTY2FsZU1vZGVsO1xuICAgIHRoaXMueCA9IDA7XG4gICAgdGhpcy55ID0gMDtcblxuICAgIHRoaXMuaW1hZ2VzID0gW107XG5cbiAgICB0aGlzLmFzc2V0SGVpZ2h0ID0gMDtcbiAgICB0aGlzLmFzc2V0V2lkdGggPSAwO1xuXG4gICAgdGhpcy5pc0FuaW1hdGVkID0gZmFsc2U7XG4gICAgdGhpcy5pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNHYW1lT3ZlciA9IGZhbHNlO1xuICAgIHRoaXMuaXNHYW1lUGF1c2VkID0gZmFsc2U7XG4gICAgdGhpcy5pc0ltYWdlTG9hZGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLmFzc2V0VGltZXIgPSB7IHN0YXJ0OiBwZXJmb3JtYW5jZS5ub3coKSwgZWxhcHNlZDogMCB9O1xuICAgIHRoaXMuYW5pbWF0aW9uQ291bnRlciA9IDA7XG5cbiAgICB0aGlzLmJvdW5kYXJ5ID0gdGhpcy5nYW1lU2VydmljZS5nZXRCb3VuZGFyeSgpO1xuXG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdCB0aGUgYXNzZXRcbiAgICovXG4gIGluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nYW1lU2VydmljZS5nZXRNYXN0ZXJPYnNlcnZhYmxlKCkuc3Vic2NyaWJlKChyZXN1bHQ6IE9ic2VydmFibGVNb2RlbCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdC50eXBlID09PSBPYnNlcnZhYmxlVHlwZUVudW0ua2V5RG93bkV2ZW50IHx8IHJlc3VsdC50eXBlID09PSBPYnNlcnZhYmxlVHlwZUVudW0ua2V5VXBFdmVudCkge1xuICAgICAgICB0aGlzLnByb2Nlc3NLZXlTdHJva2UocmVzdWx0KTtcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnR5cGUgPT09IE9ic2VydmFibGVUeXBlRW51bS5nYW1lT3Zlcikge1xuICAgICAgICB0aGlzLmlzR2FtZU92ZXIgPSByZXN1bHQuYm9vbGVhbkRhdGE7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdC50eXBlID09PSBPYnNlcnZhYmxlVHlwZUVudW0uZ2FtZVBhdXNlZCkge1xuICAgICAgICB0aGlzLmlzR2FtZVBhdXNlZCA9IHJlc3VsdC5ib29sZWFuRGF0YTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogVGhlIGV4dGVuZGVkIGFuaW1hdGUgY2xhc3NcbiAgICovXG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgYW5pbWF0ZSgpOiB2b2lkIHt9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgQXNzZXQgaGVpZ2h0XG4gICAqL1xuICBnZXRBc3NldEhlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFzc2V0SGVpZ2h0ICogdGhpcy5hc3NldFNjYWxlLnk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBBc3NldCBXaWR0aFxuICAgKi9cbiAgZ2V0QXNzZXRXaWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFzc2V0V2lkdGggKiB0aGlzLmFzc2V0U2NhbGUueDtcbiAgfVxuXG4gIC8qKlxuICAgKiAgc2V0IFRoZSBBc3NldCBEaW1lbnNpb25zXG4gICAqIEBwYXJhbSBoZWlnaHQgVGhlIGFzc2V0IGhlaWdodFxuICAgKiBAcGFyYW0gd2lkdGggVGhlIGFzc2V0IHdpZHRoXG4gICAqL1xuICBzZXRBc3NldERpbWVuc2lvbnMoaGVpZ2h0OiBudW1iZXIsIHdpZHRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmFzc2V0SGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHRoaXMuYXNzZXRXaWR0aCA9IHdpZHRoO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYXNzZXQgdWlkXG4gICAqL1xuICBnZXQgdWlkKCkge1xuICAgIHJldHVybiB0aGlzLmFzc2V0VWlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgdGhlIGtleSBzdHJva2VcbiAgICogQHBhcmFtIGV2ZW50Q29kZSB0aGUga2V5IGV2ZW50IGNvZGVcbiAgICovXG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAqL1xuICBwcm90ZWN0ZWQgcHJvY2Vzc0tleVN0cm9rZShldmVudDogT2JzZXJ2YWJsZU1vZGVsKTogdm9pZCB7fVxuXG4gIC8qKlxuICAgKiBNb3ZlIHRoZSBhc3NldFxuICAgKiBAcGFyYW0gYXNzZXQgVGhlIGFzc2V0IGlucHV0XG4gICAqL1xuICBtb3ZlKGFzc2V0OiBJQXNzZXQpOiB2b2lkIHtcbiAgICB0aGlzLnggPSBhc3NldC54O1xuICAgIHRoaXMueSA9IGFzc2V0Lnk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBzdG9wIHRoZSBhbmltYXRpb25cbiAgICovXG4gIHByb3RlY3RlZCBzdG9wQW5pbWF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRGVzdHJveWVkIHx8IHRoaXMuaXNHYW1lT3ZlciB8fCB0aGlzLmlzR2FtZVBhdXNlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3NpdGlvbiB0aGUgQXNzZXRcbiAgICovXG4gIHBvc2l0aW9uQXNzZXQoYWxpZ25Qb3NpdGlvbjogQXNzZXRBbGlnbkVudW0sIGp1c3RpZnlQb3NpdGlvbjogQXNzZXRBbGlnblZlcnRpY2FsRW51bSk6IElBc3NldCB7XG4gICAgbGV0IHggPSAwO1xuICAgIGxldCB5ID0gMDtcblxuICAgIGlmIChhbGlnblBvc2l0aW9uID09PSBBc3NldEFsaWduRW51bS5jZW50ZXIpIHtcbiAgICAgIHggPSAodGhpcy5ib3VuZGFyeS5yaWdodCAtIHRoaXMuZ2V0QXNzZXRXaWR0aCgpKSAvIDI7XG4gICAgfSBlbHNlIGlmIChhbGlnblBvc2l0aW9uID09PSBBc3NldEFsaWduRW51bS5sZWZ0VGhpcmQpIHtcbiAgICAgIHggPSB0aGlzLmJvdW5kYXJ5LnJpZ2h0IC8gMyAtIHRoaXMuZ2V0QXNzZXRXaWR0aCgpIC8gMjtcbiAgICB9IGVsc2UgaWYgKGFsaWduUG9zaXRpb24gPT09IEFzc2V0QWxpZ25FbnVtLmxlZnRGb3VydGgpIHtcbiAgICAgIHggPSB0aGlzLmJvdW5kYXJ5LnJpZ2h0IC8gNCAtIHRoaXMuZ2V0QXNzZXRXaWR0aCgpIC8gMjtcbiAgICB9IGVsc2UgaWYgKGFsaWduUG9zaXRpb24gPT09IEFzc2V0QWxpZ25FbnVtLnJpZ2h0VGhpcmQpIHtcbiAgICAgIHggPSAodGhpcy5ib3VuZGFyeS5yaWdodCAqIDIpIC8gMyAtIHRoaXMuZ2V0QXNzZXRXaWR0aCgpIC8gMjtcbiAgICB9IGVsc2UgaWYgKGFsaWduUG9zaXRpb24gPT09IEFzc2V0QWxpZ25FbnVtLnJpZ2h0Rm91cnRoKSB7XG4gICAgICB4ID0gKHRoaXMuYm91bmRhcnkucmlnaHQgKiAzKSAvIDQgLSB0aGlzLmdldEFzc2V0V2lkdGgoKSAvIDI7XG4gICAgfSBlbHNlIGlmIChhbGlnblBvc2l0aW9uID09PSBBc3NldEFsaWduRW51bS5yaWdodCkge1xuICAgICAgeCA9IHRoaXMuYm91bmRhcnkucmlnaHQgLSB0aGlzLmdldEFzc2V0V2lkdGgoKTtcbiAgICB9XG5cbiAgICBpZiAoanVzdGlmeVBvc2l0aW9uID09PSBBc3NldEFsaWduVmVydGljYWxFbnVtLmJvdHRvbSkge1xuICAgICAgeSA9IHRoaXMuYm91bmRhcnkuZmxvb3IgLSB0aGlzLmdldEFzc2V0SGVpZ2h0KCk7XG4gICAgfSBlbHNlIGlmIChqdXN0aWZ5UG9zaXRpb24gPT09IEFzc2V0QWxpZ25WZXJ0aWNhbEVudW0ubWlkZGxlKSB7XG4gICAgICB5ID0gKHRoaXMuYm91bmRhcnkuZmxvb3IgLSB0aGlzLmdldEFzc2V0SGVpZ2h0KCkpIC8gMjtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogTWF0aC5yb3VuZCh4KSxcbiAgICAgIHk6IE1hdGgucm91bmQoeSlcbiAgICB9IGFzIElBc3NldDtcbiAgfVxufVxuIl19