From 8bae2ac12f9e512f28365e6a2a0da8887d4abe78 Mon Sep 17 00:00:00 2001 From: Arne van Iterson Date: Mon, 13 Apr 2020 11:48:48 +0200 Subject: [PATCH] Reorganised assets and added gamescreens --- css/index.css | 33 ------ game.html => html/game.html | 10 +- index.html | 18 ---- main.js | 2 +- package-lock.json | 6 +- package.json | 2 +- res/{ => images}/aseprite/example.aseprite | Bin res/{ => images}/aseprite/pointers.aseprite | Bin res/{ => images}/aseprite/tilemap.aseprite | Bin res/{ => images}/cog-solid.svg | 0 res/{ => images}/mage.png | Bin res/{ => images}/player.png | Bin res/{ => images}/pointers.png | Bin res/{ => images}/tilemap.png | Bin res/lang/default.js | 31 ++++++ res/sounds/forbidden.wav | Bin 0 -> 57404 bytes src/entities/bullet.js | 14 ++- src/entities/chest.js | 28 +++-- src/entities/mage.js | 3 +- src/entities/player.js | 2 +- src/entities/pointer.js | 9 +- src/entities/portal.js | 33 +++++- src/game.js | 110 -------------------- src/helpers/level.js | 4 +- src/helpers/stats.js | 11 +- src/index.js | 75 +++++++++++-- src/levels/1-1 copy.js | 4 +- src/levels/1-1.js | 4 +- src/screens/game.js | 110 ++++++++++++++++++++ src/screens/gameover.js | 36 +++++++ src/screens/logo.js | 40 +++++++ src/screens/title.js | 51 +++++++++ src/screens/tutorial.js | 38 +++++++ 33 files changed, 458 insertions(+), 216 deletions(-) delete mode 100644 css/index.css rename game.html => html/game.html (67%) delete mode 100644 index.html rename res/{ => images}/aseprite/example.aseprite (100%) rename res/{ => images}/aseprite/pointers.aseprite (100%) rename res/{ => images}/aseprite/tilemap.aseprite (100%) rename res/{ => images}/cog-solid.svg (100%) rename res/{ => images}/mage.png (100%) rename res/{ => images}/player.png (100%) rename res/{ => images}/pointers.png (100%) rename res/{ => images}/tilemap.png (100%) create mode 100644 res/lang/default.js create mode 100644 res/sounds/forbidden.wav delete mode 100644 src/game.js create mode 100644 src/screens/game.js create mode 100644 src/screens/gameover.js create mode 100644 src/screens/logo.js create mode 100644 src/screens/title.js create mode 100644 src/screens/tutorial.js diff --git a/css/index.css b/css/index.css deleted file mode 100644 index 1843fb8..0000000 --- a/css/index.css +++ /dev/null @@ -1,33 +0,0 @@ -html, body { - margin: 0; - height: 100vh; - width: 100vw; - background: lightskyblue; - font-family: sans-serif; -} - -h1 { - text-align: center; -} - -ul { - list-style-type: none; - text-align: center; - padding: 0; - display: grid; -} - -li { - width: 25vw; - padding: 10px 20px; - margin: 0 auto; - margin-top: 20px; - background: #9ea399; - border-radius: 5px; - border: 2px solid #1c1914; - cursor: pointer; -} - -li:hover { - box-shadow: 2px 2px #1c1914; -} \ No newline at end of file diff --git a/game.html b/html/game.html similarity index 67% rename from game.html rename to html/game.html index 35dd510..bfeba34 100644 --- a/game.html +++ b/html/game.html @@ -3,20 +3,20 @@ - - + + Game
- Settings + Settings
diff --git a/index.html b/index.html deleted file mode 100644 index 15d8c4b..0000000 --- a/index.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - Caa-game - - - -

Caa-game

- - - - \ No newline at end of file diff --git a/main.js b/main.js index d541e63..08901e5 100644 --- a/main.js +++ b/main.js @@ -28,7 +28,7 @@ function createWindow () { win.removeMenu(); // and load the index.html of the app. - win.loadFile(path.join("index.html")); + win.loadFile(path.join("html/game.html")); // Open the DevTools. win.webContents.openDevTools(); diff --git a/package-lock.json b/package-lock.json index da887ea..03e97a0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -193,9 +193,9 @@ } }, "asdf-games": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/asdf-games/-/asdf-games-1.0.12.tgz", - "integrity": "sha512-XaramOeOnLK4eH3HRRR6joCQClvuZZ/ANBEjKzMpMHsZ/+O/G3arMI2h6KQ86yrWrT0TZGTc89vrfmBhQmqNrQ==" + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/asdf-games/-/asdf-games-1.0.14.tgz", + "integrity": "sha512-0CCsgxfPjJL5BI7a8CYw49Y14rslG1BIsg20gnaf8Hi0SOaXJ61mZXf6Q96l9h5OhDaOLsv9e/yAMY9P0vq3IQ==" }, "astral-regex": { "version": "1.0.0", diff --git a/package.json b/package.json index d57fffe..4d99a7c 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "author": "McArn", "license": "ISC", "dependencies": { - "asdf-games": "^1.0.12" + "asdf-games": "^1.0.14" }, "devDependencies": { "cross-env": "^7.0.2", diff --git a/res/aseprite/example.aseprite b/res/images/aseprite/example.aseprite similarity index 100% rename from res/aseprite/example.aseprite rename to res/images/aseprite/example.aseprite diff --git a/res/aseprite/pointers.aseprite b/res/images/aseprite/pointers.aseprite similarity index 100% rename from res/aseprite/pointers.aseprite rename to res/images/aseprite/pointers.aseprite diff --git a/res/aseprite/tilemap.aseprite b/res/images/aseprite/tilemap.aseprite similarity index 100% rename from res/aseprite/tilemap.aseprite rename to res/images/aseprite/tilemap.aseprite diff --git a/res/cog-solid.svg b/res/images/cog-solid.svg similarity index 100% rename from res/cog-solid.svg rename to res/images/cog-solid.svg diff --git a/res/mage.png b/res/images/mage.png similarity index 100% rename from res/mage.png rename to res/images/mage.png diff --git a/res/player.png b/res/images/player.png similarity index 100% rename from res/player.png rename to res/images/player.png diff --git a/res/pointers.png b/res/images/pointers.png similarity index 100% rename from res/pointers.png rename to res/images/pointers.png diff --git a/res/tilemap.png b/res/images/tilemap.png similarity index 100% rename from res/tilemap.png rename to res/images/tilemap.png diff --git a/res/lang/default.js b/res/lang/default.js new file mode 100644 index 0000000..630166e --- /dev/null +++ b/res/lang/default.js @@ -0,0 +1,31 @@ +module.exports = { + titleScreen: { + instructions: [ + "Press Space to Start!", + "Press T for the tutorial", + "Press Q to quit", + ] + }, + tutorial: [ + "Use WASD or the direction keys to move", + "Press Ctrl to sprint, but watch your stamina!", + "Press space to interact with objects", + "If the arrow above an object is red, you cannot interact with it", + "You might be missing key or have already interacted with it", + "Press space to return" + ], + gameOver: { + dead: "You died!", + instruction: "Press space to return to title" + }, + logoScreen: [ + "Made by JoVo and McArn" + ], + game: { + lives: "Lives", + stamina: "Stamina", + keyFind: "You found a key!", + keyMiss: "You do not have the key for this door!", + chestOpen: "You already opened this chest" + } +}; \ No newline at end of file diff --git a/res/sounds/forbidden.wav b/res/sounds/forbidden.wav new file mode 100644 index 0000000000000000000000000000000000000000..176f4cb14c42a108879a2e2719a3f498a0526b58 GIT binary patch literal 57404 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 XC%dBhSPDd2T=Vi7Yma3V*ZBVdMC^Q1 literal 0 HcmV?d00001 diff --git a/src/entities/bullet.js b/src/entities/bullet.js index bd152b6..8547f00 100644 --- a/src/entities/bullet.js +++ b/src/entities/bullet.js @@ -1,8 +1,8 @@ var asdf = require("asdf-games"); // eslint-disable-next-line no-unused-vars -const { Texture, TileSprite, AnimManager, wallslide, entity } = asdf; +const { Texture, TileSprite, deadInTracks, entity } = asdf; -const texture = new Texture("./res/tilemap.png"); +const texture = new Texture(__dirname + "/../../res/images/tilemap.png"); class Bullet extends TileSprite { constructor(pos, angle, parent, player, level) { @@ -41,9 +41,15 @@ class Bullet extends TileSprite { } else { const xo = Math.cos(this.rotation) * 100 * dt; const yo = Math.sin(this.rotation) * 100 * dt; + const r = deadInTracks.deadInTracks(this, this.level, xo, yo); - this.pos.x += xo; - this.pos.y += yo; + if (r.x == 0 || r.y == 0) { + this.parent.bullet = false; + this.dead = true; + } else { + this.pos.x += xo; + this.pos.y += yo; + } } } } diff --git a/src/entities/chest.js b/src/entities/chest.js index 113a245..6fdfa43 100644 --- a/src/entities/chest.js +++ b/src/entities/chest.js @@ -1,9 +1,13 @@ var asdf = require("asdf-games"); // eslint-disable-next-line no-unused-vars -const { Texture, TileSprite, AnimManager, entity } = asdf; +const { Texture, Sound, TileSprite, entity } = asdf; -var texture = new Texture("./res/tilemap.png"); -var Pointer = require("./pointer.js"); +const texture = new Texture(__dirname + "/../../res/images/tilemap.png"); +const sounds = { + forbidden: new Sound(__dirname + "/../../res/sounds/forbidden.wav") +}; + +const Pointer = require("./pointer.js"); const state = { open: 0, @@ -29,6 +33,7 @@ class Chest extends TileSprite { this.level = level; this.pointer = false; + this.pressed = false; this.hitBox = { x: 1, @@ -57,10 +62,21 @@ class Chest extends TileSprite { this.pointer.anims.play("red"); } - if (this.keys.action && this.state == state.closed) { - this.state = state.open; - this.action(); + if (this.keys.action) { + if (this.state == state.closed) { + this.state = state.open; + this.pressed = true; + this.action(); + } else { + if (!sounds.forbidden.playing && !this.pressed) { + sounds.forbidden.play(); + this.pressed = true; + } + } + } else { + this.pressed = false; } + } else { this.level.entities.remove(this.pointer); this.pointer = false; diff --git a/src/entities/mage.js b/src/entities/mage.js index 161a275..5f90c33 100644 --- a/src/entities/mage.js +++ b/src/entities/mage.js @@ -2,8 +2,8 @@ var asdf = require("asdf-games"); // eslint-disable-next-line no-unused-vars const { Texture, TileSprite, AnimManager, wallslide, entity } = asdf; +const texture = new Texture("../res/images/mage.png"); const Bullet = require("./bullet.js"); -const texture = new Texture("./res/mage.png"); const states = { idle: 0, @@ -126,7 +126,6 @@ class Mage extends TileSprite { } shoot(angle) { - console.log("shoot"); this.bullet = true; var pos = { x: this.pos.x + 8, diff --git a/src/entities/player.js b/src/entities/player.js index d6a734a..e702148 100644 --- a/src/entities/player.js +++ b/src/entities/player.js @@ -1,7 +1,7 @@ var asdf = require("asdf-games"); const { Texture, TileSprite, AnimManager, wallslide } = asdf; -var texture = new Texture("./res/player.png"); +const texture = new Texture("../res/images/player.png"); class Player extends TileSprite { constructor(keys, window) { diff --git a/src/entities/pointer.js b/src/entities/pointer.js index ac637db..c301c68 100644 --- a/src/entities/pointer.js +++ b/src/entities/pointer.js @@ -1,13 +1,8 @@ var asdf = require("asdf-games"); // eslint-disable-next-line no-unused-vars -const { Texture, TileSprite, AnimManager, entity } = asdf; +const { Texture, TileSprite, AnimManager } = asdf; -const texture = new Texture("./res/pointers.png"); - -// const states = { -// white: 0, -// red: 1 -// }; +const texture = new Texture("../res/images/pointers.png"); class Pointer extends TileSprite { constructor(pos) { diff --git a/src/entities/portal.js b/src/entities/portal.js index 42c654b..6ec2143 100644 --- a/src/entities/portal.js +++ b/src/entities/portal.js @@ -1,8 +1,12 @@ var asdf = require("asdf-games"); // eslint-disable-next-line no-unused-vars -const { Texture, TileSprite, entity } = asdf; +const { Texture, Sound, TileSprite, entity } = asdf; + +const texture = new Texture(__dirname + "/../../res/images/tilemap.png"); +const sounds = { + forbidden: new Sound(__dirname + "/../../res/sounds/forbidden.wav") +}; -var texture = new Texture("./res/tilemap.png"); var Pointer = require("./pointer.js"); class Portal extends TileSprite { @@ -15,6 +19,8 @@ class Portal extends TileSprite { this.action = action; this.pointer = false; + this.pressed = false; + this.keys = keys; this.key = key; @@ -75,23 +81,42 @@ class Portal extends TileSprite { if (this.player.items.keys.length > 0) { for (let index = 0; index < this.player.items.keys.length; index++) { const element = this.player.items.keys[index]; + console.log(this.key); + console.log(element); if (element == this.key) { // Correct key this.pointer.anims.play("white"); if (this.keys.action) { this.action(); + console.warn("action"); } break; } else { // Not the correct key - this.pointer.anims.play("red"); console.log("correct keyn't"); + this.pointer.anims.play("red"); + if (this.keys.action) { + if (!sounds.forbidden.playing && !this.pressed) { + sounds.forbidden.play(); + this.pressed = true; + } + } else { + this.pressed = false; + } } } } else { // No keys at all + console.log("You have no keys"); this.pointer.anims.play("red"); - console.log("keyn't"); + if (this.keys.action) { + if (!sounds.forbidden.playing && !this.pressed) { + sounds.forbidden.play(); + this.pressed = true; + } + } else { + this.pressed = false; + } } } else { if (this.keys.action) { diff --git a/src/game.js b/src/game.js deleted file mode 100644 index 4290e42..0000000 --- a/src/game.js +++ /dev/null @@ -1,110 +0,0 @@ -const { ipcRenderer, remote } = require("electron"); - -var asdf = require("asdf-games"); -// eslint-disable-next-line no-unused-vars -const { Game, KeyControls, MouseControls, Camera } = asdf; - -const window = { w: 640, h: 320 }; - -const game = new Game(window.w, window.h, true); -ipcRenderer.send("resize", window); - -const { scene } = game; - -const mouseAim = new MouseControls(document.getElementById("board")); -const keys = new KeyControls(); - -const Stats = require("./src/helpers/stats.js"); -var Player = require("./src/entities/player.js"); -var Level = require("./src/helpers/level.js"); - -// Initialise first level 1-1.js at startPosition 0 -var player = new Player(keys, window); - -var level = new Level(require("./src/levels/1-1.js"), keys, player); -player.pos.x = level.startPos[0].x / 1; -player.pos.y = level.startPos[0].y / 1; -player.level = level; - -const camera = new Camera(player, window, { w: level.w * 2, h: level.h * 2 }); -var stats = new Stats(player); - -scene.add(camera); -camera.add(level); -camera.add(player); -scene.add(stats); - -function switchLevel(module, pos = 0) { - scene.remove(stats); - console.log(scene); - camera.map(function(e) { - camera.remove(e); - if (e instanceof Level) { - var lives = player.lives; - var items = player.items; - - var p = new Player(keys, window); - player = p; - - e = new Level(module, keys, player); - level = e; - - player.pos.x = level.startPos[pos].x / 1; - player.pos.y = level.startPos[pos].y / 1; - - player.lives = lives; - player.items = items; - player.level = e; - - stats = new Stats(player); - - camera.add(e); - camera.add(player); - camera.setSubject(player); - scene.add(stats); - } - }); -} - -game.run(() => { - // Debugging tools - if (mouseAim.isDown) { - console.log("cliccccccccccc"); - console.log(player); - console.log(level); - } - - // Switch to another level - if (level.switch) { - console.log("Switching level!", level); - switchLevel(require(level.switch.module), level.switch.pos); - level.switch = undefined; - } - - // Refocus camera to player when player is moved by a portal - if (player.refocus) { - camera.setSubject(player); - player.refocus = false; - } -}); - - -/* ********************************************************* - Settings behavior -********************************************************* */ - -// Opening and closing of menu. -document.getElementById("settings").addEventListener("click", () => { - const menuRef = document.getElementById("menu"); - menuRef.style.display = menuRef.style.display === "block" ? "none" : "block"; -}); - -// Quit Game handling. -document.getElementById("close").addEventListener("click", () => { - remote.app.quit(); -}); - -// Return to main menu button -document.getElementById("mainmenu").addEventListener("click", () => { - remote.getCurrentWindow().loadFile(__dirname + "/index.html"); -}); \ No newline at end of file diff --git a/src/helpers/level.js b/src/helpers/level.js index 2cbe0fb..c7f5041 100644 --- a/src/helpers/level.js +++ b/src/helpers/level.js @@ -1,8 +1,8 @@ var asdf = require("asdf-games"); // eslint-disable-next-line no-unused-vars -const { Texture, TileMap, entity, Container } = asdf; +const { Texture, TileMap, Container } = asdf; -const texture = new Texture("./res/tilemap.png"); +const texture = new Texture(__dirname + "/../../res/images/tilemap.png"); const tiles = require("../../res/tilemap.js"); const tileSize = 32; diff --git a/src/helpers/stats.js b/src/helpers/stats.js index 25f1429..4d4c931 100644 --- a/src/helpers/stats.js +++ b/src/helpers/stats.js @@ -1,8 +1,10 @@ const { Container, TileSprite, Rect, Texture, Text } = require("asdf-games"); -const tilemapFrames = require("../../res/tilemap.js"); -const tilemap = new Texture("res/tilemap.png"); +const tilemapFrames = require("../../res/tilemap.js"); +const tilemap = new Texture("../res/images/tilemap.png"); const tileSize = 32; + +const text = require(__dirname + "/../../res/lang/default.js"); const fillStyle = {fill: "#ffffff", font: "24px Arial"}; class Stats extends Container { @@ -14,7 +16,7 @@ class Stats extends Container { const background = new Rect(640, 42, {fill: "rgba(0,0,0, 0.5)"}); background.pos = {x: 0, y: 280}; - const livesText = new Text("LIVES:", fillStyle); + const livesText = new Text(text.game.lives + ":", fillStyle); livesText.pos = {x: 10, y: 310}; const livesCounter = new Text(player.lives, fillStyle); @@ -24,7 +26,7 @@ class Stats extends Container { heart.frame = {x: tilemapFrames[42].x / tileSize, y: tilemapFrames[42].y / tileSize}; heart.pos = {x: 104, y: 284}; - const staminaText = new Text("| STAMINA:", fillStyle); + const staminaText = new Text("| " + text.game.stamina + ":", fillStyle); staminaText.pos = {x: 140, y: 310}; this.children = [ @@ -48,7 +50,6 @@ class Stats extends Container { this.children[2].text = this.player.lives; Array(5).fill().forEach((_val, index) => { - //console.log(Math.round(this.player.stamina.current) - 1, index); this.children[index + 5].frame = (Math.round(this.player.stamina.current)) <= index ? {x: tilemapFrames[45].x / tileSize, y: tilemapFrames[45].y / tileSize} diff --git a/src/index.js b/src/index.js index b3f72f7..f1dcb9d 100644 --- a/src/index.js +++ b/src/index.js @@ -1,14 +1,69 @@ -const { remote } = require("electron"); +const { ipcRenderer, remote } = require("electron"); +var asdf = require("asdf-games"); +// eslint-disable-next-line no-unused-vars +const { Game, KeyControls, MouseControls } = asdf; -document.addEventListener("DOMContentLoaded", () => { +const + Logo = require(__dirname + "/../src/screens/logo.js"), + Title = require(__dirname + "/../src/screens/title.js"), + Tutorial = require(__dirname + "/../src/screens/tutorial.js"), + GameScreen = require(__dirname + "/../src/screens/game.js"), + Gameover = require(__dirname + "/../src/screens/gameover.js") +; - // Start game - document.getElementById("resume").addEventListener("click", () => { - remote.getCurrentWindow().loadFile(__dirname + "/game.html"); +const window = { w: 640, h: 320 }; + +const game = new Game(window.w, window.h, true); +ipcRenderer.send("resize", window); + +const keys = new KeyControls(); + +function titleScreen() { + game.scene = new Title(game, keys, newGame, tutorial, remote.app.quit); +} + +function tutorial() { + game.scene = new Tutorial(game, keys, titleScreen); +} + +function gameOver() { + game.scene = new Gameover(game, keys, titleScreen); +} + +function newGame() { + game.scene = new GameScreen(game, window, keys, gameOver); +} + +game.scene = new Logo(game, titleScreen); + +game.run(); + + +/* ********************************************************* + Settings behavior +********************************************************* */ + +// Opening and closing of menu. +function toggleMenu() { + const menuRef = document.getElementById("menu"); + menuRef.style.display = menuRef.style.display === "block" ? "none" : "block"; +} + +const elements = [...document.querySelectorAll("#settings, #resume")]; +elements.forEach(element => { + element.addEventListener("click", () => { + toggleMenu(); }); +}); + +// Return to main menu button +document.getElementById("mainmenu").addEventListener("click", () => { + titleScreen(); + toggleMenu(); +}); - // Quit game - document.getElementById("quit").addEventListener("click", () => { - remote.app.quit(); - }); -}); \ No newline at end of file +// Quit Game handling. +document.getElementById("close").addEventListener("click", () => { + remote.app.quit(); +}); + diff --git a/src/levels/1-1 copy.js b/src/levels/1-1 copy.js index 4d6fafe..6738bfc 100644 --- a/src/levels/1-1 copy.js +++ b/src/levels/1-1 copy.js @@ -1,6 +1,6 @@ const tileSize = 32; -let level = { +var level = { tiles: [ 1, 2, 2, 2, 2, 6, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 6, 4, 21, 22, 23, 21, 7, 0, 4, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 7, @@ -47,7 +47,7 @@ let level = { pos: { x: 8 * tileSize, y: 2 * tileSize }, texture: "Ladder", action: (_player, level) => { - level.switch = { module: "./src/levels/1-1.js", pos: 0 }; + level.switch = { module: __dirname + "/1-1.js", pos: 0 }; }, key: "1-2_3" } diff --git a/src/levels/1-1.js b/src/levels/1-1.js index ed935ba..5da8ad1 100644 --- a/src/levels/1-1.js +++ b/src/levels/1-1.js @@ -1,6 +1,6 @@ const tileSize = 32; -let level = { +var level = { tiles: [ 1, 2, 2, 2, 2, 6, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 6, 4, 21, 22, 23, 21, 7, 0, 4, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 7, @@ -47,7 +47,7 @@ let level = { pos: { x: 8 * tileSize, y: 2 * tileSize }, texture: "Ladder", action: (_player, level) => { - level.switch = { module: "./src/levels/1-1 copy.js", pos: 0 }; + level.switch = { module: __dirname + "/1-1 copy.js", pos: 0 }; }, key: "1-1_1" } diff --git a/src/screens/game.js b/src/screens/game.js new file mode 100644 index 0000000..c37e9d8 --- /dev/null +++ b/src/screens/game.js @@ -0,0 +1,110 @@ +const asdf = require("asdf-games"); +// eslint-disable-next-line no-unused-vars +const { Container, Camera } = asdf; + +const debugMode = true; + +const Stats = require(__dirname + "/../helpers/stats.js"); +var Player = require(__dirname + "/../entities/player.js"); +var Level = require(__dirname + "/../helpers/level.js"); + +class GameScreen extends Container { + constructor(game, window, keys, onGameOver) { + super(); + + this.window = window; + this.keys = keys; + this.onGameOver = onGameOver; + + // Initialise first level 1-1.js at startPosition 0 + var player = new Player(keys, window); + + var level = new Level(require(__dirname + "/../levels/1-1.js"), keys, player); + player.pos.x = level.startPos[0].x / 1; + player.pos.y = level.startPos[0].y / 1; + player.level = level; + + var camera = new Camera(player, window, { w: level.w * 2, h: level.h * 2 }); + var stats = new Stats(player); + + this.add(camera); + camera.add(level); + camera.add(player); + this.add(stats); + + this.camera = camera; + this.player = player; + this.level = level; + this.stats = stats; + } + + switchLevel(module, pos = 0) { + var { camera, player, level, stats, keys } = this; + + camera.map(function(e) { + camera.remove(e); + if (e instanceof Level) { + var lives = player.lives; + var items = player.items; + + var p = new Player(keys, window); + player = p; + + e = new Level(module, keys, player); + level = e; + + player.pos.x = level.startPos[pos].x / 1; + player.pos.y = level.startPos[pos].y / 1; + + player.lives = lives; + player.items = items; + player.level = e; + + stats.player = player; + + camera.add(e); + camera.worldSize = { w: e.w, h: e.h }; + + camera.add(player); + camera.setSubject(player); + } + }); + + this.player = player; + this.level = level; + this.stats = stats; + this.camera = camera; + } + + update(dt, t) { + super.update(dt, t); + var { camera, player, level, keys } = this; + + // Debug options + if (debugMode && keys.ctrl && keys.key(66)) { + console.debug(level); + console.debug(player); + } + + if (player.lives <= 0) { + this.onGameOver(); + } + + // Switch to another level + if (level.switch) { + if (debugMode) { + console.debug("Switching level!", level); + } + this.switchLevel(require(level.switch.module), level.switch.pos); + level.switch = undefined; + } + + // Refocus camera to player when player is moved by a portal + if (player.refocus) { + camera.setSubject(player); + player.refocus = false; + } + } +} + +module.exports = GameScreen; \ No newline at end of file diff --git a/src/screens/gameover.js b/src/screens/gameover.js new file mode 100644 index 0000000..4bdc639 --- /dev/null +++ b/src/screens/gameover.js @@ -0,0 +1,36 @@ +const asdf = require("asdf-games"); +// eslint-disable-next-line no-unused-vars +const { Texture, Text, Container, Sprite } = asdf; + +const text = require(__dirname + "/../../res/lang/default.js"); +const fillStyle = {fill: "#ffffff", font: "24px Arial"}; + +class GameOver extends Container { + constructor(game, keys, onEnd) { + super(); + this.game = game; + this.keys = keys; + this.onEnd = onEnd; + + this.children = []; + + var gameover = new Text(text.gameOver.dead, {fill: "#ffffff", font: "32px Arial"}); + gameover.pos = { x: 200, y: 200 }; + this.add(gameover); + + var instruction = new Text(text.gameOver.instruction, fillStyle); + instruction.pos = { x: 200, y: 236 }; + this.add(instruction); + } + + update(dt, t) { + super.update(dt, t); + + if (this.keys.action) { + this.onEnd(); + } + + } +} + +module.exports = GameOver; \ No newline at end of file diff --git a/src/screens/logo.js b/src/screens/logo.js new file mode 100644 index 0000000..b289d87 --- /dev/null +++ b/src/screens/logo.js @@ -0,0 +1,40 @@ +const asdf = require("asdf-games"); +// eslint-disable-next-line no-unused-vars +const { Texture, Text, Container, Sprite } = asdf; + +const text = require(__dirname + "/../../res/lang/default.js"); +const fillStyle = {fill: "#ffffff", font: "24px Arial"}; + +class Logo extends Container { + constructor(game, onEnd) { + super(); + this.game = game; + this.onEnd = onEnd; + + this.children = []; + + const textPos = { x: 200, y: 150 }; + for (let index = 0; index < text.logoScreen.length; index++) { + const element = new Text(text.logoScreen[index], fillStyle); + element.pos = { + x: textPos.x, + y: textPos.y + 24 * index + }; + this.add(element); + } + + this.lifetime = 2; + } + + update(dt, t) { + super.update(dt, t); + + if (this.lifetime <= 0) { + this.onEnd(); + } else { + this.lifetime -= dt; + } + } +} + +module.exports = Logo; \ No newline at end of file diff --git a/src/screens/title.js b/src/screens/title.js new file mode 100644 index 0000000..b55fc96 --- /dev/null +++ b/src/screens/title.js @@ -0,0 +1,51 @@ +const asdf = require("asdf-games"); +// eslint-disable-next-line no-unused-vars +const { Texture, Container, Sprite, Text } = asdf; + +const text = require(__dirname + "/../../res/lang/default.js"); +const fillStyle = {fill: "#ffffff", font: "24px Arial"}; + +class Title extends Container { + constructor(game, keys, onStart, onTutorial, onQuit) { + super(); + this.game = game; + this.keys = keys; + + this.onStart = onStart; + this.onTutorial = onTutorial; + this.onQuit = onQuit; + + this.keys.reset(); + + this.children = []; + + const textPos = { x: 200, y: 200 }; + for (let index = 0; index < text.titleScreen.instructions.length; index++) { + const element = new Text(text.titleScreen.instructions[index], fillStyle); + element.pos = { + x: textPos.x, + y: textPos.y + 28 * index + }; + this.add(element); + } + } + + update(dt, t) { + super.update(dt, t); + + if (this.keys.action) { + this.onStart(); + } + + if (this.keys.key(84)) { + this.onTutorial(); + } + + if (this.keys.key(81)) { + this.onQuit(); + } + + } +} + +module.exports = Title; \ No newline at end of file diff --git a/src/screens/tutorial.js b/src/screens/tutorial.js new file mode 100644 index 0000000..74e300c --- /dev/null +++ b/src/screens/tutorial.js @@ -0,0 +1,38 @@ +const asdf = require("asdf-games"); +// eslint-disable-next-line no-unused-vars +const { Texture, Container, Text, Sprite } = asdf; + +const text = require(__dirname + "/../../res/lang/default.js"); +const fillStyle = {fill: "#ffffff", font: "20px Arial"}; + +class Tutorial extends Container { + constructor(game, keys, onEnd) { + super(); + this.game = game; + this.keys = keys; + this.onEnd = onEnd; + + this.children = []; + + const textPos = { x: 50, y: 150 }; + for (let index = 0; index < text.tutorial.length; index++) { + const element = new Text(text.tutorial[index], fillStyle); + element.pos = { + x: textPos.x, + y: textPos.y + 24 * index + }; + this.add(element); + } + } + + update(dt, t) { + super.update(dt, t); + + if (this.keys.action) { + this.onEnd(); + } + + } +} + +module.exports = Tutorial; \ No newline at end of file