Project1

标题: JS菜单显示头像问题 [打印本页]

作者: Nasca    时间: 2018-7-4 15:27
标题: JS菜单显示头像问题
大家好,我最近在用RMMV做一个游戏。在自己修改UI的时候遇到一个问题,就是菜单显示头像这里有个迷之BUG。
初始化的时候头像全都看不到,然后翻页之后会刷新出来。很奇怪,然后我写了个方法遍历select一遍,有时候有用有时候没用玄学问题非常讨人厌啊。
作者: ekmomo    时间: 2018-7-4 16:33
你绘制头像用的什么方法发一下啊。
作者: Nasca    时间: 2018-7-4 17:35
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只有翻页之后才会显示出来
作者: ekmomo    时间: 2018-7-4 19:14
本帖最后由 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);


作者: Nasca    时间: 2018-7-6 10:51
ekmomo 发表于 2018-7-4 19:14
这是因为图片没有被预加载的原因。
你看原生方法在创建场景的时候调用了Window_Base.prototype.reserveFace ...

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




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