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

Project1

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

[有事请教] “当前选中的物品”脚本问题。

[复制链接]

Lv4.逐梦者

梦石
0
星屑
5405
在线时间
1105 小时
注册时间
2013-7-8
帖子
2005

极短23参与

跳转到指定楼层
1
发表于 2022-7-8 17:08:37 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

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

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

x

这段脚本的功能是使得“actoritem”成为当前选中物品的实例,“actor”是某个角色,这个角色的ID为所选物品的ID,然后在另一个窗口显示这个角色的脸图。
运行起来存在一个问题,当第一次调用这个函数的时候,总会先显示一个“空的”图像在应该显示角色的位置,当第二次再调用的时候才会正常显示对应角色的脸图,请问大佬们,这是什么原因?

Lv3.寻梦者

梦石
0
星屑
4362
在线时间
358 小时
注册时间
2020-1-29
帖子
200
5
发表于 2022-7-9 11:14:35 | 只看该作者
学习了,
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
5405
在线时间
1105 小时
注册时间
2013-7-8
帖子
2005

极短23参与

4
 楼主| 发表于 2022-7-8 22:00:35 | 只看该作者
仇九 发表于 2022-7-8 20:18
ruby和javascript加载图片的机理不太一样。

可以理解为:

十分感谢。
但是我的这个窗口的超类就是Window_StatusBase,在initialize的时候,它也应该自己加载过了脸图,但是还是无法显示,即便我在这个窗口调用了加载脸图的函数,甚至在Scene界面也调用了,问题仍旧没有解决,还是得按第二下才会出图,这是什么况且嘞?



点评

十分感谢你的帮助!  发表于 2022-7-8 23:15
那就对了,修改一下范围,遍历所有角色……  发表于 2022-7-8 23:03
我想我大概明白了,这里读取的是$gameParty.members()的脸图,是团队中所有的角色,而我是在数据库直接提取随便一个角色的脸图,它应该没有加载。  发表于 2022-7-8 22:13
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
16
星屑
12055
在线时间
1412 小时
注册时间
2020-3-21
帖子
365

极短23获奖

3
发表于 2022-7-8 20:18:58 | 只看该作者
ruby和javascript加载图片的机理不太一样。

可以理解为:
va中的图片完全是同步加载的,意思就是说只有这张图片加载完毕后,才会进行渲染,然后继续执行下面的指令;相当于读取图片时阻碍了脚本的继续执行,阻塞。

但是mz中提供的读取图片的接口是异步的,执行drawActorsFace的时候,这个指令内部在加载图片,图片还没有加载完的时候就渲染,然后下面的指令也继续执行。
因为渲染或者绘制的时候图片还没有加载完,所以无法正常绘制,这个问题从mv到mz都没有解决。
也就是说,必须在图片加载完成后再执行一次drawActorsFace进行绘制。

至于解决办法的话有许多,根据插件的性质来设计。

这里最简单的办法是从参考mz自己的解决办法:
rmmz的1.5.0版本的核心文件rmmz_windows.js中1683行的解决办法:

JAVASCRIPT 代码复制
  1. function Window_StatusBase() {
  2.     this.initialize(...arguments);
  3. }
  4.  
  5. Window_StatusBase.prototype = Object.create(Window_Selectable.prototype);
  6. Window_StatusBase.prototype.constructor = Window_StatusBase;
  7.  
  8. Window_StatusBase.prototype.initialize = function(rect) {
  9.     Window_Selectable.prototype.initialize.call(this, rect);
  10.     this._additionalSprites = {};
  11.     this.loadFaceImages();
  12. };
  13.  
  14. Window_StatusBase.prototype.loadFaceImages = function() {
  15.     for (const actor of $gameParty.members()) {
  16.         ImageManager.loadFace(actor.faceName());
  17.     }
  18. };



说白了,就是在initialize窗口的时候就完全将所有的角色脸图都读取一遍,相当于在绘制前就已经预读取了。
绘制的时候就已经加载完脸图,可以正常绘制了。

Window_StatusBase是菜单中的一个窗口,放到场景scene中的initialize中大概也行......

点评

我刚学写插件的时候这个问题折腾得我烦躁了好几天……  发表于 2022-7-8 20:20
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
5405
在线时间
1105 小时
注册时间
2013-7-8
帖子
2005

极短23参与

2
 楼主| 发表于 2022-7-8 19:03:57 | 只看该作者
本帖最后由 我是大仙 于 2022-7-8 19:27 编辑

然而在RMVA里写一个同样的脚本就没有问题。
new_test.zip (1.43 MB, 下载次数: 4)
是否是我的编写格式出错了?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-16 07:07

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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