javascript - 如何在 NFT 生成期间在 javascript 中使用 if/else 或其他带有 const 的方法
问题描述
我将 Visual Studio Code 与 javascript generation-art-node-main 文件一起使用,从我制作的 Photoshop 图层文件中创建自动生成的字符 NFT。
我对 JavaScript 不是很了解,但知道一些编码。
有没有像 if/else 这样的方法来告诉 const 基于另一个层的使用来使用某个层?就像它选择一个黑头来使用黑耳朵和黑手层而不是白色的?或者如果它使用特定的帽子,那么不使用特定的发型?
这是我的 config.js:
const layersOrder = [
{ name: 'background', number: 10 },
{ name: 'heads', number: 8 },
{ name: 'eyes', number: 19 },
{ name: 'eyebrows', number: 15 },
{ name: 'noses', number: 6 },
{ name: 'shoulders', number: 9 },
{ name: 'chains', number: 7 },
{ name: 'ears', number: 6 },
{ name: 'hair', number: 14 },
{ name: 'hats', number: 9 },
{ name: 'accessories', number: 100 },
{ name: 'beards', number: 17 },
{ name: 'mouths', number: 12},
{ name: 'robe', number: 200 },
{ name: 'weapons', number: 20 },];
const format = {
width: 1080,
height: 1080
};
const rarity = [
{ key: "", val: "original" },
{ key: "_r", val: "rare" },
{ key: "_sr", val: "super rare" },
];
const defaultEdition = 50;
module.exports = { layersOrder, format, rarity, defaultEdition };
function newFunction() {
return 30;
}
这是我的 main.js:
const fs = require("fs");
const { createCanvas, loadImage } = require("canvas");
const console = require("console");
const { layersOrder, format, rarity } = require("./config.js");
const canvas = createCanvas(format.width, format.height);
const ctx = canvas.getContext("2d");
if (!process.env.PWD) {
process.env.PWD = process.cwd();
}
const buildDir = `${process.env.PWD}/build`;
const metDataFile = '_metadata.json';
const layersDir = `${process.env.PWD}/layers`;
let metadata = [];
let attributes = [];
let hash = [];
let decodedHash = [];
const Exists = new Map();
const addRarity = _str => {
let itemRarity;
rarity.forEach((r) => {
if (_str.includes(r.key)) {
itemRarity = r.val;
}
});
return itemRarity;
};
const cleanName = _str => {
let name = _str.slice(0, -4);
rarity.forEach((r) => {
name = name.replace(r.key, "");
});
return name;
};
const getElements = path => {
return fs
.readdirSync(path)
.filter((item) => !/(^|\/)\.[^\/\.]/g.test(item))
.map((i, index) => {
return {
id: index + 1,
name: cleanName(i),
fileName: i,
rarity: addRarity(i),
};
});
};
const layersSetup = layersOrder => {
const layers = layersOrder.map((layerObj, index) => ({
id: index,
name: layerObj.name,
location: `${layersDir}/${layerObj.name}/`,
elements: getElements(`${layersDir}/${layerObj.name}/`),
position: { x: 0, y: 0 },
size: { width: format.width, height: format.height },
number: layerObj.number
}));
return layers;
};
const buildSetup = () => {
if (fs.existsSync(buildDir)) {
fs.rmdirSync(buildDir, { recursive: true });
}
fs.mkdirSync(buildDir);
};
const saveLayer = (_canvas, _edition) => {
fs.writeFileSync(`${buildDir}/${_edition}.png`, _canvas.toBuffer("image/png"));
};
const addMetadata = _edition => {
let dateTime = Date.now();
let tempMetadata = {
hash: hash.join(""),
decodedHash: decodedHash,
edition: _edition,
date: dateTime,
attributes: attributes,
};
metadata.push(tempMetadata);
attributes = [];
hash = [];
decodedHash = [];
};
const addAttributes = (_element, _layer) => {
let tempAttr = {
id: _element.id,
layer: _layer.name,
name: _element.name,
rarity: _element.rarity,
};
attributes.push(tempAttr);
hash.push(_layer.id);
hash.push(_element.id);
decodedHash.push({ [_layer.id]: _element.id });
};
const drawLayer = async (_layer, _edition) => {
const rand = Math.random();
let element =
_layer.elements[Math.floor(rand * _layer.number)] ? _layer.elements[Math.floor(rand * _layer.number)] : null;
if (element) {
addAttributes(element, _layer);
const image = await loadImage(`${_layer.location}${element.fileName}`);
ctx.drawImage(
image,
_layer.position.x,
_layer.position.y,
_layer.size.width,
_layer.size.height
);
saveLayer(canvas, _edition);
}
};
const createFiles = async edition => {
const layers = layersSetup(layersOrder);
let numDupes = 0;
for (let i = 1; i <= edition; i++) {
await layers.forEach(async (layer) => {
await drawLayer(layer, i);
});
let key = hash.toString();
if (Exists.has(key)) {
console.log(
`Duplicate creation for edition ${i}. Same as edition ${Exists.get(
key
)}`
);
numDupes++;
if (numDupes > edition) break; //prevents infinite loop if no more unique items can be created
i--;
} else {
Exists.set(key, i);
addMetadata(i);
console.log("Creating edition " + i);
}
}
};
const createMetaData = () => {
fs.stat(`${buildDir}/${metDataFile}`, (err) => {
if(err == null || err.code === 'ENOENT') {
fs.writeFileSync(`${buildDir}/${metDataFile}`, JSON.stringify(metadata, null, 2));
} else {
console.log('Oh no, error: ', err.code);
}
});
};
module.exports = { buildSetup, createFiles, createMetaData };
解决方案
推荐阅读
- python - 如何使用python选择多个文本坐标,使其不与同一背景图像中的多个图像坐标重叠?
- r - 如何使用 Pearson IV 型误差分布在 R 中运行回归?
- django - django docker 无法访问 nginx 端口
- python - 如何使用 SQLALCHEMY_BINDS 将 pandas.DataFrame.to_sql 与多个数据库一起使用
- opengl - GLSL中统一和常量之间的不同浮点行为
- google-app-engine - 我在这里做错了什么?每当我执行这一行时,它都会指向一个目录
- javascript - 修改子组件中的数据并使其在父组件中作为道具可用
- r - 从 data.frame 中的每一列中选择 10 个最高值并按降序绘制
- java - 为什么当我将元素绑定到其中时,我的代码总是收到空指针异常?我在 Android Studio 中使用 Java
- elasticsearch - 多个词在搜索中充当单个词 - Elasticsearch