From 435b24cb6a31d56c42e58fc2e0c3c2ca689f8d05 Mon Sep 17 00:00:00 2001 From: asraelite Date: Fri, 2 Mar 2018 19:37:24 +0000 Subject: [PATCH] Add logo to main menu --- dist/img/logo.png | Bin 0 -> 24387 bytes dist/index.html | 6 +++--- index.html | 16 ---------------- js/assets.mjs | 28 ++++++++++++++++++++++++++++ js/game.mjs | 4 +++- js/graphics/draw.mjs | 10 ++++++++++ js/graphics/gui.mjs | 22 ++++++++++++++++++---- js/graphics/index.mjs | 5 +++++ js/gui/button.mjs | 1 + js/gui/element.mjs | 22 ++++++++++++++++++++-- js/gui/frame.mjs | 1 + js/gui/image.mjs | 26 ++++++++++++++++++++++++++ js/gui/index.mjs | 10 +++++++++- js/gui/misc.mjs | 11 ----------- js/gui/modules.mjs | 13 +++++++++++-- 15 files changed, 135 insertions(+), 40 deletions(-) create mode 100644 dist/img/logo.png delete mode 100644 index.html create mode 100644 js/graphics/draw.mjs create mode 100644 js/gui/image.mjs diff --git a/dist/img/logo.png b/dist/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..05549b348309f32daffd83b1fcf4bd9e2d3e21ed GIT binary patch literal 24387 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 literal 0 HcmV?d00001 diff --git a/dist/index.html b/dist/index.html index aa4dd6d..8ad5c42 100644 --- a/dist/index.html +++ b/dist/index.html @@ -2,9 +2,9 @@ - - - + + +
diff --git a/index.html b/index.html deleted file mode 100644 index 8ad5c42..0000000 --- a/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - -
- - -
- - - diff --git a/js/assets.mjs b/js/assets.mjs index e69de29..d84a1b7 100644 --- a/js/assets.mjs +++ b/js/assets.mjs @@ -0,0 +1,28 @@ +export const images = { + title: { + logo: 'logo.png' + } +}; + +export const audio = {}; + +export async function init() { + let parse = (obj, convert) => Object.entries(obj).forEach(([k, v]) => { + typeof v == 'object' ? parse(v, convert) : obj[k] = convert(v); + }); + + let promises = []; + parse(images, str => { + let img = new Image(); + img.src = 'img/' + str; + promises.push(new Promise((res, rej) => { + img.addEventListener('load', res); + })); + return img; + }); + parse(audio, str => { + // TODO: Load audio. + }); + + await Promise.all(promises); +} diff --git a/js/game.mjs b/js/game.mjs index 8acdef2..9fa7cf9 100644 --- a/js/game.mjs +++ b/js/game.mjs @@ -1,5 +1,6 @@ import * as graphics from './graphics/index.mjs'; import * as gui from './gui/index.mjs'; +import * as assets from './assets.mjs'; export let game; @@ -12,12 +13,13 @@ export async function init() { }; graphics.init(); + await assets.init(); gui.init(); // Recursive `requestAnimationFrame` can cause problems with Parcel. while(true) { await tick(); - await new Promise(res => requestAnimationFrame(res)); + await new Promise(res => requestAnimationFrame(()=>{})); } } diff --git a/js/graphics/draw.mjs b/js/graphics/draw.mjs new file mode 100644 index 0000000..1602930 --- /dev/null +++ b/js/graphics/draw.mjs @@ -0,0 +1,10 @@ +import {canvas, context} from './index.mjs'; + +export function text(string, x, y, + {font = '52pt Arial', align = 'left', valign = 'top'}) { + context.textAlign = align; + context.textBaseline = valign; + context.font = font; + + context.fillText(string, x, y); +} diff --git a/js/graphics/gui.mjs b/js/graphics/gui.mjs index 1b02a26..2eb9976 100644 --- a/js/graphics/gui.mjs +++ b/js/graphics/gui.mjs @@ -1,10 +1,24 @@ +import {canvas, context} from './index.mjs'; import * as gui from '../gui/index.mjs'; export function render() { - + renderElement(gui.root); } -export function renderFrame(frame) { - context.fillStyle = '#eb9'; - context.fillRect(frame.x, frame.y, frame.w, frame.h); +function renderElement(element) { + //console.log(element.options); + if (element.options.draw) { + if (element.type == 'frame') renderFrame(element); + if (element.type == 'image') renderImage(element); + } + element.children.forEach(renderElement); +} + +function renderFrame(element) { + context.fillStyle = '#eb9'; + context.fillRect(...element.shape); +} + +function renderImage(element) { + context.drawImage(element.image, ...element.shape); } diff --git a/js/graphics/index.mjs b/js/graphics/index.mjs index 5d1e9bb..e854989 100644 --- a/js/graphics/index.mjs +++ b/js/graphics/index.mjs @@ -2,6 +2,7 @@ import {game} from '../game.mjs'; import {getContainedSectors} from '../world/index.mjs'; import * as background from './background.mjs'; import * as gui from './gui.mjs'; +import * as draw from './draw.mjs'; export let canvas, context, tempCanvas, tempContext; export let view; @@ -21,10 +22,14 @@ export function init() { y: 0, zoom: 1 } + + draw.text('Loading...', canvas.width / 2, canvas.height / 2, + { align: 'center', valign: 'middle' }); } export function render() { context.clearRect(0, 0, canvas.width, canvas.height); + context.fillStyle = '#000'; context.fillRect(0, 0, canvas.width, canvas.height); context.save(); diff --git a/js/gui/button.mjs b/js/gui/button.mjs index 6f5ed43..ce99954 100644 --- a/js/gui/button.mjs +++ b/js/gui/button.mjs @@ -4,5 +4,6 @@ export class GuiButton extends gui.GuiElement { constructor(x, y, text, onclick) { let textSize = gui.measureText(text, 'Arial 14pt'); super(x, y, ...textSize); + this.type = 'button'; } } diff --git a/js/gui/element.mjs b/js/gui/element.mjs index ba13b2a..b6e62cd 100644 --- a/js/gui/element.mjs +++ b/js/gui/element.mjs @@ -3,7 +3,7 @@ const defaultOptions = { } export default class GuiElement { - constructor(x, y, w, h, options) { + constructor(x, y, w, h, options = {}) { this.x = x; this.y = y; this.w = w; @@ -11,7 +11,9 @@ export default class GuiElement { this.children = new Set(); this.parent = null; - this.options = Object.assign(options, defaultOptions); + this.type = 'element'; + + this.options = Object.assign({}, defaultOptions, options); } append(element) { @@ -22,4 +24,20 @@ export default class GuiElement { clear() { this.children.clear(); } + + get shape() { + return [this.x, this.y, this.w, this.h]; + } + + posRelative({x = null, xc = 0, y = null, yc = 0, w = null, h = null}) { + if (x !== null) { + this.x = (this.parent.w * x) - (this.w * xc); + } + if (y !== null) + this.y = (this.parent.h * y) - (this.h * yc); + if (w !== null) + this.w = this.parent.w * w; + if (h !== null) + this.h = this.parent.h * h; + } } diff --git a/js/gui/frame.mjs b/js/gui/frame.mjs index 484933e..5fac4ce 100644 --- a/js/gui/frame.mjs +++ b/js/gui/frame.mjs @@ -4,5 +4,6 @@ import GuiElement from './element.mjs'; export default class GuiFrame extends GuiElement { constructor(x, y, w, h, options) { super(x, y, w, h, options); + this.type = 'frame'; } } diff --git a/js/gui/image.mjs b/js/gui/image.mjs new file mode 100644 index 0000000..7f67a80 --- /dev/null +++ b/js/gui/image.mjs @@ -0,0 +1,26 @@ +import * as gui from './index.mjs'; +import GuiElement from './element.mjs'; + +export class GuiImage extends GuiElement { + constructor(src, x, y, w, h) { + w = w || src.width; + h = h || src.height; + super(x, y, w, h); + this.type = 'image'; + this.image = src; + this.imgRatio = src.width / src.height; + } + + scaleImage({ w = null, h = null }) { + if (w !== null && h === null) { + this.w = w; + this.h = w / this.imgRatio; + } else if (h !== null && w === null) { + this.h = h; + this.w = h / this.imgRatio; + } else if ( h !== null && w !== null) { + this.w = w; + this.h = h; + } + } +} diff --git a/js/gui/index.mjs b/js/gui/index.mjs index 5ec1b48..86865b3 100644 --- a/js/gui/index.mjs +++ b/js/gui/index.mjs @@ -7,7 +7,15 @@ export let root; export function init() { elements.clear(); root = modules.root(); - console.log(root); + changeView('title'); +} + +export function changeView(view) { + root.clear(); + + if (view == 'title') { + root.append(modules.title()); + } } export function measureText(msg, font) { diff --git a/js/gui/misc.mjs b/js/gui/misc.mjs index 9fd83a3..e69de29 100644 --- a/js/gui/misc.mjs +++ b/js/gui/misc.mjs @@ -1,11 +0,0 @@ -import * as gui from './index.mjs'; -import GuiElement from './element.mjs'; - -export class GuiImage extends gui.GuiElement { - constructor(src, x, y, w, h) { - w = w || src.width; - h = h || src.height; - super(x, y, w, h); - this.image = src; - } -} diff --git a/js/gui/modules.mjs b/js/gui/modules.mjs index 195b543..e2164ea 100644 --- a/js/gui/modules.mjs +++ b/js/gui/modules.mjs @@ -1,6 +1,8 @@ import * as gui from './index.mjs'; +import {images as assets} from '../assets.mjs'; import {canvas} from '../graphics/index.mjs'; import GuiFrame from './frame.mjs'; +import {GuiImage} from './image.mjs'; export function root() { return new GuiFrame(0, 0, canvas.width, canvas.height, { @@ -8,6 +10,13 @@ export function root() { }); } -export function titleScreen() { - +export function title() { + let shadow = root(); + let logo = new GuiImage(assets.title.logo); + shadow.append(logo); + logo.scaleImage({ w: shadow.w * 0.7 }); + logo.posRelative({ x: 0.5, xc: 0.5, y: 0.2 }); + console.log(logo); + + return shadow; }