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

Project1

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

[有事请教] 有木有大佬知道选项选择的脚本代码是什么,不是只能看...

[复制链接]

Lv3.寻梦者

梦石
0
星屑
2866
在线时间
446 小时
注册时间
2016-9-26
帖子
1223
跳转到指定楼层
1
发表于 2021-12-1 21:03:52 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
300星屑
有木有大佬知道选项选择的脚本代码是什么,不是只能看那种,要能触发的,论坛里貌似找不到呢(百度也没有),
指的对话选择里的那种

最佳答案

查看完整内容

function choiceTest(){ choices = []; params = []; $gameMessage.setChoices(choices, 0,1) choices.push("选项1");choices.push("选项2"); choices.push("选项3");choices.push("选项4"); params.push(); $gameMessage.setChoiceCallback((n)=>{//设置选择选项执行的回调方法 if(n==0){//第一个选项选中后执行 console.log('0123'); } if(n==1){//第2个选项选中后执行 console.log(123); } if(n==2){// ...

Lv3.寻梦者

梦石
0
星屑
1830
在线时间
314 小时
注册时间
2021-11-7
帖子
165
来自 2楼
发表于 2021-12-1 21:03:53 | 只看该作者
本帖最后由 夏虫沉默 于 2021-12-2 09:23 编辑

JAVASCRIPT 代码复制
  1. function choiceTest(){
  2. choices = []; params = [];
  3. $gameMessage.setChoices(choices, 0,1)
  4. choices.push("选项1");choices.push("选项2");
  5. choices.push("选项3");choices.push("选项4");
  6. params.push();
  7. $gameMessage.setChoiceCallback((n)=>{//设置选择选项执行的回调方法
  8.                         if(n==0){//第一个选项选中后执行
  9.                                 console.log('0123');
  10.                         }
  11.                         if(n==1){//第2个选项选中后执行
  12.                                 console.log(123);
  13.                         }
  14.                         if(n==2){//第3个选项选中后执行
  15.                                 console.log(23);
  16.                         }
  17.                         if(n==3){//第4个选项选中后执行
  18.                                 console.log(3);
  19.                         }
  20.                 }
  21.         );
  22. }

       

点评

至于回调函数,是个好东西呢,唔,以后有时间和精神再慢慢研究吧,暂时能用就行,说不定用着用着就懂了,唔  发表于 2021-12-2 12:28
至于什么新写法,我其实连j语言都没学过,全靠盲猜的(俺寻思之力,今年五月份之前我甚至都没用过脚本),插件调用也是这两天偶然新学的  发表于 2021-12-2 12:25
改成function也可以,ES6以后就可以使用箭头函数了,MV的ES版本虽然不是最新的,但是ES6的写法都是通用的  发表于 2021-12-2 12:24
话说,我改成普通的function函数应该没问题吧,有点怕箭头函数不是那么通用  发表于 2021-12-2 12:21
这是箭头函数=>和回调方法的写法,我发过一篇简短的关于js新写法的帖子,你可以参考下  发表于 2021-12-2 11:47

评分

参与人数 1+1 收起 理由
任小雪 + 1 精品文章(非常认可)

查看全部评分

欲速春风山劝阻,不得恰恰不得呼。
回复

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1830
在线时间
314 小时
注册时间
2021-11-7
帖子
165
3
发表于 2021-12-1 22:16:15 | 只看该作者
我在rpg_windows.js文件下3935行找到以下方法
JAVASCRIPT 代码复制
  1. Window_ChoiceList.prototype.callOkHandler = function() {//调用“确定”的处理方法
  2.     $gameMessage.onChoice(this.index());//当前行被选中时
  3.     this._messageWindow.terminateMessage();
  4.     this.close();
  5. };

在rpg_object.js文件下9116行找到以下方法
JAVASCRIPT 代码复制
  1. // When [**]这个可能是选项被选中时
  2. Game_Interpreter.prototype.command402 = function() {
  3.     if (this._branch[this._indent] !== this._params[0]) {
  4.         this.skipBranch();
  5.     }
  6.     return true;
  7. };

点评

用事件做,选项不灵活;用脚本做,无法判断选项的获取;这个问题我1个月前也遇到,所以我干脆用新窗口和新视图。  发表于 2021-12-2 00:19
看着简单,但是写脚本就是憋不出来,我全物品商店都能用脚本表达  发表于 2021-12-2 00:07
主要是,可能需要“如果选择某某某”,可是,不知道代码怎么写,绝汪的法子只有一半(只能看的,而且不知道是不是其实也是错的)  发表于 2021-12-2 00:03
摸了半天摸不出来,我也用的小白机翻  发表于 2021-12-2 00:01
这个是我找到的可能相关的代码,还没有范例,应该要先判断是否处于选择窗口,监听键盘确认键和鼠标点击键,我目前只是入门的水准,大佬不敢当  发表于 2021-12-1 23:56
欲速春风山劝阻,不得恰恰不得呼。
回复

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1375
在线时间
580 小时
注册时间
2019-6-30
帖子
259
4
发表于 2021-12-2 00:04:16 | 只看该作者
choices = []; params = [];
$gameMessage.setChoices(choices, 0)
choices.push("I love you1");choices.push("I love you2");
choices.push("I love you3");choices.push("I love you4");
choices.push("I love you5");choices.push("I love you6");
choices.push("I love you7");choices.push("I love you8");
params.push()
是不是这个?

点评

问题是这个只能看,不能用啊,完全没法像事件那样触发  发表于 2021-12-2 00:06
回复

使用道具 举报

Lv5.捕梦者

梦石
16
星屑
12097
在线时间
1417 小时
注册时间
2020-3-21
帖子
365

极短23获奖

5
发表于 2021-12-2 01:05:06 | 只看该作者


SceneManager._scene._messageWindow._choiceWindow.processOk()
相当于玩家按下确认键。


SceneManager._scene._messageWindow._choiceWindow.select(选项编号)
让选项框选择某个选项。


已测试无误。


SceneManager是管理场景变动的静态对象,它的_scene属性是指当前的场景(在地图上的时候就是指Scene_Map)。
_messageWindow是Scene_Map下的一个管理信息窗口的窗口对象,是Window_Message的实例。
_choiceWindow是_messageWindow下的选项选项的窗口对象,是Window_ChoiceList的实例。
那指令的意思就是执行选择选项的那个窗口实例(地址在SceneManager._scene._messageWindow._choiceWindow)的processOk函数或select函数。

回复

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2866
在线时间
446 小时
注册时间
2016-9-26
帖子
1223
6
 楼主| 发表于 2021-12-2 07:26:51 | 只看该作者
仇九 发表于 2021-12-2 01:05
SceneManager._scene._messageWindow._choiceWindow.processOk()
相当于玩家按下确认键。

choices = []; params = [];
$gameMessage.setChoices(choices, "选项1")
choices.push("选项1");choices.push("选项2");
choices.push("选项3");choices.push("选项4");
choices.push("选项5");choices.push("选项6");
params.push()
if (SceneManager._scene._messageWindow._choiceWindow.select(0)&&SceneManager._scene._messageWindow._choiceWindow.processOk()){console.log("1");};
差那么一丢丢判定……现在貌似是在自动给我选择选项了
回复

使用道具 举报

Lv5.捕梦者

梦石
16
星屑
12097
在线时间
1417 小时
注册时间
2020-3-21
帖子
365

极短23获奖

7
发表于 2021-12-2 09:52:59 | 只看该作者
本帖最后由 仇九 于 2021-12-2 10:15 编辑
任小雪 发表于 2021-12-2 07:26
choices = []; params = [];
$gameMessage.setChoices(choices, "选项1")
choices.push("选项1");choices ...


呃……我还以为你想知道的是“在选择选项的时候,如何在玩家不自己按下确认键的时候,系统帮助玩家按下确认键,也就是选择选项/选项选择”。
你这么做是想让选项框里的文字能动态变化吗?


如果单纯显示的话,那这样就行:
this._params = [["测试1","测试2"],1,0,2,0];
this._indent = 0;
this.command102();


其中this._params的详细格式是这样:

[选项数组,取消选项,默认选项,窗口位置类型,背景类型]

选项数组:选项的文字,比如["测试1","测试2"]
取消选项:写-2时代表分支,
        写-1时代表不允许,
        写0时代表选项1(选项1代表选项数的第一个元素,也就是上面的"测试1"),
        写1时代表选项2(选项2代表选项数的第二个元素,也就是上面的"测试2"),
        以此类推。
默认选项:写-1时代表无默认选项。
        写0时代表选项1(选项1代表选项数的第一个元素,也就是上面的"测试1"),
        写1时代表选项2(选项2代表选项数的第二个元素,也就是上面的"测试2"),
        以此类推。
窗口位置类型:0代表左侧,1代表中间,2代表右侧。
背景类型:0代表窗口,1代表暗淡,2代表透明。



但是这样还是只能看不能选(实际上所谓的不能选是说不能指定选择哪个选项后执行哪些指令吧?我还是不确定你到底问的是啥,如果能说得更清楚些就好了。)
如果要为每个选项添加对应的指令的话在下面再添加一个“事件指令中的选项”就好了。
看下面这个图中的例子:

一看会觉得系统会先显示一个有"测试1"和"测试2"两个选项的窗口,然后再显示一个有"1","2","3","4","5"五个选项的窗口,但实际上不是。
系统会显示一个有"测试1"和"测试2"两个选项的窗口,

如果你选择了"测试1",那么直接就会执行下方那个选项指令中第一个选项框的console.log("选择了选项1"),然后执行下方的console.log("选项完全结束");,
若是选择了"测试2",那么直接就会执行下方那个选项指令中第二个选项框的console.log("选择了选项2"),然后执行下方的console.log("选项完全结束");。
也就是说上方的那个脚本指令中的内容覆盖了下方选项框中的设定。永远不会显示那个有"1","2","3","4","5"五个选项的窗口。
而且在这种情况下下方的console.log("选择了选项3"),console.log("选择了选项4")和console.log("选择了选项5")都不可能执行,因为你上面只有["测试1","测试2"]两个选项。
如果再添加一个"测试3",也就是说变成["测试1","测试2","测试3"],那么玩家选择"测试3"的时候就会执行console.log("选择了选项3"),然后再执行console.log("选项完全结束");。
这应该能满足我理解的那个需求了。



按照上方的那个要求,只执行脚本而不执行事件指令那很简单,这样就行:
this._params = [["测试1","测试2"],1,0,2,0];
this._indent = 0;
this.command102();
$gameMessage.setChoiceCallback((n)=>{
    if(n==0){console.log('0123');}
    if(n==1){console.log(123);}
    if(n==2){console.log(23);}
    if(n==3){console.log(3);}
}
这个和2楼的脚本等同。

点评

Emmm……看来我理解的没问题,不过你要是想在选择某个选项后不止有脚本,还有别的事件指令那还是得用这个方法~  发表于 2021-12-2 10:08
不过,话说自动点击这东西说不定哪里会用到(不是在点名某小恶魔之刀,咳咳)  发表于 2021-12-2 10:01
有点复杂(咳咳),不过楼上的大佬已经解决啦,啊哈哈哈哈哈哈哈哈哈哈哈……  发表于 2021-12-2 09:58
谢谢  发表于 2021-12-2 09:56

评分

参与人数 1+1 收起 理由
任小雪 + 1 精品文章(虽然可能限制用不到,但说不定未.

查看全部评分

回复

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2866
在线时间
446 小时
注册时间
2016-9-26
帖子
1223
8
 楼主| 发表于 2021-12-2 10:20:21 | 只看该作者
仇九 发表于 2021-12-2 09:52
呃……我还以为你想知道的是“在选择选项的时候,如何在玩家不自己按下确认键的时候,系统帮助玩家按下确 ...

不是不是,其实我所求的,不过是将原本的事件脚本化(自制的全员插件)而已,当然,暂时还有其他一些事件也是没攻关的,
这个选项事件,是我在玩家取消锻造时确定确实要取消锻造时会用到(暂时)
知识盲区有很多,暂时比较明显的变成游戏的全存档变量了(玩家用的窗口色调调整卡会用到,指,完全关掉游戏再点开时能用到)
回复

使用道具 举报

Lv2.观梦者

梦石
0
星屑
910
在线时间
14 小时
注册时间
2015-5-14
帖子
5
9
发表于 2021-12-27 11:44:56 | 只看该作者
好东西,收藏了

点评

对话系统的数值输入等,还有公共事件的等待机制还是无解,然后插件和事件的区别还有各种迷,建议中西结合  发表于 2021-12-27 12:14
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-27 09:54

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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