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

Project1

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

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

[复制链接]

Lv1.梦旅人

梦石
0
星屑
79
在线时间
7 小时
注册时间
2017-11-20
帖子
3
跳转到指定楼层
1
发表于 2018-7-4 15:27:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
大家好,我最近在用RMMV做一个游戏。在自己修改UI的时候遇到一个问题,就是菜单显示头像这里有个迷之BUG。
初始化的时候头像全都看不到,然后翻页之后会刷新出来。很奇怪,然后我写了个方法遍历select一遍,有时候有用有时候没用玄学问题非常讨人厌啊。

Lv3.寻梦者

梦石
0
星屑
3419
在线时间
461 小时
注册时间
2013-12-7
帖子
333
2
发表于 2018-7-4 16:33:05 | 只看该作者
你绘制头像用的什么方法发一下啊。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
79
在线时间
7 小时
注册时间
2017-11-20
帖子
3
3
 楼主| 发表于 2018-7-4 17:35:40 | 只看该作者
ekmomo 发表于 2018-7-4 16:33
你绘制头像用的什么方法发一下啊。


JAVASCRIPT 代码复制
  1. Shelter_Window_MenuStatus.prototype.drawItemImage = function(index) {
  2.     var actor = $gameParty.members()[index];
  3.     var rect = this.itemRect(index);
  4.     this.drawActorFace(actor, rect.x + 2, rect.y + 2, 61, 61);
  5.     this.changePaintOpacity(true);
  6. };
  7.  
  8. Shelter_Window_MenuStatus.prototype.drawActorFace = function(actor, x, y, width, height) {
  9.     this.drawFace(actor._name, x, y, width, height);
  10. };
  11.  
  12. Shelter_Window_MenuStatus.prototype.drawFace = function(actorName, x, y, width, height) {
  13.     var pw = 61;
  14.     var ph = 61;
  15.     var dx = Math.floor(x + Math.max(width - pw, 0) / 2);
  16.     var dy = Math.floor(y + Math.max(height - ph, 0) / 2);
  17.     var bitmap = ImageManager.loadBitmap("img/system/menu/head/",actorName);
  18.     this.contents.blt(bitmap, 0, 0, pw, ph, dx, dy);
  19. };



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

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3419
在线时间
461 小时
注册时间
2013-12-7
帖子
333
4
发表于 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里方法是一样的:
JAVASCRIPT 代码复制
  1. SceneManager._scene._backSprite = new Sprite();
  2. SceneManager._scene._backSprite.bitmap = ImageManager.loadSystem('GameOver');
  3. SceneManager._scene._backSprite.x = 100;
  4. SceneManager._scene.addChild(SceneManager._scene._backSprite);

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
79
在线时间
7 小时
注册时间
2017-11-20
帖子
3
5
 楼主| 发表于 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
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-1 19:39

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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