nodejs+canvas 后端脚本生成游戏五维图
我们有部分教学类的软件,设计成简单的游戏形式。我们从完成度、技能值、互动性、熟练度、积极性5个纬度打分,每个纬度的打分是1-5,都是整数。
真实效果如下
本来想前端直接生成完整五维图,发现融入背景效果不好,于是改成前端背景+后端生成好的图片。于是需要把每个可能的五维图生成,总共是5的5次方,共3125张图片。
这里最终方案选择nodejs生成图片,可以解决透明度问题,效果非常nice
const { createCanvas, loadImage } = require('canvas')
var fs = require("fs");
var path = require("path");
var fun = require('./fun');
var pic_config={
wanchengdu:[[500,140],[500,212],[500,287],[500,359],[500,431]]
,jinengzhi:[[844,389],[775,411],[702,433],[630,455],[558,477]]
,hudongxing:[[713,791],[670,731],[626,671],[582,611],[538,550]]
,shuliandu:[[288,791],[332,731],[376,671],[420,611],[464,550]]
,jijixing:[[158,389],[228,411],[299,433],[368,455],[439,477]]
};
var all={};
//var argv = process.argv;
//var $key=argv[2];
//console.log($key);
//解决中文问题, 复制成新的临时文件
function togbk(picurl)
{
var new_picurl='./temp/'+fun.randtime()+'.png';
fs.copyFileSync(picurl,new_picurl);
return new_picurl;
}
function huatu(config)
{
console.log('sssssss2222s');
const canvas = createCanvas(1000, 1000)
const ctx2 = canvas.getContext('2d');
ctx2.clearRect(0,0,1000,1000);
ctx2.beginPath();
ctx2.strokeStyle= "rgba(55,139,207,1)";
ctx2.lineWidth = 3;
var wanchengdu_num=config[0];
var jinengzhi_num=config[1];
var hudongxing_num=config[2];
var shuliandu_num=config[3];
var jijixing_num=config[4];
ctx2.moveTo(pic_config['wanchengdu'][6-wanchengdu_num-1][0],pic_config['wanchengdu'][6-wanchengdu_num-1][1]);
ctx2.lineTo(pic_config['jinengzhi'][6-jinengzhi_num-1][0],pic_config['jinengzhi'][6-jinengzhi_num-1][1]);
ctx2.lineTo(pic_config['hudongxing'][6-hudongxing_num-1][0],pic_config['hudongxing'][6-hudongxing_num-1][1]);
ctx2.lineTo(pic_config['shuliandu'][6-shuliandu_num-1][0],pic_config['shuliandu'][6-shuliandu_num-1][1]);
ctx2.lineTo(pic_config['jijixing'][6-jijixing_num-1][0],pic_config['jijixing'][6-jijixing_num-1][1]);
ctx2.closePath();
ctx2.stroke();
ctx2.fillStyle = "rgba(155,203,241,0.7)";
ctx2.fill();
var tourl=`img2/${wanchengdu_num}/${wanchengdu_num}${jinengzhi_num}${hudongxing_num}${shuliandu_num}${jijixing_num}.png`
canvas.createPNGStream().pipe(fs.createWriteStream(tourl));
}
var list_all=[1,2,3,4,5];
var list=[];
for(var ax in list_all)
{
var a=list_all[ax];
for(var bx in list_all)
{
var b=list_all[bx];
for(var cx in list_all)
{
var c=list_all[cx];
for(var dx in list_all)
{
var d=list_all[dx];
for(var ex in list_all)
{
var e=list_all[ex];
var arr=[a,b,c,d,e];
list.push(arr);
//console.log(arr);
}
}
}
}
}
for(var i=0; i<list.length;i++)
{
var delay_time=i*200;
var arr=list[i];
yanchishengcheng(arr,delay_time);
}
function yanchishengcheng(arr,delay_time)
{
setTimeout(function(){
huatu(arr);
console.log(arr);
},delay_time);
}
//huatu([1,2,3,4,5]);
//main("img/test.png");
脚本临时用,一次性代码,所以代码写得比较粗糙。没有去处理异步,主要通过延迟来控制性能,野生办法,正式编程不推荐这么做。