浏览代码

Start moving towards move useful constructor objects; consolidate unit definitions

Entities now have their templates cloned (by serializing and parsing) to allow for
a single object to be passed in repeatedly.
tags/v0.1.0
Fen Dweller 5 年前
父节点
当前提交
1b55b5a50f
共有 5 个文件被更改,包括 613 次插入1575 次删除
  1. +1
    -1
      macrovision.html
  2. +107
    -3
      macrovision.js
  3. +0
    -8
      presets/buildings.js
  4. +504
    -1531
      presets/characters.js
  5. +1
    -32
      presets/objects.js

+ 1
- 1
macrovision.html 查看文件

@@ -7,9 +7,9 @@
<link rel="stylesheet" href="reset.css"> <link rel="stylesheet" href="reset.css">
<link rel="stylesheet" href="macrovision.css"><script src="https://kit.fontawesome.com/10a16c6083.js" crossorigin="anonymous"></script> <link rel="stylesheet" href="macrovision.css"><script src="https://kit.fontawesome.com/10a16c6083.js" crossorigin="anonymous"></script>
<script src="math.min.js"></script> <script src="math.min.js"></script>
<script src="presets/characters.js"></script>
<script src="presets/buildings.js"></script> <script src="presets/buildings.js"></script>
<script src="presets/landmarks.js"></script> <script src="presets/landmarks.js"></script>
<script src="presets/characters.js"></script>
<script src="presets/species.js"></script> <script src="presets/species.js"></script>
<script src="presets/objects.js"></script> <script src="presets/objects.js"></script>
<script src="presets/fiction.js"></script> <script src="presets/fiction.js"></script>


+ 107
- 3
macrovision.js 查看文件

@@ -24,9 +24,71 @@ let dragEntityScaleHandle = null;


let worldSizeDirty = false; let worldSizeDirty = false;




math.createUnit("humans", { math.createUnit("humans", {
definition: "5.75 feet" definition: "5.75 feet"
});

math.createUnit("story", {
definition: "12 feet",
prefixes: "long"
});
math.createUnit("stories", {
definition: "12 feet",
prefixes: "long"
});
math.createUnit("parsec", {
definition: "3.086e16 meters",
prefixes: "long"
})
math.createUnit("parsecs", {
definition: "3.086e16 meters",
prefixes: "long"
})
math.createUnit("lightyears", {
definition: "9.461e15 meters",
prefixes: "long"
}) })
math.createUnit("AU", {
definition: "149597870700 meters"
})
math.createUnit("AUs", {
definition: "149597870700 meters"
})
math.createUnit("dalton", {
definition: "1.66e-27 kg",
prefixes: "long"
});
math.createUnit("daltons", {
definition: "1.66e-27 kg",
prefixes: "long"
});
math.createUnit("solarradii", {
definition: "695990 km",
prefixes: "long"
});
math.createUnit("solarmasses", {
definition: "2e30 kg",
prefixes: "long"
});
math.createUnit("galaxy", {
definition: "105700 lightyears",
prefixes: "long"
});
math.createUnit("galaxies", {
definition: "105700 lightyears",
prefixes: "long"
});
math.createUnit("universe", {
definition: "93.016e9 lightyears",
prefixes: "long"
});
math.createUnit("universes", {
definition: "93.016e9 lightyears",
prefixes: "long"
});

const unitChoices = { const unitChoices = {
length: [ length: [
"meters", "meters",
@@ -266,14 +328,56 @@ function drawScale(ifDirty=false) {
drawTicks(ctx, pixelsPer, heightPer); drawTicks(ctx, pixelsPer, heightPer);
} }


// Entities are generated as needed, and we make a copy
// every time - the resulting objects get mutated, after all.
// But we also want to be able to read some information without
// calling the constructor -- e.g. making a list of authors and
// owners. So, this function is used to generate that information.
// It is invoked like makeEntity so that it can be dropped in easily,
// but returns an object that lets you construct many copies of an entity,
// rather than creating a new entity.
function createEntityMaker(info, views, sizes) {
const maker = {};

maker.name = info.name;
maker.constructor = () => makeEntity(info, views, sizes);
maker.authors = [];
maker.owners = [];

Object.values(views).forEach(view => {
const authors = authorsOf(view.image.source);
if (authors) {
authors.forEach(author => {
if (maker.authors.indexOf(author) == -1) {
maker.authors.push(author);
}
});
}
const owners = ownersOf(view.image.source);
if (owners) {
owners.forEach(owner => {
if (maker.owners.indexOf(owner) == -1) {
maker.owners.push(owner);
}
});
}
});

return maker;
}

// This function serializes and parses its arguments to avoid sharing
// references to a common object. This allows for the objects to be
// safely mutated.

function makeEntity(info, views, sizes) { function makeEntity(info, views, sizes) {
const entityTemplate = { const entityTemplate = {
name: info.name, name: info.name,
identifier: info.name, identifier: info.name,
scale: 1, scale: 1,
info: info,
views: views,
sizes: sizes === undefined ? [] : sizes,
info: JSON.parse(JSON.stringify(info)),
views: JSON.parse(JSON.stringify(views), math.reviver),
sizes: sizes === undefined ? [] : JSON.parse(JSON.stringify(sizes), math.reviver),
init: function () { init: function () {
const entity = this; const entity = this;
Object.entries(this.views).forEach(([viewKey, view]) => { Object.entries(this.views).forEach(([viewKey, view]) => {


+ 0
- 8
presets/buildings.js 查看文件

@@ -1,12 +1,4 @@


math.createUnit("story", {
definition: "12 feet",
prefixes: "long"
});
math.createUnit("stories", {
definition: "12 feet",
prefixes: "long"
});


function makeBuilding(name, height, image) { function makeBuilding(name, height, image) {
views = { views = {


+ 504
- 1531
presets/characters.js
文件差异内容过多而无法显示
查看文件


+ 1
- 32
presets/objects.js 查看文件

@@ -1,35 +1,4 @@
math.createUnit("dalton", {
definition: "1.66e-27 kg",
prefixes: "long"
});
math.createUnit("daltons", {
definition: "1.66e-27 kg",
prefixes: "long"
});
math.createUnit("solarradii", {
definition: "695990 km",
prefixes: "long"
});
math.createUnit("solarmasses", {
definition: "2e30 kg",
prefixes: "long"
});
math.createUnit("galaxy", {
definition: "105700 lightyears",
prefixes: "long"
});
math.createUnit("galaxies", {
definition: "105700 lightyears",
prefixes: "long"
});
math.createUnit("universe", {
definition: "93.016e9 lightyears",
prefixes: "long"
});
math.createUnit("universes", {
definition: "93.016e9 lightyears",
prefixes: "long"
});





function makeObject(name, viewInfo) { function makeObject(name, viewInfo) {


正在加载...
取消
保存