骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 小黑盒加速器
查看: 1819|回复: 2

[功能与代码] 打败引擎硬核---如何屏蔽大地图下方所有按钮并跳转

[复制链接]

202

主题

984

回帖

986

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
2893127
第纳尔
14521
精华
0
互助
90
荣誉
18
贡献
325
魅力
775
注册时间
2017-11-5
鲜花(428) 鸡蛋(0)
发表于 2022-10-18 10:20:58 | 显示全部楼层 |阅读模式
本帖最后由 vegetto 于 2022-10-27 07:55 编辑

前言:我的全体mod都是以txt为基础,所以局部变量都是采用var的写法pos什么不考虑复用slot都是数字序号,你们重在理解即可。且我只讲自己研究的部分,涉及前人的成果的其他办法请自行搜索查找,莫一代代陷入重复劳动和仿写的循环中。https://bbs.mountblade.com.cn/thread-2094114-1-1.html这个是我一系列骑砍战团模型程序研究成果的目录篇,用来汇集一些分散的我的技术贴,还没更新多少,将会持续更新一些你们不常见的冷门技术。(759523711我的魔兽争霸mod开发群可以加群学习,定时分享一些其他技术成果,来自我的一系列自制mod https://bbs.mountblade.com.cn/thread-2093251-1-1.html的研究)

程序部分内容只允许在2021年以后(含2021)发布的非子mod非使用20个以上他人osp的mod使用。
也就是你是2021年以前发布的mod,或者是人家成熟mod的子mod,或使用了其他人20个以上osp功能的非原创杂交mod,这3类mod不可以使用我的相关成果,包括后面其他成果分享也是这个要求。并且不可以通过改写优化的方式进行加工重新发布新贴osp以及改版后传播他人,目的就是希望你们原创并且有独立思考,避免所有人都学一套模板一家之言,mod内容越做越像越来越杂交。


以下正文:
基本原理:鼠标在按钮的屏幕坐标范围点击时跳转其他界面或菜单,使得原本按钮跳转的功能来不及反应,
深层解读:代码按次序执行,同一个文件不同触发器写同一串代码,和不同文件写同一串代码,他们执行次序是有先后的,并不是因为运行速度快,就像同时触发一样,像界面系统普遍先执行于引擎按钮和mt,如果前者抢先调转其他界面,后者就没机会执行。
代码参考:

加入simper trigger.Py,条件可采用0.000000

(set_fixed_point_multiplier, 1000),
(mouse_get_position, pos1),  #表示获取鼠标位置,一般获得的坐标值是按照屏幕横向总长度1000来取相对值,即看作屏幕二维坐标;但是注意大地图  (position_get_screen_projection, pos2, pos1),这个将3维pos1转化pos2屏幕2维坐标操作是没用的不要瞎用。
(position_get_x, ":var_0", pos1),
(position_get_y, ":var_1", pos1),
(try_begin),
    (this_or_next|key_clicked, key_right_mouse_button),   #这个可以不要,因为为方便按鼠标左右键均可触发,但一般只需要左键  ,记得到header_triggers.py记一下所有按键的拼写,你们可能还不知道鼠标除了滚轮有八个点击键,虽然我鼠标最多才有6个键,或者你们是不是可以把按钮魔改一下名称,比如“物品”写成“玩家物品/npc物品”,然后设定鼠标左键跳什么,右键跳什么,一个按钮两用,所以多想想,同一个东西可以玩出多样
    (key_clicked, key_left_mouse_button),
    (try_begin),
        (is_between, ":var_0", 0, 110),  #表示鼠标的横坐标在0,110即0<x<110,因为通过测量,大地图下面第一个按钮是从x=0开始,大致110长,40宽,然后右边按钮依此按110长,40宽水平顺接
        (is_between, ":var_1", 0, 40),  #表示鼠标的纵坐标在0,40
        (jump_to_menu, "mnu_覆盖原地形按钮跳转自己设"),
    (else_try),
        (is_between, ":var_0", 110, 220),
        (is_between, ":var_1", 0, 40),
        (jump_to_menu, "mnu_覆盖原扎营按钮跳转自己设"),
    (else_try),
        (is_between, ":var_0", 220, 330),
        (is_between, ":var_1", 0, 40),
        (jump_to_menu, "mnu_覆盖原报告按钮跳转自己设"),
    (else_try),
        (is_between, ":var_0", 330, 440),
        (is_between, ":var_1", 0, 40),
        (jump_to_menu, "mnu_覆盖原记录按钮跳转自己设"),
    (else_try),
        (is_between, ":var_0", 440, 550),
        (is_between, ":var_1", 0, 40),
        (jump_to_menu, "mnu_覆盖原物品按钮跳转自己设"),
    (else_try),
        (is_between, ":var_0", 550, 660),
        (is_between, ":var_1", 0, 40),
        (jump_to_menu, "mnu_覆盖原角色按钮跳转自己设"),
    (else_try),
        (is_between, ":var_0", 660, 770),
        (is_between, ":var_1", 0, 40),
        (jump_to_menu, "mnu_覆盖原部队按钮跳转自己设"),
    (try_end),
