123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- import { Button } from "../../libraries/components/Button.js";
- import { Point } from "../../libraries/spatial/Point.js";
- export class LevelSelectState {
- constructor(fsm) {
- this.stateMachine = fsm;
- this.boundMouseEvent = {};
- this.levelData = [];
- this.playerData = {};
- this.levelButtons = [];
- this.offsetX = 0;
- this.page = 0;
- this.maxPage = 0;
- this.canvasBounds = null;
- }
- init() {
- this.boundMouseEvent['mousedown'] = this.mouseDown.bind(this);
- this.boundMouseEvent['mousemove'] = this.mouseMove.bind(this);
- for(let key in this.boundMouseEvent) {
- window.addEventListener(key, this.boundMouseEvent[key]);
- }
- this.levelButtons = [];
- for(let i = 0; i <= this.levelData.length; i++) {
- let buttonText = i+1;
- if(i == this.levelData.length) {
- buttonText = "%";
- }
- let button = new Button(0,0, 50, 50, buttonText, {fontSize: 18, textStrokeStyle: null});
- button.hoverFunction((ctx) => {
- if(this.playerData.level > i+1) {
- ctx.fillStyle = "rgba(49, 141, 79, 0.8)";
- } else if(this.playerData.level < i+1) {
- ctx.fillStyle = "rgba(224, 104, 78, 0.8)";
- } else {
- ctx.fillStyle = "rgba(255,255,255,0.8)";
- }
- });
- button.backgroundDrawFunction((ctx, scaledCanvas) => {
- if(this.playerData.level > i+1) {
- ctx.fillStyle = "rgba(49, 141, 79, 0.5)";
- } else if(this.playerData.level < i+1) {
- ctx.fillStyle = "rgba(224, 104, 78, 0.5)";
- } else {
- ctx.fillStyle = "rgba(255,255,255,0.5)";
- }
-
- ctx.beginPath();
- ctx.rect(-button.bounds.width / 2, -button.bounds.height / 2, button.bounds.width, button.bounds.height);
- ctx.closePath();
- if(button.isHovered) {
- document.body.style.cursor = "pointer";
- button.whenHovered(ctx, scaledCanvas);
- }
- ctx.fill();
- });
- button.clickFunction((event) => {
- if(this.playerData.level >= i+1) {
- this.playerData.current = i+1;
- this.stateMachine.transitionTo("game");
- }
- })
- this.levelButtons.push(button);
- }
- this.nextPageButton = new Button(0, 0, 100, 50, "next", {fontSize: 28, textStrokeStyle: null});
- this.nextPageButton.clickFunction((event) => {
- this.page++;
- this.page = Math.min(this.page, this.maxPage);
- });
- this.nextPageButton.hoverFunction((ctx) => {
- ctx.fillStyle = "rgba(255,255,255,0.8)";
- });
- this.prevPageButton = new Button(0, 0, 100, 50, "prev",{fontSize: 28, textStrokeStyle: null});
- this.prevPageButton.clickFunction((event) => {
- this.page--;
- this.page = Math.max(0, this.page);
- })
- this.prevPageButton.hoverFunction((ctx) => {
- ctx.fillStyle = "rgba(255,255,255,0.8)";
- });
- }
- draw(ctx, scaledCanvas) {
- ctx.fillStyle = "white";
- ctx.font = "48px Luckiest Guy";
- ctx.textAlign = "center";
- ctx.lineWidth = 4;
- this.canvasBounds = scaledCanvas.bounds;
- let center = this.canvasBounds.center;
- ctx.fillText(`Level Select`, center.x, 48);
- ctx.strokeText(`Level Select`, center.x, 48);
- let levelGridWidth = this.canvasBounds.width - 40;
- let numberOfLevelButtonsCols = Math.floor(levelGridWidth / 70);
- let numberOfLevelButtonsRows = Math.floor(this.levelButtons.length / numberOfLevelButtonsCols)
- let maxRowsInHeight = Math.max(1, Math.floor((this.canvasBounds.height - 200) / 70))
- let numberOfPages = Math.max(1, Math.floor(numberOfLevelButtonsRows / maxRowsInHeight));
- this.maxPage = numberOfPages;
- this.offsetX = (levelGridWidth - ((numberOfLevelButtonsCols-1) * 70) + 50) / 2;
- let min = this.page * (numberOfLevelButtonsCols * maxRowsInHeight)
- let max = Math.min(this.levelButtons.length, (this.page + 1) * (numberOfLevelButtonsCols * maxRowsInHeight));
- for(let i = min; i < max; i++) {
- let button = this.levelButtons[i];
- let buttonPosition = new Point((i % numberOfLevelButtonsCols) * 70 + this.offsetX, Math.floor((i / numberOfLevelButtonsCols)) * 70 + 100 - (this.page * maxRowsInHeight * 70));
- if(buttonPosition.y > Math.max(100,this.canvasBounds.height - 100)) {
- break;
- }
- button.setPosition(buttonPosition.x, buttonPosition.y);
- button.draw(ctx, scaledCanvas);
- }
- this.nextPageButton.setPosition(center.x + 105, Math.max(170, this.canvasBounds.height - 100));
- this.nextPageButton.draw(ctx, scaledCanvas);
- this.prevPageButton.setPosition(center.x - 105, Math.max(170, this.canvasBounds.height - 100));
- this.prevPageButton.draw(ctx, scaledCanvas);
- }
- setLevelData(data) {
- this.levelData = data;
- }
- setPlayerData(data) {
- this.playerData = data;
- }
- update(delta) {
- }
- mouseDown(event) {
- let levelGridWidth = this.canvasBounds.width - 40;
- let numberOfLevelButtonsCols = Math.floor(levelGridWidth / 70);
- let maxRowsInHeight = Math.max(1, Math.floor((this.canvasBounds.height - 200) / 70))
- let min = this.page * (numberOfLevelButtonsCols * maxRowsInHeight)
- let max = Math.min(this.levelButtons.length, (this.page + 1) * (numberOfLevelButtonsCols * maxRowsInHeight));
- for(let i = min; i < max; i++) {
- let button = this.levelButtons[i];
- button.mouseDown(event);
- }
- this.nextPageButton.mouseDown(event);
- this.prevPageButton.mouseDown(event);
- }
- mouseMove(event) {
- document.body.style.cursor = "default";
- let levelGridWidth = this.canvasBounds.width - 40;
- let numberOfLevelButtonsCols = Math.floor(levelGridWidth / 70);
- let maxRowsInHeight = Math.max(1, Math.floor((this.canvasBounds.height - 200) / 70))
- let min = this.page * (numberOfLevelButtonsCols * maxRowsInHeight)
- let max = Math.min(this.levelButtons.length, (this.page + 1) * (numberOfLevelButtonsCols * maxRowsInHeight));
- for(let i = min; i < max; i++) {
- let button = this.levelButtons[i];
- button.mouseMove(event);
- }
- this.nextPageButton.mouseMove(event);
- this.prevPageButton.mouseMove(event);
- }
- enter() {
- this.init();
- }
- leave() {
- for(let key in this.boundMouseEvent) {
- window.removeEventListener(key, this.boundMouseEvent[key]);
- }
- }
- }
|