设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 5642|回复: 11
打印 上一主题 下一主题

[有事请教] mv中无法使用Proxy(代理)和canvas合成图片下载问题(已解决)

[复制链接]

Lv3.寻梦者

梦石
0
星屑
2346
在线时间
168 小时
注册时间
2017-4-25
帖子
219
跳转到指定楼层
1
发表于 2021-5-15 17:20:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 rexuegg123 于 2021-5-16 08:59 编辑

很久没来论坛了,向大神请教两个问题:
一、如何向MV中引入Proxy(代理)机制?
二、在mv中,利用canvas操作图片后(比如几张图片拼合在一起),如何下载canvas中的图像内容(下载保存为图片)?


问题已解决,感谢zths大神指导!解决办法:原来我用的1.5.1版的MV,改用1.6.1后两个问题“不药而愈”

问题一
先上代码:
JAVASCRIPT 代码复制
  1. function soul () {};
  2.  
  3. soul.prototype.create = function (target) {
  4.     window[target.name+'s'] = new Proxy (target, this.action);
  5. };
  6.  
  7. soul.prototype.action =  {
  8.     set: function (target, prop, value) {
  9.         if (target[prop] !== value) {
  10.             console.log(target.name+':',prop,target[prop],'=>',value);
  11.             target[prop] = value;
  12.         }
  13.     }
  14. };
  15.  
  16. soul = new soul ();
  17.  
  18. var obj={
  19.     name:'obj', arr:[1,2,3,4,5], mo:'456', xx:{y:12}, fn:function(){delete window[this.name+'s']}
  20. }
  21.  
  22. soul.create(obj);


以上代码是利用Proxy的代理机制为后面的 obj 对象新建一个镜像objs(也是一个对象,其属性与方法与obj一致)。建立镜像后,obj的任何操作都在objs上进行。而objs的任何属性变化都可以通过增加方法的方式来提供反馈,如上面的代码就提供了属性变化时的console.log()的提示功能。比如:

重新设定obj的name属性
objs.name='objs';
obj: name obj => objs   //控制台提示的内容




以上是在浏览器中运行上述代码后的得到的结果gif

笔者的目利用Proxy的拦截反馈机制,建立游戏NPC的AI,也可以为其他角色通过监视自身属性的变化来建立自行行动的能力。但在mv中使用时,mv表示不认识Proxy:Uncaught ReferenceError: Proxy is not defined……
所以有大神知道在怎么在mv中引入Proxy吗?



问题二:
老规矩,先上代码
JAVASCRIPT 代码复制
  1. function CanvasDemo () {};
  2.  
  3. CanvasDemo.Create = function () {
  4.     var z = '<div>\
  5.     <p  onclick="CanvasDemo.getimg()">导出图片到div元素</p><img id="outimg" src="">\
  6.     <p>myCanvas中的合成图内容----</p><a id="downloadPic">点击下载合成图</a>\
  7.     <canvas id="myCanvas" width="200" height="auto" style="border:1px solid #d3d3d3;">\
  8.     </div>'
  9.     $('#StandingDiv').append(z);
  10.     var c=document.getElementById("myCanvas");   
  11.     var ctx=c.getContext("2d");
  12.  
  13.     var min = 7,max=12;
  14.     this.num = max-min+1;
  15.     for (var i=min;i<=max;i++) {        
  16.         this.img(ctx,'cjng',i);
  17.     }
  18.     console.log(c.width);
  19.     this.WH_Re (c,min,max);
  20.     setTimeout(function(){
  21.         this.downLoad(c,'下载测试img');
  22.         //this.getimg();
  23.     }.bind(this),30);  
  24. };
  25.  
  26. CanvasDemo.WH_Re = function (canvas) {   
  27.     canvas.width  = 50*this.num;
  28.     canvas.height = 50;
  29. };
  30.  
  31. CanvasDemo.img = function (ctx,str,i) {
  32.     var s = i+'';
  33.     var num = s.length==1 ? '0'+i : i;
  34.     var img = new Image();            
  35.     img.src = FT_url.itemic (str+num);  
  36.     img.onload = function() {
  37.         ctx.drawImage(img,(i-7)*50,0);
  38.     };   
  39. };
  40.  
  41. CanvasDemo.getimg = function(canvas) {// 单击“生成图片”按钮,导出图片
  42.     var c=document.getElementById("myCanvas");
  43.     var newImg = document.getElementById("outimg")   
  44.     var imgSrc = c.toDataURL('image/png'); //获取图片的DataURL        
  45.     newImg.src = imgSrc; //将图片路径赋值给src   
  46.     console.log('导出图片')
  47. }
  48.  
  49. CanvasDemo.downLoad = function(canvas,name) {
  50.     document.getElementById('downloadPic').addEventListener('click', function() {
  51.         downloadCanvas(this, 'myCanvas', 'test.png');//下载myCanvas中的图像,命名为‘test.png’
  52.     }, false);
  53. }
  54.  
  55. function downloadCanvas(link, canvasId, filename) {
  56.     link.href = document.getElementById(canvasId).toDataURL();
  57.     link.download = filename;
  58.     console.log('下载图片');
  59. }