(try_end),

--------------------------------------------------------------------------------------------------局限对比:--------------------------------------------------------------------------------------------------------

过去的一般手段:引擎调用脚本前屏蔽,但是局限是不能解决大地图所有按钮的跳转,只针对部分。

本手段局限:不能屏蔽快捷键操作,可以让玩家不要按或通过改键到不常用键位

--------------------------------------------------------------------------------------------------引申做法:--------------------------------------------------------------------------------------------------------
此外,你也可以将这个跳转到一个界面系统,在大地图上做界面或者跳转到一个场景做presentation界面

加入simper trigger.Py,条件可采用0.000000
    (try_begin),
        (mouse_get_position, pos1),
        (position_get_x, ":var_6", pos1),
        (position_get_y, ":var_7", pos1),
        (is_between, ":var_6", 0, 770),
        (is_between, ":var_7", 0, 40),
        (neg|is_presentation_active, "prsnt_doom2"),
        (this_or_next|key_clicked, key_left_mouse_button),
        (key_clicked, key_right_mouse_button),
        (start_presentation, "prsnt_doom2"),
    (try_end),

不多解释,意思就是按了大地图下面有按钮的屏幕范围,跳转到doom2的界面系统
然后提供两个重做界面的思路:
1.跳转界面系统后可以通过构造一个特殊的party,然后强制遭遇  比如 (start_encounter, "p_camp_bandits"),然后通过脚本game_event_party_encounter或者自己写,跳转到一个场景,然后在场景里面利用3d场景设计动态的东西作为背景制作场景内界面
2.直接把doom2做到大地图上做presentation界面,此法的弊端是:会暂定大地图的运行,甚至会让大地图刷出文字时文字在界面暂停大地图原始界面时使得大地图的文字图标像素被磨花,这个取决你的电脑运行能力,以及刚进大地图时来不及生成大地图的东西你就启动大地图上的新界面有关。

从第2点我的推论:
其实大地图就是一个超级界面系统,所以有时会反应出界面系统自身的局限表现,比如两个不同presention一般情况不能共存,在极少数情况(比如跳转是经过系统内置界面返回时,会使得被不同presention混用了变量的图标合成在一起,一般没有应用意义)。
所以其他界面系统会停滞大地图说明大地图本身就是一个超级界面系统。


--------------------------------------------------------------------------------------------------一些op的扩展讲解:--------------------------------------------------------------------------------------------------------

关于鼠标pos的三大op

(mouse_get_position, pos1),  获取鼠标的2维坐标,大地图和场景都可以用,一般做界面系统或者做即时战略模式用到

(position_get_screen_projection, pos2, pos1),  将3维坐标pos1转换屏幕2维坐标的pos1,只有涉及场景的可以用(包括在场景运行的mt,presentation,item等等),一般是用来给三维世界的兵种头像放点二维的东西类似场合或进行屏幕范围简单的攻击等等距离范围简化判断

(mouse_get_world_projection, <position_no_1>, <position_no_2>),  这个很冷门,我做RTS控制用过,一般了解第一个坐标含义即可,第一个坐标代表鼠标投影到场景地图的3维世界坐标,但是不能直接用于实时获取,为什么呢,你们如果玩游戏仔细的话,会发现骑砍的鼠标有自动归位功能,特别是全屏和窗口化及有鼠标界面和无鼠标界面及屏幕范围的挪动的情形,因为鼠标在一些情况总喜欢被系统自动闪烁修正到屏幕正中间或者对这个op获取的坐标产生偏移,所以用这个方法做RTS如果你实时获取,就可能因为你移动屏幕范围时系统会修正一下带来坐标的偏移,后面分享即时战略模式做法是我会慢慢教你们怎么处理这个情况







评分

参与人数 2第纳尔 +20 互助 +2 魅力 +35 收起 理由
Aomine Daiki + 30 文章不错,继续努力!
幼稚园殺手 + 20 + 2 + 5 您的帖子很有价值!

查看全部评分

55

主题

2710

回帖

1755

积分

子爵[版主]

吟游诗人

Rank: 7Rank: 7Rank: 7

UID
3054380
第纳尔
23989
精华
2
互助
57
荣誉
44
贡献
916
魅力
1418
注册时间
2019-1-18

骑砍中文站APP会员勋章原版正版勋章战团正版勋章火与剑正版勋章拿破仑正版勋章维京征服正版勋章霸主正版勋章剧本设计大奖赛骑友真人秀Ⅷ勋章骑友真人秀Ⅶ勋章骑友真人秀Ⅸ勋章

QQ
鲜花(506) 鸡蛋(2)
发表于 2023-1-30 17:48:47 | 显示全部楼层
满满干货
珍惜 奉献 不负韶华

30

主题

200

回帖

169

积分

见习骑士

Rank: 3

UID
2462463
第纳尔
1472
精华
0
互助
20
荣誉
0
贡献
0
魅力
50
注册时间
2015-3-3
鲜花(43) 鸡蛋(0)
发表于 2023-5-16 15:18:38 | 显示全部楼层
学习了学习了
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2024-4-27 12:15 , Processed in 0.138799 second(s), 22 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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