Project1

标题: blt读取图片有啥特殊要求么 [打印本页]

作者: doranikofu    时间: 2015-11-15 15:36
标题: blt读取图片有啥特殊要求么
打算用blt读取图片做图形菜单,试了下莫名其妙有些图片能显示有些却是空的
  1. Window_Base.prototype.drawButton = function(faceName, x, y, width, height) {
  2.     var bitmap = ImageManager.loadSystem(faceName);
  3.     this.contents.blt(bitmap, 0, 0, width, height, x, y);
  4. };


  5. Window_ActorCommand.prototype.drawItem = function(index)
  6. {
  7.         this.drawIcon(12, 10,10,100,32); // for testing purpose
  8.         var bitmap = 'Balloon';
  9.         this.drawButton(bitmap, 10, 10, 300, 300);  // test loading image
  10. };
复制代码
扩大了战斗菜单选项框,然后测试drawIcon毫无问题
然后如法炮制了一个drawButton打算画图片,但是很莫名读了几个system文件夹的图 有的可以读有的不显示,没有报错的
是有啥限制还是图片必须特定规格的?同样的函数啊换了图片就不行了。。。
作者: taroxd    时间: 2015-11-15 15:45
blt 要求源图片加载完毕。

MV 中读取图片是异步操作,返回的图片不一定是加载完成的。可以用 addLoadListener 来侦听加载完成。
作者: doranikofu    时间: 2015-11-15 15:58
发现问题了
这个里面限了文件读取。。。。不知掉为啥之前下的一个动画标题菜单插件没有改scene_root也能读。。。
  1. Scene_Boot.prototype.loadSystemImages = function() {
  2.     ImageManager.loadSystem('Window');
  3.     ImageManager.loadSystem('IconSet');
  4.     ImageManager.loadSystem('Balloon');
  5.     ImageManager.loadSystem('Shadow1');
  6.     ImageManager.loadSystem('Shadow2');
  7.     ImageManager.loadSystem('Damage');
  8.     ImageManager.loadSystem('States');
  9.     ImageManager.loadSystem('Weapons1');
  10.     ImageManager.loadSystem('Weapons2');
  11.     ImageManager.loadSystem('Weapons3');
  12.     ImageManager.loadSystem('ButtonSet');
  13. };
复制代码

作者: taroxd    时间: 2015-11-15 16:06
doranikofu 发表于 2015-11-15 15:58
发现问题了
这个里面限了文件读取。。。。不知掉为啥之前下的一个动画标题菜单插件没有改scene_root也能读 ...

这里是预先缓存比较重要的图片文件。删掉这些代码其实问题也不会太大。
作者: doranikofu    时间: 2015-11-16 01:50
taroxd 发表于 2015-11-15 16:06
这里是预先缓存比较重要的图片文件。删掉这些代码其实问题也不会太大。 ...

发现loadPicture也有同样的问题啊
给物品读大图标,第一次打开看不到图 第二次就可以了,应该就是这个读取不同步的问题
菜单在Scene_boot预读倒是无所谓,物品图标就不行了
请问下具体要怎么用addLoadListener?不太熟悉js基本就是这里挖一点别人的脚本那一改一下
是要在函数里面写一个等待的功能么?
作者: taroxd    时间: 2015-11-16 06:50
doranikofu 发表于 2015-11-16 01:50
发现loadPicture也有同样的问题啊
给物品读大图标,第一次打开看不到图 第二次就可以了,应该就是这个读 ...


bitmap.addLoadListener(func)

在图片载入完成时执行 func 函数。如果图片已经载入,则立刻执行
作者: doranikofu    时间: 2015-11-16 14:54
taroxd 发表于 2015-11-16 06:50
bitmap.addLoadListener(func)

在图片载入完成时执行 func 函数。如果图片已经载入,则立刻执行 ...

试着这样貌似不行
bitmap.addLoadListener(this.contents.blt(bitmap, sx, sy, pw, ph, x, y, 144, 144));
不是太懂深层的东西,基本就是要读取完毕之后再draw
不知道用这个能不能简单的实现
看英文论坛也有人遇到这种问题 最后是决定提前把图片读一遍
要是有比较泛用的方法就好了
见过几个插件似乎都没有碰到这种问题,不知道具体是个啥情况
自定菜单人物图的脚本直接在Window_MenuStatus.prototype.drawItemImage里面loadPicture然后blt就读出来了。。。
作者: taroxd    时间: 2015-11-16 15:18
doranikofu 发表于 2015-11-16 14:54
试着这样貌似不行
bitmap.addLoadListener(this.contents.blt(bitmap, sx, sy, pw, ph, x, y, 144, 144)) ...


参数应该是一个函数,不是 blt 的返回值。

参考:https://github.com/taroxd/RPGMV-Taiko/blob/master/js/view.js (在页面中搜索 addLoadListener)
作者: trentswd    时间: 2015-11-16 21:47
这样试试看
  1. bitmap.addLoadListener(function(){
  2. this.contents.blt(bitmap, sx, sy, pw, ph, x, y, 144, 144);
  3. });
复制代码
我对js的闭包不是很了解,错了不管
作者: doranikofu    时间: 2015-11-17 14:28
本帖最后由 doranikofu 于 2015-11-17 14:33 编辑
trentswd 发表于 2015-11-16 21:47
这样试试看我对js的闭包不是很了解,错了不管

开始出了几次错误
Uncaught TypeError: Cannot read property 'blt" of undefined

参考了下8L的 试了下面的也是同样的错误
    bitmap.addLoadListener(function() {
        this.content.blt(bitmap, sx, sy, pw, ph, x, y, 144, 144);
    }.bind(this));

然后后来试了几次突然好了 。。。不知道哪个地方写抽了可能
感谢菊苣帮助




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1