赞 | 12 |
VIP | 0 |
好人卡 | 0 |
积分 | 8 |
经验 | 0 |
最后登录 | 2023-12-10 |
在线时间 | 57 小时 |
Lv2.观梦者
- 梦石
- 0
- 星屑
- 779
- 在线时间
- 57 小时
- 注册时间
- 2019-10-9
- 帖子
- 136
|
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一样,然后再考虑怎么把缓冲区的数据一个个读出来,交给场景去处理。
具体使用这些 ...
|