From d85338d9f2d05ed8804e6cb41fd1a56173b95c0a Mon Sep 17 00:00:00 2001 From: asraelite Date: Sun, 4 Mar 2018 12:50:52 +0000 Subject: [PATCH] Add landing physics --- dist/img/celestials/green_0.svg | 21 ++++++++++++--------- dist/improcket.min.js.map | 1 + js/world/body.mjs | 15 +++++++++------ js/world/particle.mjs | 2 +- js/world/ship.mjs | 15 ++++++++++++++- rollup | 2 +- 6 files changed, 38 insertions(+), 18 deletions(-) create mode 100644 dist/improcket.min.js.map diff --git a/dist/img/celestials/green_0.svg b/dist/img/celestials/green_0.svg index 6d07600..2d16b4b 100644 --- a/dist/img/celestials/green_0.svg +++ b/dist/img/celestials/green_0.svg @@ -9,13 +9,16 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="171.14644mm" - height="170.95152mm" - viewBox="0 0 171.14644 170.95152" + width="170.14249mm" + height="169.9458mm" + viewBox="0 0 170.14249 169.9458" version="1.1" id="svg8" inkscape:version="0.92.2 5c3e80d, 2017-08-06" - sodipodi:docname="green_0.svg"> + sodipodi:docname="green_0.svg" + inkscape:export-filename="/home/asraelite/code/js/improcket/dist/img/celestials/green_0.png" + inkscape:export-xdpi="151.97278" + inkscape:export-ydpi="151.97278"> + transform="translate(24.791868,-146.70324)"> @@ -61,7 +64,7 @@ transform="translate(-2.2678571,1.5119048)" style="stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none"> Object.entries(obj).forEach(([k, v]) => {\n\t\ttypeof v == 'object' ? parse(v, convert) : obj[k] = convert(v);\n\t});\n\n\tlet promises = [];\n\tparse(images, str => {\n\t\tlet img = new Image();\n\t\timg.src = 'img/' + str;\n\t\tpromises.push(new Promise((res, rej) => {\n\t\t\timg.addEventListener('load', res);\n\t\t}));\n\t\treturn img;\n\t});\n\tparse(audio, str => {\n\t\t// TODO: Load audio.\n\t});\n\n\tawait Promise.all(promises);\n}\n","import {canvas} from './graphics/index.mjs';\n\nexport const mouse = { pressed: {}, held: {}, x: 0, y: 0, scroll: 0 };\nexport const keyCode = { pressed: {}, held: {} };\nexport const key = { pressed: {}, held: {} };\nexport const action = {};\n\nconst mapping = {};\n\nexport function tick() {\n\tmouse.pressed = {};\n\tkeyCode.pressed = {};\n\tkey.pressed = {};\n\tmouse.scroll = 0;\n}\n\nexport function init() {\n\twindow.addEventListener('keydown', event => {\n\t\tkeyCode.pressed[event.code] = !keyCode.held[event.code];\n\t\tkeyCode.held[event.code] = true;\n\t\tkey.pressed[event.key] = !keyCode.held[event.key];\n\t\tkey.held[event.key] = true;\n\t});\n\n\twindow.addEventListener('keyup', event => {\n\t\tkeyCode.pressed[event.code] = false;\n\t\tkeyCode.held[event.code] = false;\n\t\tkey.pressed[event.key] = false;\n\t\tkey.held[event.key] = false;\n\t});\n\t// Ṕ͕͖ẖ̨’̖̺͓̪̹n̼͇͔̯̝̖g̙̩̭͕ͅͅl̻̰͘u͎̥͍̗ͅi̼̞̪̩͚̜͖ ̫̝̻͚͟m͎̳̙̭̩̩̕g̟̤̬̮l̫̕w̶͚͈͚̟͔’͖n͏̝͖̞̺ͅa͏̹͓̬̺f̗̬̬̬̖̫͜h͙̘̝̱̬̗͜ ̼͎͖C̱͔̱͖ṭ̬̱͖h̵̰̼̘̩ùlh̙́u̪̫ ̪̺̹̙̯R̞͓̹̞’͍͎͉͎̦͙ͅl͇̠̮y̙̪̰̪͙̖e̢̩͉͙̼h̗͔̹̳ ̶w̨̼͍̝̭̣̣ͅg̶̳̦̳a̴͉̹͙̭̟ͅh͈͎̞̜͉́’̼̜̠͞n̲a̯g̮͚͓̝l̠ ̹̹̱͙̝f̧̝͖̱h̪̟̻͖̖t͎͘aͅg̤̘͜n̶͈̻̻̝̳\n\twindow.addEventListener('mousedown', event => {\n\t\tmouse.pressed[event.button] = !mouse.held[event.button];\n\t\tmouse.held[event.button] = true;\n\t});\n\n\twindow.addEventListener('mouseup', event => {\n\t\tmouse.pressed[event.button] = false;\n\t\tmouse.held[event.button] = false;\n\t});\n\n\twindow.addEventListener('mousemove', event => {\n\t\tlet rect = canvas.getBoundingClientRect();\n\t\tmouse.x = event.clientX - rect.left;\n\t\tmouse.y = event.clientY - rect.top;\n\t});\n\n\twindow.addEventListener('wheel', event => {\n\t\tmouse.scroll = event.deltaY;\n\t});\n}\n","import * as input from '../input.mjs';\n\nexport class Rect {\n\tconstructor(x = 0, y = 0, w = 0, h = 0) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.w = w;\n\t\tthis.h = h;\n\n\t\tthis.onclick = null;\n\t\tthis.mouseHeld = false;\n\t}\n\n\ttickMouse() {\n\t\tif (this.mouseHeld == true && !input.mouse.held[0] && this.mouseOver)\n\t\t\tif (this.onclick !== null)\n\t\t\t\tthis.onclick();\n\t\tif (!this.mouseHeld && input.mouse.pressed[0] && this.mouseOver)\n\t\t\tthis.mouseHeld = true;\n\t\tif (!input.mouse.held[0])\n\t\t\tthis.mouseHeld = false;\n\t}\n\n\tget shape() {\n\t\treturn [this.x, this.y, this.w, this.h];\n\t}\n\n\tget center() {\n\t\treturn [this.x + this.w / 2, this.y + this.h / 2];\n\t}\n\n\tget mouseOver() {\n\t\treturn this.containsPoint(input.mouse.x, input.mouse.y);\n\t}\n\n\tget mouseClicked() {\n\t\treturn this.mouseOver() && input.mouse.pressed[0];\n\t}\n\n\tcontainsPoint(x, y) {\n\t\treturn x > this.x && x < this.x + this.w\n\t\t\t&& y > this.y && y < this.y + this.h;\n\t}\n}\n","import {Rect} from './misc.mjs';\n\nconst defaultOptions = {\n\tdraw: true // Whether the element itself will be rendered.\n}\n\nexport default class GuiElement extends Rect {\n\tconstructor(x, y, w, h, options = {}) {\n\t\tsuper(x, y, w, h);\n\t\tthis.children = new Set();\n\t\tthis.parent = null;\n\n\t\tthis.type = 'element';\n\n\t\tthis.options = Object.assign({}, defaultOptions, options);\n\t}\n\n\ttick() {\n\t\tthis.tickMouse();\n\t\tthis.children.forEach(c => c.tick());\n\t}\n\n\tappend(element) {\n\t\tthis.children.add(element);\n\t\telement.parent = this;\n\t}\n\n\tclear() {\n\t\tthis.children.clear();\n\t}\n\t// Code should be self-describing, comments are for fucking about.\n\t// - Albert Einstein\n\n\tposRelative({x = null, xc = 0, y = null, yc = 0, w = null, h = null}) {\n\t\tif (x !== null) {\n\t\t\tthis.x = (this.parent.w * x) - (this.w * xc);\n\t\t}\n\t\tif (y !== null)\n\t\t\tthis.y = (this.parent.h * y) - (this.h * yc);\n\t\tif (w !== null)\n\t\t\tthis.w = this.parent.w * w;\n\t\tif (h !== null)\n\t\t\tthis.h = this.parent.h * h;\n\t}\n}\n","import * as gui from './index.mjs';\nimport GuiElement from './element.mjs';\n\nexport default class GuiFrame extends GuiElement {\n\tconstructor(x, y, w, h, options) {\n\t\tsuper(x, y, w, h, options);\n\t\tthis.type = 'frame';\n\t}\n}\n","import * as gui from './index.mjs';\nimport GuiElement from './element.mjs';\n\nexport default class GuiImage extends GuiElement {\n\tconstructor(src, x, y, w, h) {\n\t\tw = w || src.width;\n\t\th = h || src.height;\n\t\tsuper(x, y, w, h);\n\t\tthis.type = 'image';\n\t\tthis.image = src;\n\t\tthis.imgRatio = src.width / src.height;\n\t}\n\n\tscaleImage({ w = null, h = null }) {\n\t\tif (w !== null && h === null) {\n\t\t\tthis.w = w;\n\t\t\tthis.h = w / this.imgRatio;\n\t\t} else if (h !== null && w === null) {\n\t\t\tthis.h = h;\n\t\t\tthis.w = h / this.imgRatio;\n\t\t} else if ( h !== null && w !== null) {\n\t\t\tthis.w = w;\n\t\t\tthis.h = h;\n\t\t}\n\t}\n}\n","import * as gui from './index.mjs';\nimport GuiElement from './element.mjs';\n\nexport default class GuiButton extends GuiElement {\n\tconstructor(text, onclick, x, y, w = 100, h = 30) {\n\t\tsuper(x, y, w, h);\n\t\tthis.type = 'button';\n\t\tthis.text = text;\n\t\tthis.onclick = onclick;\n\t}\n}\n","/*\n *\tConstants that do not change during gameplay.\n *\tThis can kind of be treated like a configuration file, I guess.\n *\n *\tAll le\n */\n\n// Unit length of sector. Only for internal representation.\nexport const SECTOR_SIZE = 512;\n// Star count per sector.\nexport const STAR_DENSITY = (SECTOR_SIZE ** 2) / 10000;\n// G, G-boy, The big G, Mr. G, g's big brother, G-dog\nexport const GRAVITATIONAL_CONSTANT = 0.01;\n// Perspective constraints. Higher zoom value = closer.\nexport const MIN_ZOOM = 1;\nexport const MAX_ZOOM = 100;\nexport const DEFAULT_ZOOM = 10;\nexport const ZOOM_SPEED = 0.01;\n","import {images as assets} from '../assets.mjs';\n\nexport default class Module {\n\tconstructor(x, y, ship, {\n\t\tname = 'Unnamed Module',\n\t\ttype = 'block',\n\t\tid = 'unknown',\n\t\tmass = 1,\n\t\t// Fuel\n\t\tfilled = false,\n\t\tfuelCapacity = 0,\n\t\t...properties\n\t}) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.name = name;\n\t\tthis.type = type;\n\t\tthis.mass = mass;\n\t\tthis.ship = ship;\n\t\tthis.id = id;\n\t\tthis.images = assets.modules[this.type][this.id];\n\t\t// Fuel\n\t\tif (this.type == 'fuel') {\n\t\t\tthis.fuel = filled ? fuelCapacity : 0;\n\t\t} else if (this.type == 'thruster') {\n\t\t\tthis.power = 0;\n\t\t}\n\t}\n\n\treset() {\n\t\tif (this.type == 'thruster') {\n\t\t\tthis.power = 0;\n\t\t}\n\t}\n\n\tget com() {\n\t\treturn this.ship.getWorldPoint(...this.localCom);\n\t}\n\n\tget currentImage() {\n\t\tif (this.type == 'thruster') {\n\t\t\treturn this.power > 0 ? this.images.on : this.images.off;\n\t\t} else {\n\t\t\treturn this.images;\n\t\t}\n\t}\n\n\tget localCom() {\n\t\treturn [this.x + 0.5, this.y + 0.5];\n\t}\n}\n","import {GRAVITATIONAL_CONSTANT as G} from '../consts.mjs';\n\nexport default class Body {\n\tconstructor(x, y, mass) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.r = 0;\n\t\tthis.xvel = 0;\n\t\tthis.yvel = 0;\n\t\tthis.rvel = 0;\n\t\tthis.rfriction = 0.9;\n\t\tthis.mass = mass;\n\t}\n\n\tget com() {\n\t\treturn [this.x, this.y];\n\t}\n\n\tget pos() {\n\t\treturn [this.x, this.y];\n\t}\n\n\tget speed() {\n\t\treturn Math.sqrt(this.xvel ** 2 + this.yvel ** 2);\n\t}\n\n\tgetWorldPoint(lx, ly) {\n\t\tlet [cx, cy] = this.localCom;\n\t\tlet [nx, ny] = this.rotateVector(lx - cx, ly - cy, this.r);\n\t\treturn [nx + this.x + cx, ny + this.y + cy];\n\t}\n\n\tgetLocalPoint(wx, wy) {\n\t\tlet [lx, ly] = [wx - this.x, wy - this.y];\n\t\tlet [cx, cy] = this.localCom;\n\t\tlet [nx, ny] = this.rotateVector(lx, ly, -this.r);\n\t\treturn [nx - cx, ny - cy];\n\t}\n\n\trotateVector(x, y, r = this.r) {\n\t\treturn [(x * Math.cos(r) - y * Math.sin(r)),\n\t\t\t(y * Math.cos(r) - x * Math.sin(r))];\n\t}\n\n\trelativeVector(x, y) {\n\t\treturn this.rotateVector(x, y, this.r);\n\t}\n\n\ttickMotion() {\n\t\tthis.x += this.xvel;\n\t\tthis.y += this.yvel;\n\t\tthis.r += this.rvel;\n\t\tthis.rvel *= this.rfriction;\n\t}\n\n\ttickGravity(bodies) {\n\t\tbodies.forEach(b => {\n\t\t\tlet force = b.mass / this.mass / (this.distanceTo(b) ** 2) * G;\n\t\t\tlet [[ax, ay], [bx, by]] = [this.com, b.com];\n\t\t\tlet angle = Math.atan2(by - ay, bx - ax);\n\t\t\tthis.xvel += Math.cos(angle) * force;\n\t\t\tthis.yvel += Math.sin(angle) * force;\n\t\t});\n\t}\n\n\tdistanceTo(body) {\n\t\tlet [[ax, ay], [bx, by]] = [this.com, body.com];\n\t\treturn Math.max(Math.sqrt(((bx - ax) ** 2) +\n\t\t\t((by - ay) ** 2)), 1);\n\t}\n\n\tangleTo(ax, ay, bx, by) {\n\t\treturn Math.atan2(by - ay, bx - ax);\n\t}\n\n\tapproach(body, distance) {\n\t\tlet [[ax, ay], [bx, by]] = [this.com, body.com];\n\t\tlet angle = Math.atan2(by - ay, bx - ax);\n\t\tthis.x += Math.cos(angle) * distance;\n\t\tthis.y += Math.sin(angle) * distance;\n\t}\n\n\thalt() {\n\t\tthis.xvel = 0;\n\t\tthis.yvel = 0;\n\t}\n\n\tapplyDirectionalForce(x, y, r) {\n\t\tlet [vx, vy] = this.rotateVector(x, y);\n\t\tthis.xvel += vx;\n\t\tthis.yvel += vy;\n\t\tthis.rvel += r / this.mass;\n\t}\n}\n","import Body from './body.mjs';\nimport {celestials, particles} from './index.mjs';\n\nexport function createThrustExhaust(thruster) {\n\tlet ship = thruster.ship;\n\tlet [fx, fy] = ship.relativeVector(0, 0.2);\n\tlet [dx, dy] = ship.relativeVector((Math.random() - 0.5) * 0.5, 0.5);\n\tlet [cx, cy] = thruster.com;\n\tparticles.add(new Particle(cx + dx, cy + dy, {\n\t\txvel: ship.xvel + fx,\n\t\tyvel: ship.yvel + fy,\n\t\tcolor: '#f4c542',\n\t\tlifetime: 5,\n\t\tsize: 0.07\n\t}));\n}\n\nclass Particle extends Body {\n\tconstructor(x, y, {\n\t\txvel = 0,\n\t\tyvel = 0,\n\t\tspray = 0.1,\n\t\tfizzle = 0,\n\t\tmaxFizzle = fizzle * 2,\n\t\tcolor = '#fff',\n\t\tgravity = false,\n\t\tlifetime = 50,\n\t\tsize = 0.1,\n\t\tfriction = 0.99\n\t}) {\n\t\tsuper(x, y, 0.1);\n\n\t\tthis.size = size;\n\t\tthis.xvel = xvel + (Math.random() - 0.5) * spray;\n\t\tthis.yvel = yvel + (Math.random() - 0.5) * spray;\n\t\tthis.friction = friction;\n\t\tthis.fizzle = fizzle;\n\t\tthis.maxFizzle = maxFizzle;\n\t\tthis.color = color;\n\t\tthis.gravity = gravity;\n\t\tthis.life = lifetime;\n\t}\n\n\tget com() {\n\t\treturn [this.x - this.size / 2, this.y - this.size / 2];\n\t}\n\n\ttick() {\n\t\tif (!this.life--) {\n\t\t\tparticles.delete(this);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.tickMotion();\n\t\tif (this.gravity) this.tickGravity(celestials);\n\n\t\tthis.xvel *= this.friction;\n\t\tthis.yvel *= this.friction;\n\t\tthis.x += (Math.random() - 0.5) * this.fizzle;\n\t\tthis.y += (Math.random() - 0.5) * this.fizzle;\n\t\tif (this.fizzle < this.mazFizzle) this.fizzle *= 1.05;\n\t}\n}\n","import Module from './module.mjs';\nimport Body from './body.mjs';\nimport * as world from './index.mjs';\nimport * as particle from './particle.mjs';\n\nexport default class Ship extends Body {\n\tconstructor(x, y) {\n\t\tsuper(x, y, 0);\n\n\t\tthis.localCom = [0, 0];\n\t\tthis.modules = new Set();\n\t\tthis.maxRadius = 0;\n\t}\n\n\tget com() {\n\t\tlet [lx, ly] = this.localCom;\n\t\treturn [this.x + lx, this.y + ly];\n\t}\n\n\ttick() {\n\t\tthis.tickMotion();\n\t\tthis.tickGravity(world.celestials);\n\t\tthis.resolveCollisions();\n\n\t\tthis.modules.forEach(m => {\n\t\t\tif (m.type == 'thruster' && m.power !== 0) {\n\t\t\t\tfor (let i = 0; i < 2; i++) particle.createThrustExhaust(m);\n\t\t\t}\n\t\t});\n\n\t\tthis.modules.forEach(m => m.reset());\n\t}\n\n\taddModule(x, y, properties, options) {\n\t\tlet module = new Module(x, y, this, {...properties, ...options});\n\t\tthis.modules.add(module);\n\t\tthis.refreshShape();\n\t}\n\n\tdeleteModule(module) {\n\t\tthis.modules.delete(module);\n\t\tthis.refreshShape();\n\t}\n\n\trefreshShape() {\n\t\tlet points = [];\n\t\tthis.modules.forEach(m => points.push([...m.localCom, m.mass]));\n\t\tthis.mass = points.reduce((a, [,,b]) => a + b, 0);\n\t\tthis.localCom = points.reduce(([ax, ay], [bx, by, bm]) =>\n\t\t\t[ax + bx * bm, ay + by * bm], [0, 0])\n\t\t\t.map(x => x / this.mass);\n\t\tlet [lx, ly] = this.localCom;\n\t\tthis.maxRadius = points.reduce((a, [bx, by]) =>\n\t\t\tMath.max(Math.sqrt((bx - lx) ** 2 + (by - ly) ** 2), a), 0) + 1;\n\t}\n\n\tresolveCollisions() {\n\t\tworld.celestials.forEach(c => {\n\t\t\tlet dis = this.distanceTo(c);\n\n\t\t\tif (dis < c.radius + this.maxRadius) {\n\t\t\t\tthis.modules.forEach(m => {\n\t\t\t\t\tthis.checkModuleCollision(m, c);\n\t\t\t\t});\n\t\t\t}\n\t\t})\n\t}\n\n\tresolveCelestialCollision(pos, cel) {\n\t\t//debugger;\n\t\tlet theta = this.angleTo(...this.com, ...cel.com);\n\t\tlet angleToCom = this.angleTo(...this.com, ...pos);\n\t\tlet angle = angleToCom - theta;\n\t\tlet [force] = this.rotateVector(0, 1, angle);\n\t\tif (Math.abs(angle) < 0.3) {\n\t\t\tforce *= -1;\n\t\t}\n\t\tthis.rvel -= force * 0.015;\n\t}\n\n\tcheckModuleCollision(module, body) {\n\t\tlet p = this.getWorldPoint(...module.localCom);\n\t\tlet dis = body.distanceTo({ com: p });\n\t\tif (dis < body.radius + 0.5) {\n\t\t\tthis.approach(body, dis - (body.radius + 0.5));\n\t\t\tthis.halt();\n\t\t\tthis.resolveCelestialCollision(p, body);\n\t\t}\n\t}\n\n\tapplyThrust({ forward = 0, left = 0, right = 0, back = 0,\n\t\tturnLeft = 0, turnRight = 0}) {\n\t\tlet turnForce = (turnRight - turnLeft) / 20;\n\t\tthis.applyDirectionalForce(0, -forward / 30, turnForce);\n\n\t\tthis.modules.forEach(m => {\n\t\t\tif (m.type !== 'thruster') return;\n\t\t\tm.power = forward;\n\t\t});\n\n\t}\n}\n","import {images as assets} from '../assets.mjs';\nimport Body from './body.mjs';\n\nexport default class Celestial extends Body {\n\tconstructor(x, y, radius, {\n\t\tdensity = 1,\n\t\ttype = 'rock'\n\t}) {\n\t\tlet mass = (radius ** 2) * density\n\t\tsuper(x, y, mass);\n\t\tthis.radius = radius;\n\n\t\tthis.type = type;\n\t\tlet imageArr = Object.values(assets.celestials[this.type]);\n\t\tthis.image = imageArr[Math.random() * imageArr.length | 0];\n\t}\n\n\tget com() {\n\t\treturn [this.x + this.radius, this.y + this.radius];\n\t}\n\n\ttick() {\n\n\t}\n\n\tget diameter() {\n\t\treturn this.radius * 2;\n\t}\n}\n","export const modules = {\n\tcapsule: {\n\t\tsmall: {\n\t\t\tname: 'Small Capsule',\n\t\t\ttooltip: 'A small, simple capsule. Provides just enough ' +\n\t\t\t\t'rotational power for a small rocket.',\n\t\t\ttype: 'capsule',\n\t\t\tid: 'small',\n\t\t\tmass: 2,\n\t\t\trotation: 0.1\n\t\t}\n\t},\n\tfuel: {\n\t\tsmall: {\n\t\t\tname: 'Small Fuel Tank',\n\t\t\ttooltip: 'A small flimsy tank with enough fuel for a short trip.',\n\t\t\ttype: 'fuel',\n\t\t\tid: 'small',\n\t\t\tmass: 1,\n\t\t\tcapacity: 3\n\t\t}\n\t},\n\tthruster: {\n\t\tlight: {\n\t\t\tname: 'Light Main Thruster',\n\t\t\ttooltip: 'Powerful enough to lift a small ship, but not much ' +\n\t\t\t\t'more. Not very efficient.',\n\t\t\ttype: 'thruster',\n\t\t\tid: 'light',\n\t\t\tmass: 2,\n\t\t\tthrust: 10,\n\t\t\tisp: 200\n\t\t}\n\t}\n}\n","import Ship from './ship.mjs';\nimport Module from './module.mjs';\nimport Celestial from './celestial.mjs';\nimport {modules} from '../data.mjs';\nimport * as world from './index.mjs';\n\nexport function player() {\n\tlet ship = new Ship(0, -45);\n\tship.addModule(0, 0, modules.capsule.small);\n\tship.addModule(0, 1, modules.fuel.small, { filled: true });\n\tship.addModule(0, 2, modules.thruster.light);\n\tworld.ships.add(ship);\n\tworld.setPlayerShip(ship);\n\treturn ship;\n}\n\nexport function startPlanet() {\n\treturn celestial(0, 0, 40, {\n\t\tdensity: 10,\n\t\ttype: 'green'\n\t});\n}\n\nexport function celestial(x, y, radius, params) {\n\tlet celestial = new Celestial(x - radius, y - radius, radius, params);\n\tworld.celestials.add(celestial);\n\treturn celestial;\n}\n","import * as sector from './sector.mjs';\nimport * as spawn from './spawn.mjs';\n\nexport {getSectorFromWorld, getContainedSectors} from './sector.mjs';\n\nexport const entities = new Set();\nexport const celestials = new Set();\nexport const ships = new Set();\nexport const particles = new Set();\n\nexport let playerShip = null;\n\nexport function setPlayerShip(ship) {\n\tplayerShip = ship;\n}\n\nexport function init() {\n\tentities.clear();\n\tcelestials.clear();\n\tships.clear();\n\tparticles.clear();\n\tspawn.player();\n\tspawn.startPlanet();\n}\n\nexport function tick() {\n\tparticles.forEach(p => p.tick());\n\tcelestials.forEach(c => c.tick());\n\tentities.forEach(e => e.tick());\n\tships.forEach(s => s.tick());\n}\n","import * as world from '../world/index.mjs';\n\nexport let ship;\n\nexport function init() {\n\tship = world.playerShip;\n}\n","import * as game from './index.mjs';\nimport * as graphics from '../graphics/index.mjs';\nimport * as world from '../world/index.mjs';\nimport * as player from './player.mjs';\n\nexport function startGame() {\n\tgame.changeView('game');\n\tgraphics.perspective.focusPlayer();\n}\n","import * as gui from './index.mjs';\nimport {images as assets} from '../assets.mjs';\nimport {canvas} from '../graphics/index.mjs';\nimport GuiFrame from './frame.mjs';\nimport GuiImage from './image.mjs';\nimport GuiButton from './button.mjs';\nimport * as events from '../game/events.mjs';\n\nexport function root() {\n\treturn new GuiFrame(0, 0, canvas.width, canvas.height, {\n\t\tdraw: false\n\t});\n}\n\nexport function title() {\n\tlet shadow = root();\n\tlet logo = new GuiImage(assets.title.logo);\n\tshadow.append(logo);\n\tlogo.scaleImage({ w: shadow.w * 0.7 });\n\tlogo.posRelative({ x: 0.5, xc: 0.5, y: 0.2 });\n\n\t// TODO: Implement call to change view to game.\n\tlet startFunction = events.startGame;\n\tlet start = new GuiButton('Start game', events.startGame, 0, 0, 200);\n\tshadow.append(start);\n\tstart.posRelative({ x: 0.5, xc: 0.5, y: 0.7 });\n\n\tlet secondFunction = () => {};\n\tlet second = new GuiButton('Don\\'t start game', secondFunction, 0, 0, 200);\n\tshadow.append(second);\n\tsecond.posRelative({ x: 0.5, xc: 0.5, y: 0.7 });\n\tsecond.y += 60;\n\n\treturn shadow;\n}\n\nexport function game() {\n\tlet shadow = root();\n\t\n\treturn shadow;\n}\n","import {context} from '../graphics/index.mjs';\nimport * as modules from './modules.mjs';\n\nexport const elements = new Set();\nexport let root;\n\nexport function init() {\n\telements.clear();\n\troot = modules.root();\n\tchangeView('title');\n}\n\nexport function tick() {\n\troot.tick();\n}\n\nexport function changeView(view) {\n\troot.clear();\n\n\tif (view == 'title') {\n\t\troot.append(modules.title());\n\t}\n\n\tif (view == 'game') {\n\t\troot.append(modules.game());\n\t}\n}\n\nexport function measureText(msg, font) {\n\tcontext.font = font;\n\tlet measurement = context.measureText(msg);\n\treturn [measurement.width, measurement.height];\n}\n","import {canvas, context} from './index.mjs';\n\nexport function text(string, x, y,\n\t{font = '52pt Arial', align = 'left', valign = 'top', color = null}) {\n\tcontext.textAlign = align;\n\tcontext.textBaseline = valign;\n\tcontext.fillStyle = color === null ? context.fillStyle : color;\n\tcontext.font = font;\n\n\tcontext.fillText(string, x, y);\n}\n","import {canvas, context} from './index.mjs';\nimport * as gui from '../gui/index.mjs';\nimport * as draw from './draw.mjs';\n\nexport function render() {\n\trenderElement(gui.root);\n}\n\nfunction renderElement(element) {\n\t//console.log(element.options);\n\tif (element.options.draw) {\n\t\tif (element.type == 'frame') renderFrame(element);\n\t\tif (element.type == 'image') renderImage(element);\n\t\tif (element.type == 'button') renderButton(element);\n\t}\n\telement.children.forEach(renderElement);\n}\n\nfunction renderFrame(element) {\n\tcontext.fillStyle = '#eb9';\n\tcontext.fillRect(...element.shape);\n}\n\nfunction renderImage(element) {\n\tcontext.drawImage(element.image, ...element.shape);\n}\n\nfunction renderButton(element) {\n\tif (element.mouseHeld) {\n\t\tcontext.fillStyle = '#706244';\n\t} else {\n\t\tcontext.fillStyle = element.mouseOver ? '#ad9869' : '#917f58';\n\t}\n\t\n\tcontext.fillRect(...element.shape);\n\tcontext.strokeStyle = '#541';\n\tcontext.strokeWidth = 4;\n\tcontext.strokeRect(...element.shape);\n\tcontext.textAlign = 'center';\n\tcontext.textBaseline = 'middle';\n\tcontext.fillStyle = '#fff';\n\tcontext.font = '12pt Consolas';\n\tcontext.fillText(element.text, ...element.center);\n}\n","import {canvas, context} from './index.mjs';\nimport {images as assets} from '../assets.mjs';\nimport * as world from '../world/index.mjs';\n\nexport function render() {\n\tworld.particles.forEach(renderParticle);\n\tworld.celestials.forEach(renderCelestial);\n\tworld.ships.forEach(renderShip);\n}\n\nfunction renderParticle(particle) {\n\tcontext.fillStyle = particle.color;\n\tcontext.fillRect(...particle.com, particle.size, particle.size);\n}\n\nfunction renderShip(ship) {\n\tcontext.save();\n\tcontext.translate(...ship.com);\n\tcontext.rotate(ship.r);\n\tlet [cx, cy] = ship.localCom;\n\tcontext.translate(-cx, -cy);\n\tship.modules.forEach(m => {\n\t\tcontext.drawImage(m.currentImage, m.x, m.y, 1, 1);\n\t});\n\tcontext.restore();\n}\n\nconst celestialImages = {\n\tgreen: Object.values(assets.celestials.green)\n}\n\nfunction renderCelestial(cel) {\n\tcontext.drawImage(cel.image, cel.x, cel.y,\n\t\tcel.diameter, cel.diameter);\n}\n","import {canvas, context, perspective} from './index.mjs';\nimport {images as assets} from '../assets.mjs';\n\nlet patterns = null;\n\nfunction init() {\n\tpatterns = {\n\t\tback: context.createPattern(assets.background.back, 'repeat'),\n\t\tmiddle: context.createPattern(assets.background.middle, 'repeat'),\n\t\tfront: context.createPattern(assets.background.front, 'repeat')\n\t};\n}\n\nexport function render() {\n\tif (patterns === null) init();\n\n\trenderLayer(patterns.back, 0.3, 1);\n\trenderLayer(patterns.middle, 0.5, 0.3);\n\t//renderLayer(patterns.front, 0.7, 0.3);\n}\n\nfunction renderLayer(pattern, speed = 1, scale = 1) {\n\tcontext.save();\n\tlet [px, py] = [perspective.x * speed, perspective.y * speed];\n\tcontext.translate(-px, -py);\n\tcontext.scale(scale, scale);\n\tcontext.fillStyle = pattern;\n\tcontext.fillRect(px / scale, py / scale,\n\t\tcanvas.width / scale, canvas.height / scale);\n\tcontext.restore();\n}\n\n/*\nfunction renderSectorStars(sector) {\n\tlet rand = new SeededRandom(sector.numId);\n\n\tcontext.fillStyle = '#fff';\n\n\tfor (let i = 0; i < STAR_DENSITY; i++) {\n\t\tlet sx = rand.next() * sector.size + sector.wx;\n\t\tlet sy = rand.next() * sector.size + sector.wy;\n\t\tcontext.fillRect(sx, sy, 1.5, 1.5);\n\t}\n}\n\nfunction tile(img, x, y, dx = 0, dy = 0, scale = 1) {\n\tlet [sx, sy] = [x * scale, y * scale];\n\tlet [ex, ey] = [(x + canvas.width) * scale, (y + canvas.height) * scale];\n\tfor (let x = sx; x < ex;) {\n\t\tlet nx = (Math.floor(x / img.width) + 1) * img.width;\n\t\tnx = Math.min(nx, ex);\n\t\tlet w = nx - x;\n\n\t\tfor (let y = sy; y < ey;) {\n\t\t\tlet ny = (Math.floor(y / img.height) + 1) * img.height;\n\t\t\tny = Math.min(ny, ey);\n\t\t\tlet h = ny - y;\n\n\t\t\tcontext.drawImage(img, x % img.width, y % img.height, w, h,\n\t\t\t\tdx + x, dy + y, w, h);\n\n\t\t\ty = ny;\n\t\t}\n\n\t\tx = nx;\n\t}\n}\n*/\n","import * as gui from './gui.mjs';\nimport * as draw from './draw.mjs';\nimport * as input from '../input.mjs';\nimport {render as renderWorld} from './world.mjs';\nimport {render as renderBackground} from './background.mjs';\nimport * as world from '../world/index.mjs';\nimport * as consts from '../consts.mjs';\n\nexport let canvas, context, tempCanvas, tempContext;\nexport let perspective;\n\nexport function init() {\n\tcanvas = document.querySelector('#main');\n\tcontext = canvas.getContext('2d');\n\ttempCanvas = document.querySelector('#temp');\n\ttempContext = tempCanvas.getContext('2d');\n\n\tcanvas.width = 600;\n\tcanvas.height = 600;\n\n\tperspective = new Perspective();\n\n\tdraw.text('Loading...', canvas.width / 2, canvas.height / 2,\n\t\t{ align: 'center', valign: 'middle' });\n}\n\nexport function render() {\n\tcontext.clearRect(0, 0, canvas.width, canvas.height);\n\tcontext.fillStyle = '#000';\n\tcontext.fillRect(0, 0, canvas.width, canvas.height);\n\n\trenderBackground();\n\n\tcontext.save();\n\tperspective.tick();\n\tperspective.transformCanvas();\n\trenderWorld();\n\tcontext.restore();\n\n\tgui.render();\n}\n\nexport function getVisibleSectors() {\n\treturn world.getContainedSectors(...perspective.bounds);\n}\n\nclass Perspective {\n\tconstructor() {\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\t\tthis.bounds = [0, 0, canvas.width, canvas.height];\n\t\tthis.reset();\n\t}\n\n\ttick() {\n\t\tif (input.mouse.scroll !== 0) {\n\t\t\tthis.zoomDelta(-input.mouse.scroll);\n\t\t}\n\n\t\tif (this.focus !== null) {\n\t\t\t[this.x, this.y] = this.focus.com;\n\t\t}\n\n\t\tif (this.rotationFocus !== null) {\n\t\t\tthis.targetRotation = this.rotationFocus.r;\n\t\t} else {\n\t\t\tthis.targetRotation = 0;\n\t\t}\n\n\t\tif (this.smoothRotation) {\n\t\t\tthis.rotation = (this.rotation * 0.9 + this.targetRotation * 0.1);\n\t\t} else {\n\t\t\tthis.rotation = this.targetRotation;\n\t\t}\n\t}\n\n\treset() {\n\t\tthis.rotation = 0;\n\t\tthis.targetRotation = 0;\n\t\tthis.smoothRotation = false;\n\t\tthis.zoom = consts.DEFAULT_ZOOM;\n\t\tthis.focus = null;\n\t\tthis.rotationFocus = null;\n\t}\n\n\tfocusPlayer() {\n\t\tthis.focus = world.playerShip;\n\t\tthis.rotationFocus = world.playerShip;\n\t\tthis.smoothRotation = false;\n\t}\n\n\tzoomDelta(delta) {\n\t\tlet factor = 1 + (consts.ZOOM_SPEED * Math.abs(delta));\n\t\tthis.zoom *= delta > 0 ? factor : 1 / factor;\n\t\tthis.normalize();\n\t}\n\n\tnormalize() {\n\t\tthis.zoom = Math.max(consts.MIN_ZOOM,\n\t\t\tMath.min(consts.MAX_ZOOM, this.zoom));\n\t}\n\n\ttransformCanvas() {\n\t\tlet [,,bw, bh] = this.bounds;\n\t\tlet tx = -this.x * this.zoom;\n\t\tlet ty = -this.y * this.zoom;\n\t\tcontext.translate(tx + bw / 2, ty + bh / 2);\n\t\tcontext.scale(this.zoom, this.zoom);\n\t}\n}\n","import * as input from '../input.mjs';\nimport * as player from './player.mjs';\n\nexport const mapping = {\n\tthrust: 'KeyW',\n\tleft: 'KeyA',\n\tright: 'KeyD'\n};\n\nexport function tick() {\n\tlet held = input.keyCode.held;\n\tlet pressed = input.keyCode.pressed;\n\n\tif (held[mapping.thrust]) {\n\t\tplayer.ship.applyThrust({ forward: 1 });\n\t}\n\n\tif (held[mapping.left]) {\n\t\tplayer.ship.applyThrust({ turnLeft: 1 });\n\t}\n\n\tif (held[mapping.right]) {\n\t\tplayer.ship.applyThrust({ turnRight: 1 });\n\t}\n}\n","import * as graphics from '../graphics/index.mjs';\nimport * as gui from '../gui/index.mjs';\nimport * as assets from '../assets.mjs';\nimport * as input from '../input.mjs';\nimport * as world from '../world/index.mjs';\nimport * as events from './events.mjs';\nimport * as control from './control.mjs';\nimport * as player from './player.mjs';\n\nexport let state;\n\nexport async function init() {\n\tstate = {\n\t\tview: 'menu',\n\t\tpaused: false\n\t};\n\n\tgraphics.init();\n\tawait assets.init();\n\tgui.init();\n\tinput.init();\n\n\t//events.startGame();\n\n\t//tick(); return;\n\n\t// Recursive `requestAnimationFrame` can cause problems with Parcel.\n\twhile(true) {\n\t\tawait tick();\n\t\tawait new Promise(res => requestAnimationFrame(res));\n\t}\n}\n\nexport function changeView(view) {\n\tstate.view = view;\n\tgui.changeView(view);\n\n\tif (view == 'game') {\n\t\tworld.init();\n\t\tplayer.init();\n\t}\n}\n\nasync function tick() {\n\tif (state.view == 'game') {\n\t\tworld.tick();\n\t\tcontrol.tick();\n\t}\n\n\tgui.tick();\n\tgraphics.render();\n\tinput.tick();\n}\n","import { init } from './game/index.mjs';\n\nwindow.addEventListener('load', init);\n"],"names":["init","input.mouse","assets","G","world.celestials","particle.createThrustExhaust","world.ships","world.setPlayerShip","spawn.player","spawn.startPlanet","tick","world.playerShip","game.changeView","graphics.perspective","events.startGame","root","modules.root","modules.title","modules.game","gui.root","render","world.particles","draw.text","renderBackground","renderWorld","gui.render","consts.DEFAULT_ZOOM","consts.ZOOM_SPEED","consts.MIN_ZOOM","consts.MAX_ZOOM","mapping","input.keyCode","player.ship","graphics.init","assets.init","gui.init","input.init","changeView","gui.changeView","world.init","player.init","world.tick","control.tick","gui.tick","graphics.render","input.tick"],"mappings":"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"} \ No newline at end of file diff --git a/js/world/body.mjs b/js/world/body.mjs index bfbb5d4..7aa517a 100644 --- a/js/world/body.mjs +++ b/js/world/body.mjs @@ -37,9 +37,9 @@ export default class Body { return [nx - cx, ny - cy]; } - rotateVector(x, y, r) { - return [(x * Math.cos(this.r) - y * Math.sin(this.r)), - (y * Math.cos(this.r) - x * Math.sin(this.r))]; + rotateVector(x, y, r = this.r) { + return [(x * Math.cos(r) - y * Math.sin(r)), + (y * Math.cos(r) - x * Math.sin(r))]; } relativeVector(x, y) { @@ -65,9 +65,12 @@ export default class Body { distanceTo(body) { let [[ax, ay], [bx, by]] = [this.com, body.com]; - let result = Math.max(Math.sqrt(((bx - ax) ** 2) + + return Math.max(Math.sqrt(((bx - ax) ** 2) + ((by - ay) ** 2)), 1); - return result; + } + + angleTo(ax, ay, bx, by) { + return Math.atan2(by - ay, bx - ax); } approach(body, distance) { @@ -83,7 +86,7 @@ export default class Body { } applyDirectionalForce(x, y, r) { - let [vx, vy] = this.rotateVector(x, y, r); + let [vx, vy] = this.rotateVector(x, y); this.xvel += vx; this.yvel += vy; this.rvel += r / this.mass; diff --git a/js/world/particle.mjs b/js/world/particle.mjs index 54406b8..f724b5a 100644 --- a/js/world/particle.mjs +++ b/js/world/particle.mjs @@ -10,7 +10,7 @@ export function createThrustExhaust(thruster) { xvel: ship.xvel + fx, yvel: ship.yvel + fy, color: '#f4c542', - lifetime: 10, + lifetime: 5, size: 0.07 })); } diff --git a/js/world/ship.mjs b/js/world/ship.mjs index 6f8517f..50816c8 100644 --- a/js/world/ship.mjs +++ b/js/world/ship.mjs @@ -66,12 +66,25 @@ export default class Ship extends Body { }) } + resolveCelestialCollision(pos, cel) { + //debugger; + let theta = this.angleTo(...this.com, ...cel.com); + let angleToCom = this.angleTo(...this.com, ...pos); + let angle = angleToCom - theta; + let [force] = this.rotateVector(0, 1, angle); + if (Math.abs(angle) < 0.3) { + force *= -1; + } + this.rvel -= force * 0.015; + } + checkModuleCollision(module, body) { - let p = this.getWorldPoint(...module.localCom) + let p = this.getWorldPoint(...module.localCom); let dis = body.distanceTo({ com: p }); if (dis < body.radius + 0.5) { this.approach(body, dis - (body.radius + 0.5)); this.halt(); + this.resolveCelestialCollision(p, body); } } diff --git a/rollup b/rollup index 9333891..992f786 100755 --- a/rollup +++ b/rollup @@ -1,2 +1,2 @@ #!/bin/bash -rollup js/index.mjs --o dist/improcket.min.js --f es --watch +rollup js/index.mjs --o dist/improcket.min.js -m --silent --f es --watch