nodejs+canvas 后端脚本生成游戏五维图

野生程序猿-杂烧4年前图像处理684

我们有部分教学类的软件,设计成简单的游戏形式。我们从完成度、技能值、互动性、熟练度、积极性5个纬度打分,每个纬度的打分是1-5,都是整数。

           

真实效果如下

02c371d4cb64e939973bc542d3cd36e9.jpg

本来想前端直接生成完整五维图,发现融入背景效果不好,于是改成前端背景+后端生成好的图片。于是需要把每个可能的五维图生成,总共是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");

脚本临时用,一次性代码,所以代码写得比较粗糙。没有去处理异步,主要通过延迟来控制性能,野生办法,正式编程不推荐这么做。

相关文章

初学nodejs+express,打造cms系统(4)

前面已经改造了基础模块,下面到了页面制作环节。先前的脚手架已经支持ejs了,在views文件夹里出现了测试ejs,下面基本上是锻炼自己仿写能力了。【routes/api.js】var exp...

nodejs同步操作sqlite3类

electron是基于nodejs的,为了方便electron存储,想到了sqlite这种轻便数据库。作为桌面应用,不像nodejs写服务端,为了简化开发,所以写了个同步的操作sqlite的类库,需要...

编译的困扰-经验分享

编译的困扰-经验分享

开发的时候我们编译经常遇到坑,一会要用python3,一会又要用python 2.7的情况,nodejs一会要这个版本,一会要那个版本的情况,甚至npm都有版本要求。...

初学nodejs+express,打造cms系统(5)

今天来尝试做上传功能,其实就是一个上传接口。已经跟php完全两样了,两眼一抹黑,直接百度搜索出来拿过来用,也不知道性能如何,反正可以跑通,需要找机会验证一下。【upload.js】//api库&nbs...

nodejs同步mysql操作类

nodejs越来越火了,打算稍微在深入学习一下,于是把php的mysql操作类库稍微改了一下,为了保留php思路,这里加入了同步的方法。简单测了一下,本地 没有问题,不知道同步在多人访问时候是否有坑,...

初学nodejs+express,打造cms系统(6)补充运行环境优化

初学nodejs+express,打造cms系统(6)补充运行环境优化

本来主要功能完成了,但是感觉少了点什么,其实就是自创(或许也有别人想到吧)了一套运行环境方案。实际部署的时候,我们是需要与nginx结合的,使用nodejs来提供静态资源的web服务非常的不nice,...