查看: 3384|回复: 6

[有事请教] JS菜单显示头像问题

[复制链接]
梦石
0
星屑
79
在线时间
7 小时
注册时间
2017-11-20
回帖
2
发表于 2018-7-4 15:27:39 | 显示全部楼层 |阅读模式

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

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

×
大家好,我最近在用RMMV做一个游戏。在自己修改UI的时候遇到一个问题,就是菜单显示头像这里有个迷之BUG。
初始化的时候头像全都看不到,然后翻页之后会刷新出来。很奇怪,然后我写了个方法遍历select一遍,有时候有用有时候没用玄学问题非常讨人厌啊。
梦石
0
星屑
4716
在线时间
501 小时
注册时间
2013-12-7
回帖
333

极短28参与极短27参与

发表于 2018-7-4 16:33:05 | 显示全部楼层
你绘制头像用的什么方法发一下啊。
回复

使用道具 举报

梦石
0
星屑
79
在线时间
7 小时
注册时间
2017-11-20
回帖
2
 楼主| 发表于 2018-7-4 17:35:40 | 显示全部楼层
ekmomo 发表于 2018-7-4 16:33
你绘制头像用的什么方法发一下啊。


[pre lang="javascript"]Shelter_Window_MenuStatus.prototype.drawItemImage = function(index) {
    var actor = $gameParty.members()[index];
    var rect = this.itemRect(index);
    this.drawActorFace(actor, rect.x + 2, rect.y + 2, 61, 61);
    this.changePaintOpacity(true);
};

Shelter_Window_MenuStatus.prototype.drawActorFace = function(actor, x, y, width, height) {
    this.drawFace(actor._name, x, y, width, height);
};

Shelter_Window_MenuStatus.prototype.drawFace = function(actorName, x, y, width, height) {
    var pw = 61;
    var ph = 61;
    var dx = Math.floor(x + Math.max(width - pw, 0) / 2);
    var dy = Math.floor(y + Math.max(height - ph, 0) / 2);
    var bitmap = ImageManager.loadBitmap("img/system/menu/head/",actorName);
    this.contents.blt(bitmap, 0, 0, pw, ph, dx, dy);
};[/pre]


感觉跟原生的区别不大啊……而且现在变成有一个Scene能正常显示,有一个Scene只有翻页之后才会显示出来
回复

使用道具 举报

梦石
0
星屑
4716
在线时间
501 小时
注册时间
2013-12-7
回帖
333

极短28参与极短27参与

发表于 2018-7-4 19:14:17 | 显示全部楼层
本帖最后由 ekmomo 于 2018-7-4 20:35 编辑

这是因为图片没有被预加载的原因。
你看原生方法在创建场景的时候调用了Window_Base.prototype.reserveFaceImages。

  1. Scene_Menu.prototype.createStatusWindow = function() {
  2.     this._statusWindow = new Window_MenuStatus(this._commandWindow.width, 0);
  3.     this._statusWindow.reserveFaceImages();
  4.     this.addWindow(this._statusWindow);
  5. };
复制代码


blt 是MV的方法,它本质上是直接使用了canvas 的drawImage方法,这个方法只有在图片加载完以后才能绘制图形。
脚本无论是跑到reserveFaceImages还是blt方法上都会执行一次new Image().也只有经过了new Image() drawImage才能正确绘制。
所以你需要在窗口被第一次显示前使用ImageManager.reserveBitmap方法。

如果你对游戏运行效率没有求的话,直接new Sprite()然后把它插入到舞台(场景或者窗口)中就好了。
可以参考下面的代码,我这里用的是一个scene,插在window里方法是一样的:
[pre lang="javascript"]    SceneManager._scene._backSprite = new Sprite();
SceneManager._scene._backSprite.bitmap = ImageManager.loadSystem('GameOver');
SceneManager._scene._backSprite.x = 100;
SceneManager._scene.addChild(SceneManager._scene._backSprite);[/pre]
回复

使用道具 举报

梦石
0
星屑
79
在线时间
7 小时
注册时间
2017-11-20
回帖
2
 楼主| 发表于 2018-7-6 10:51:42 | 显示全部楼层
ekmomo 发表于 2018-7-4 19:14
这是因为图片没有被预加载的原因。
你看原生方法在创建场景的时候调用了Window_Base.prototype.reserveFace ...

非常感谢,但是其实我有写预加载的loadImage方法。甚至还试过全部加在到数组里,然后挨个判断人名来贴图的方法。最后都没什么成效。昨天跟朋友聊了下,在Scene里加了个刷新,问题解决了。

点评

解决了就好。:)  发表于 2018-7-6 11:05
你应该把预加载写在窗口显示前一秒,推荐Scene.prototype.start  发表于 2018-7-6 11:04
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部