依然先在浏览器上运行,canvas的操作在引用 ‘.toDataURL()’ 时,表现出了跨域问题……即无法引用canvas画布中的内容,无法导出、下载等……笔者无法解决这个问题


以上是在mv上操作canvas的gif
所以又在mv上,结果mv上可以导出画布中的图像内容到div元素中。在下载画布内容保存为图片时虽没有报错,但却没有任何反应。
到底是mv并没有重内存中下载画布的内容呢,还是下载了没有通知?


Lv3.寻梦者

梦石
0
星屑
2346
在线时间
168 小时
注册时间
2017-4-25
帖子
219
2
 楼主| 发表于 2021-5-15 17:22:00 | 只看该作者
在网上查了不少资料……暂时无解,期望某大神降临指导
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21641
在线时间
9415 小时
注册时间
2012-6-19
帖子
7118

开拓者短篇九导演组冠军

3
发表于 2021-5-15 19:48:07 | 只看该作者
前一个,搜索proxy的polyfill,能用上一些proxy基础的功能
https://gitee.com/ambit/es6-proxy-polyfill/

或者升级nwjs的版本看看
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3476
在线时间
293 小时
注册时间
2020-1-27
帖子
190
4
发表于 2021-5-15 21:26:53 | 只看该作者
升级nwjs肯定好使....
估计你那个mv带的是 nwjs0.12.0 的版本...
那个版本很坑人
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2346
在线时间
168 小时
注册时间
2017-4-25
帖子
219
5
 楼主| 发表于 2021-5-15 21:31:18 | 只看该作者
zths 发表于 2021-5-15 21:26
升级nwjs肯定好使....
估计你那个mv带的是 nwjs0.12.0 的版本...
那个版本很坑人 ...

好的,我试试,谢谢大神
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2346
在线时间
168 小时
注册时间
2017-4-25
帖子
219
6
 楼主| 发表于 2021-5-15 21:44:06 | 只看该作者
zths 发表于 2021-5-15 21:26
升级nwjs肯定好使....
估计你那个mv带的是 nwjs0.12.0 的版本...
那个版本很坑人 ...

网上找到最新的nwjs-v0.53.0-win-x64.zip……再问下,不知道MV中nwjs是怎么升级的?
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3476
在线时间
293 小时
注册时间
2020-1-27
帖子
190
7
发表于 2021-5-15 21:59:56 | 只看该作者
本帖最后由 zths 于 2021-5-15 22:02 编辑

打开mv目录 默认是 ?:\Program Files (x86)\KADOKAWA\RPGMV
有几个目录 nwjs-lnx  nwjs-win nwjs-win-test
分别对应 nwjs-NORMAL版本 nwjs-sdk版本 nwjs linux版本
下载的包覆一下 然后 nw.exe 改名为 Game.exe  linux的可能不用管.

注意下载的nwjs建议都用32bit的版本.. 不然32位跑不了.
还有 0.12.x 以上的nwjs不支持 windows xp. 这无法避免
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2346
在线时间
168 小时
注册时间
2017-4-25
帖子
219
8
 楼主| 发表于 2021-5-15 22:26:54 | 只看该作者
zths 发表于 2021-5-15 21:59
打开mv目录 默认是 ?:\Program Files (x86)\KADOKAWA\RPGMV
有几个目录 nwjs-lnx  nwjs-win nwjs-win-test
...

我的MV版本1.5.1,尝试了以下:
1、将原来的nwjs-win里的文件全删除,将新版的全放进去,然后 nw.exe 改名为 Game.exe 。直接EXE窗口白屏报错
2、用新版nwjs覆盖原版文件,删除原版 Game.exe,然后 nw.exe 改名为 Game.exe。能开启EXE,但MV的一些功能用不起,F8调试功能也没有了
3、原版MV引入 es6-proxy-polyfill.js,proxy能用了,测试了set功能能用,但会报感叹号:Trap 'set' returned false for property 'name',不知道什么意思
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3476
在线时间
293 小时
注册时间
2020-1-27
帖子
190
9
发表于 2021-5-15 23:18:31 | 只看该作者
本帖最后由 zths 于 2021-5-15 23:24 编辑
rexuegg123 发表于 2021-5-15 22:26
我的MV版本1.5.1,尝试了以下:
1、将原来的nwjs-win里的文件全删除,将新版的全放进去,然后 nw.exe 改 ...


不要按f8 按f12
白屏的原因可能是你删了 project.json
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2346
在线时间
168 小时
注册时间
2017-4-25
帖子
219
10
 楼主| 发表于 2021-5-16 08:53:59 | 只看该作者
zths 发表于 2021-5-15 23:18
不要按f8 按f12
白屏的原因可能是你删了 project.json

把MV版本升级到1.6.1,什么都不用改,两个问题都搞定了。感谢你费心了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-18 17:45

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表