本帖最后由 huagao 于 2024-7-25 18:57 编辑
众所周知presentation是现ms整活效果最好的模块,尤其以老奥@奥杜因阿卡托什 前段时间整的物品界面整活效果极好。 首先注明观点,我分享的很多东西知识我个人的一些思路或者经验,具体的功能实现,逻辑算法这块就不要指望我了。 本帖的很多经验技巧基本都来自于ms本体,ms很多操作实际上不是仅仅某个文件可以这么玩的,当然今天是讲界面,就拿prnst说一下。
一, 简化触发器名书写 ti_on_presentation_load =-60.0 ti_on_presentation_run =-61.0 ti_on_presentation_event_state_change = -62.0 ti_on_presentation_mouse_enter_leave = -63.0 ti_on_presentation_mouse_press = -64.0 prnst里,常用的几个部分,我们可以将其在presentations结构外部简化定义一下,例如我的: - #huagao: triggers id rename
- load = ti_on_presentation_load
- run = ti_on_presentation_run
- button = ti_on_presentation_event_state_change
- enter_or_leave = ti_on_presentation_mouse_enter_leave
- click = ti_on_presentation_mouse_press
复制代码
接下来所有的prnst里都可以简化的书写,而且也更直观地区分,例如: - ("ex_2", 0, mesh_load_window,
- [
- (load, []),
- (run,[]),
- (enter_or_leave,[]),
- (button,[]),
- (click,[]),
- ] ),
复制代码
当然这里你也可以直接rename为111,222,333… …随你自己喜欢,但是为了可读性还是建议规范命名。
二,外部工具模块以及引用 参考mt中例如common_battle_init_banner这种写在外部的触发器,用的时候就很方便。 1.就拿rubik的界面十字坐标 R大的十字座标原帖 举个例子,这个应该是所有写prsnt的人都会用的小工具,方便快捷,唯一的小缺点可能就是很开一个新界面,就需要复制粘贴两段代码,这个时候外部的触发器就很方便了。 2.再举个例子就是退出按键的使用,绝大多数上级界面都会写一个(presentation_set_duration, 0),的退出button用于结束界面,而每次写界面重复此操作也挺离谱的,所以我的所有需要退出button的界面都是用的外部添加。 下面是上面两个例子的展示: 注意: 十字座标的逻辑还是rubik的代码,毕竟只是为了展示引用方法,不是为了重复造轮子。 退出button的quit字符串是已有的,不需要自己重定义。 debug_mode是我个人的开发标识,就和很多作者喜欢的(eq, 0, 1),一样,拿去用的话需要自己去constant里面定义。 - pos_tool = [
- (load, [
- (eq, debug_mode, 1),
- (create_text_overlay, "$pos_tool", "str_empty_string" ,tf_center_justify|tf_vertical_align_center),
- ]),
- (run, [
- (eq, debug_mode, 1),
- (set_fixed_point_multiplier, 1000),
-
- (mouse_get_position, pos1),
- (position_get_x, reg1, pos1),
- (position_get_y, reg2, pos1),
-
- (try_begin),
- (le, reg1, 500),
- (assign, ":x_offset", 70),
- (else_try),
- (assign, ":x_offset", -70),
- (try_end),
- (try_begin),
- (le, reg2, 375),
- (assign, ":y_offset", 20),
- (else_try),
- (assign, ":y_offset", -20),
- (try_end),
-
- (store_add, ":pos_x", reg1, ":x_offset"),
- (store_add, ":pos_y", reg2, ":y_offset"),
- (position_set_x, pos1, ":pos_x"),
- (position_set_y, pos1, ":pos_y"),
- (overlay_set_position, "$pos_tool", pos1),
- (overlay_set_text, "$pos_tool", "@({reg1}, {reg2})"),
-
- ])
- ]
复制代码- #huagao: #quit button
- quit_tool = [
- (load, [
- (set_fixed_point_multiplier, 1000),
- (create_game_button_overlay, "$quit_button", "str_quit"),
- (position_set_x, pos1, 920),
- (position_set_y, pos1, 680),
- (overlay_set_position, "$quit_button", pos1),
-
- ]),
- (button, [
- (store_trigger_param_1, ":object"),
- (eq,":object","$quit_button"),
- (presentation_set_duration, 0),
- ])
- ]
- quit_tool_debug = [
- (load, [
- (set_fixed_point_multiplier, 1000),
- (create_game_button_overlay, "$quit_button", "str_quit"),
- (position_set_x, pos1, 920),
- (position_set_y, pos1, 680),
- (overlay_set_position, "$quit_button", pos1),
- ]),
- (click, [
- (store_trigger_param_1, ":object"),
- (store_trigger_param_2, ":mouse_state"),
- (eq,":object","$quit_button"),
- (eq,":mouse_state",0),
- (presentation_set_duration, 0),
- ])
- ]
复制代码
quit_button我写了两种,一个是最终呈现出来给玩家点击的,一个是自己开发写界面的时候用的直接quit,毕竟不是每一个界面都是直接结束,有的是跳转其他界面,但是写的时候不需要和玩一样的跳转流程 和triggers id rename一样,写在presentations结构外部,这样在写新prnst需要引用的时候直接在触发器部分的后面+xxx 就行了,举个实际例子即: - ("ex_2", 0, mesh_load_window,
- [
- (load,
- [
- (presentation_set_duration, 9999999),
- ]),
- (run,[]),
- (enter_or_leave,[]),
- (button,[]),
- (click,[]),
- ] + pos_tool + quit_tool ),
复制代码- ("ex_2", 0, mesh_load_window, [ ] + pos_tool + quit_tool ),
复制代码
实现截图丢在后面,这种外部的引用具体的用法还是看个人习惯了,不止是开发辅助,我的mod里面用了很多(因为省事)。
三, 关于ti_on_presentation_run的一些交流探讨 ti_on_presentation_run =-61.0 即界面正在运行时的run触发器,因为prnst中存在一些overlay_animate_to_xxx的操作函数,使得动画效果成了整活的一种可能,那么run触发器也显得尤为重要,前段时间我自己在做转场动画效果的时候因为需要计时器就简单测试了一下,这里指代的不是run的频率,而是抓取返回值的阈值为60次/秒。 如果只是想做一些简单的效果还好,但如果和我一样在做多个对象合成复杂动画效果的兄弟可能有所帮助吧。 这里讲一下overlay_animate_to_alpha这个脑瘫函数,这个傻逼函数对于alpha值的变化操作就是,到某个阈值直接给你整没了,或者直接显示。其数值参数和透明度的变化明显不是线性的,所以我无奈之下临时用ps直接做了目标mesh在不同alpha值下的多张贴图,用了老彼得 贴图变化 的办法,但是万物都靠mesh数量区堆也不是好办法,如果有好兄弟有新发现记得告诉哥们一下,这个逼函数前段时间要把我憋死了。 关于overlay_animate_to_alpha,如果发现动画效果很奇怪记得去改一下材质标签,目前来看老李帖子里的33558785和2001101都可以,但是我自己做的部分贴图在某些情况下只能用2001101才能实现想要的效果。
四,ti_on_presentation_mouse_press
ti_on_presentation_mouse_press = -64.0 #can only be used in module_presentations triggers # Trigger Param 1: id of the object that mouse is pressed on # Trigger Param 2: 0: left mouse button, 1 right mouse button, 2middle mouse button 我对prnst的学习之路是从老李的 老李的界面教程 开始的,导致在很长一段时间内,对于ti_on_presentation_mouse_press压根就没关注到,这里也是给很多和我一样的人提醒一下,不要忘记这个好东西,还挺有用的。
举个简单的例子,在前段时间和阿格兰的讨论中,mesh_overlay 是无法通过常规的 ti_on_presentation_event_state_change 获取到触发的,对于这些非button类的控件,其实用mouse_press 可以获取到。
关于presentations其实很多人都有自己的理解,常规的就不说了,后面想到什么好玩的再补充,也欢迎大家狠狠滴补充分享自己的私货。
|