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

Project1

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

[有事请教] 需要在队伍类.加入角色()时显示对话文本,如何刷新脸图绘制

[复制链接]

Lv2.观梦者

梦石
0
星屑
779
在线时间
57 小时
注册时间
2019-10-9
帖子
136
跳转到指定楼层
1
发表于 2023-6-2 16:59:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
200星屑
本帖最后由 hsy_999999999 于 2023-6-2 22:22 编辑

我打算在 角色加入时  (代码判断) 展示一个对话框,上面写几句台词

虽然我明白在 数据类 里操作 窗口/画面类 是很不好的现像(例如操作 开关或变量 更快捷合理)

但我打算尝试一些有点难度的操作, 出现了一个bug:  当一次性加入多个角色(使用了编辑器--事件)时  多句"对话本文"正常刷新了, 他们的"名字"和"脸图"却没有刷新

代码大致是这样写的:

var hsyq22_addActor=Game_Party.prototype.addActor
// 增加角色(加入队员)
Game_Party.prototype.addActor = function(actorId) {
   if ( !this._actors.includes(actorId)   ) {  

$gameMessage.setFaceImage(某某某);
$gameMessage.setSpeakerName(某某某);
$gameMessage.add( 某某某);

$gameMessage.newPage();      //文本刷新了      //名字和脸图没有刷新(只显示 最后一个 加入的队员)       

SceneManager._scene._messageWindow.某某某() ;   //尝试了多个方法,似乎都无效


}
hsyq22_addActor.call(this,actorId)  //原         
};





============================================================================================
==================问题解决了,具体做法是:

1-- $gameMessage.newPage();   放 $gameMessage.add(某某某); 上面, 有个最后一次重复的bug

2--在方法外部设置 4个自定义堆栈标记的全局数组, 也可以用$gameTemp.某某某 属性

然后将 4个  $gameMessage.set某某某(某某某);  改成 堆栈到  4个自定义堆栈标记的全局数组 里
如:   
hsyq22.mingzi_duizhan.push( hsyq22.jiaru["jiaru_"+actorId][1] );  

3-- 发现$gameMessage.newPage()会调用Window_Message里的.newPage
在Window_Message.prototype.newPage = function(textState) { 里判断上面堆栈的标记
如:
if ( hsyq22.mingzi_duizhan && hsyq22.mingzi_duizhan[0] ){
//console.log( hsyq22.mingzi_duizhan )
//console.log( hsyq22.liantu_duizhan[0] )
//console.log( hsyq22.weizhi_duizhan )
//console.log( hsyq22.beijing_duizhan )
        $gameMessage.setSpeakerName( hsyq22.mingzi_duizhan[0] );   hsyq22.mingzi_duizhan.shift();
}

4-- 解决了 名字和脸图不冒泡的问题 , 又发现窗口位置和透明度却依然无法冒泡,原因是缺少两个更新方法

this.updatePlacement();       //new // 更新放置位置(上/中/下[默认])
this.updateBackground();      //new  // 更新背景(的透明度)


5-- 又发现 对话框 旁边的 小名称框 位置不会变化,以及绘制文字的x轴位置不对,再次增加两句代码

this._nameBoxWindow.start()   //new  // 开始 创建/更新  地图对话框 旁边的 小名称框 (的所有)
textState.startX=152;         //new 手动增加一个脸图的间隔 (128+24)



===============================ok了


最佳答案

查看完整内容

$gameMessage.setFaceImage()和$gameMessage.setSpeakerName()不像$gameMessage.add()一样维护着自己的一个缓冲区,所以最新的操作会覆盖旧的操作,而不是像add()一样把调用过的行为都记录下来,并全部输出到屏幕上。 而实际要做到像事件那样弹三次对话窗口,表现也跟事件一样的话,需要有能维护一个缓冲区的能力,就像$gameTemp.requestAnimation一样,然后再考虑怎么把缓冲区的数据一个个读出来,交给场景去处理。 具体使用这些 ...
作者习惯写php(不再写mz以外的 其他rm版本).
论坛不常在,有事可以qq联系我 766336948.

Lv3.寻梦者

梦石
0
星屑
4914
在线时间
445 小时
注册时间
2011-3-26
帖子
101
2
发表于 2023-6-2 16:59:09 | 只看该作者
$gameMessage.setFaceImage()和$gameMessage.setSpeakerName()不像$gameMessage.add()一样维护着自己的一个缓冲区,所以最新的操作会覆盖旧的操作,而不是像add()一样把调用过的行为都记录下来,并全部输出到屏幕上。
而实际要做到像事件那样弹三次对话窗口,表现也跟事件一样的话,需要有能维护一个缓冲区的能力,就像$gameTemp.requestAnimation一样,然后再考虑怎么把缓冲区的数据一个个读出来,交给场景去处理。
具体使用这些数据的细节涉及场景们各自的update函数,可能有现成的可复用功能,也可能自己写。标记待更,也作抛砖引玉。

点评

感谢大佬提供思路  发表于 2023-6-2 22:09
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-3 18:15

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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