骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

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

[经验与教程] 花糕滴小知识——presentation篇(持续更新)

[复制链接]

17

主题

633

回帖

345

积分

见习骑士

Rank: 3

UID
3102512
第纳尔
2385
精华
0
互助
30
荣誉
0
贡献
0
魅力
74
注册时间
2019-9-6

骑砍中文站APP会员勋章战团正版勋章霸主正版勋章

鲜花(55) 鸡蛋(0)
发表于 2023-5-16 01:26:37 | 显示全部楼层 |阅读模式
本帖最后由 huagao 于 2024-7-25 18:57 编辑

   众所周知presentation是现ms整活效果最好的模块,尤其以老奥@奥杜因阿卡托什  前段时间整的物品界面整活效果极好。
   正巧虾头男俱乐部今夜又在聊界面,加上东海@815208129 最近突然开始想整一个战团mod开发的姿势合集开源基础知识计划,就分享一些我的小经验,希望对大家有所帮助。
   首先注明观点,我分享的很多东西知识我个人的一些思路或者经验,具体的功能实现,逻辑算法这块就不要指望我了。
   本帖的很多经验技巧基本都来自于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结构外部简化定义一下,例如我的:
  1. #huagao: triggers id rename
  2. load = ti_on_presentation_load
  3. run = ti_on_presentation_run
  4. button = ti_on_presentation_event_state_change
  5. enter_or_leave = ti_on_presentation_mouse_enter_leave
  6. click = ti_on_presentation_mouse_press
复制代码

接下来所有的prnst里都可以简化的书写,而且也更直观地区分,例如:
  1. ("ex_2", 0, mesh_load_window,
  2.    [
  3.     (load, []),
  4.     (run,[]),
  5.     (enter_or_leave,[]),
  6.     (button,[]),
  7.     (click,[]),  
  8. ] ),
复制代码

当然这里你也可以直接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里面定义。
  1. pos_tool = [
  2.   (load, [
  3.       (eq, debug_mode, 1),
  4.       (create_text_overlay, "$pos_tool", "str_empty_string" ,tf_center_justify|tf_vertical_align_center),

  5.   ]),
  6.   (run, [
  7.       (eq, debug_mode, 1),
  8.       (set_fixed_point_multiplier, 1000),
  9.       
  10.       (mouse_get_position, pos1),
  11.       (position_get_x, reg1, pos1),
  12.       (position_get_y, reg2, pos1),
  13.       
  14.        (try_begin),
  15.           (le, reg1, 500),
  16.           (assign, ":x_offset", 70),
  17.        (else_try),
  18.           (assign, ":x_offset", -70),
  19.        (try_end),
  20.        (try_begin),
  21.           (le, reg2, 375),
  22.           (assign, ":y_offset", 20),
  23.        (else_try),
  24.           (assign, ":y_offset", -20),
  25.        (try_end),
  26.                
  27.         (store_add, ":pos_x", reg1, ":x_offset"),
  28.         (store_add, ":pos_y", reg2, ":y_offset"),
  29.         (position_set_x, pos1, ":pos_x"),
  30.         (position_set_y, pos1, ":pos_y"),
  31.         (overlay_set_position, "$pos_tool", pos1),
  32.         (overlay_set_text, "$pos_tool", "@({reg1}, {reg2})"),
  33.       
  34.   ])
  35. ]
复制代码
  1. #huagao: #quit button
  2. quit_tool = [
  3.   (load, [
  4.       (set_fixed_point_multiplier, 1000),
  5.       (create_game_button_overlay, "$quit_button", "str_quit"),
  6.       (position_set_x, pos1, 920),
  7.       (position_set_y, pos1, 680),
  8.       (overlay_set_position, "$quit_button", pos1),
  9.       
  10.   ]),
  11.   (button, [           
  12.       (store_trigger_param_1, ":object"),     
  13.       (eq,":object","$quit_button"),
  14.       (presentation_set_duration, 0),   
  15.   ])  
  16. ]
  17. quit_tool_debug = [
  18.   (load, [
  19.       (set_fixed_point_multiplier, 1000),
  20.       (create_game_button_overlay, "$quit_button", "str_quit"),
  21.       (position_set_x, pos1, 920),
  22.       (position_set_y, pos1, 680),
  23.       (overlay_set_position, "$quit_button", pos1),      
  24.   ]),
  25.   (click, [           
  26.       (store_trigger_param_1, ":object"),
  27.       (store_trigger_param_2, ":mouse_state"),      
  28.       (eq,":object","$quit_button"),
  29.       (eq,":mouse_state",0),
  30.       (presentation_set_duration, 0),   
  31.   ])  
  32. ]
复制代码


quit_button我写了两种,一个是最终呈现出来给玩家点击的,一个是自己开发写界面的时候用的直接quit,毕竟不是每一个界面都是直接结束,有的是跳转其他界面,但是写的时候不需要和玩一样的跳转流程
和triggers id rename一样,写在presentations结构外部,这样在写新prnst需要引用的时候直接在触发器部分的后面+xxx 就行了,举个实际例子即:
  1. ("ex_2", 0, mesh_load_window,
  2.    [
  3.     (load,
  4.     [      
  5.     (presentation_set_duration, 9999999),
  6.     ]),
  7.     (run,[]),
  8.     (enter_or_leave,[]),
  9.     (button,[]),
  10.     (click,[]),
  11. ] + pos_tool + quit_tool ),
复制代码
  1. ("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其实很多人都有自己的理解,常规的就不说了,后面想到什么好玩的再补充,也欢迎大家狠狠滴补充分享自己的私货。


外部引用实现截图

外部引用实现截图

评分

参与人数 1第纳尔 +11 互助 +3 魅力 +10 收起 理由
幼稚园殺手 + 11 + 3 + 10 您的帖子很有价值!

查看全部评分

鲜花鸡蛋

咸鱼圣代  在2023-11-18 20:50  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
杰喵喵  在2023-11-15 09:13  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
杰喵喵  在2023-11-15 09:12  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
djman  在2023-10-30 23:13  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
幼稚园殺手  在2023-5-18 12:20  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
幼稚园殺手  在2023-5-18 12:20  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
解解解解解解解解解解解解解解解解解解

3

主题

10

回帖

14

积分

随仆

Rank: 1

UID
3515156
第纳尔
35
精华
0
互助
2
荣誉
0
贡献
0
魅力
0
注册时间
2023-5-10
鲜花(1) 鸡蛋(0)
发表于 2023-5-16 01:42:35 来自手机 | 显示全部楼层
鼠哥来自: Android客户端

3

主题

10

回帖

14

积分

随仆

Rank: 1

UID
3515156
第纳尔
35
精华
0
互助
2
荣誉
0
贡献
0
魅力
0
注册时间
2023-5-10
鲜花(1) 鸡蛋(0)
发表于 2023-5-16 01:43:28 来自手机 | 显示全部楼层
这么晚还忙辛苦了来自: Android客户端

17

主题

633

回帖

345

积分

见习骑士

Rank: 3

UID
3102512
第纳尔
2385
精华
0
互助
30
荣誉
0
贡献
0
魅力
74
注册时间
2019-9-6

骑砍中文站APP会员勋章战团正版勋章霸主正版勋章

鲜花(55) 鸡蛋(0)
 楼主| 发表于 2023-5-16 01:46:17 | 显示全部楼层
本帖最后由 huagao 于 2023-5-16 01:57 编辑

md代码引用里面标红就出事,那一块实际的代码是 ("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 ),


外部结构指的是module_presentations.py文件里  
#ms开头注释
这里就是外部结构
presentations = [
当然你想写在注释行上面也不是不行
解解解解解解解解解解解解解解解解解解

3

主题

63

回帖

20

积分

随仆

Rank: 1

UID
3128527
第纳尔
142
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2020-1-15
鲜花(2) 鸡蛋(0)
发表于 2023-5-16 02:21:14 来自手机 | 显示全部楼层
我,,,,

31

主题

210

回帖

187

积分

见习骑士

Rank: 3

UID
2462463
第纳尔
1587
精华
0
互助
23
荣誉
0
贡献
0
魅力
83
注册时间
2015-3-3
鲜花(58) 鸡蛋(0)
发表于 2023-5-16 08:25:07 | 显示全部楼层
支持!话说哪些界面或者菜单,是系统限定死的无法改的啊?

18

主题

160

回帖

168

积分

见习骑士

Rank: 3

UID
3048044
第纳尔
2095
精华
0
互助
19
荣誉
2
贡献
20
魅力
295
注册时间
2018-12-15
鲜花(36) 鸡蛋(0)
发表于 2023-5-16 12:39:27 | 显示全部楼层
根据领军者代码来看r大貌似已经完整的搞了个script在用来定位鼠标位置,但是鼠标定位教程贴没提(

17

主题

633

回帖

345

积分

见习骑士

Rank: 3

UID
3102512
第纳尔
2385
精华
0
互助
30
荣誉
0
贡献
0
魅力
74
注册时间
2019-9-6

骑砍中文站APP会员勋章战团正版勋章霸主正版勋章

鲜花(55) 鸡蛋(0)
 楼主| 发表于 2023-5-17 15:48:29 来自手机 | 显示全部楼层
黑暗路西法 发表于 2023-5-16 12:39
根据领军者代码来看r大貌似已经完整的搞了个script在用来定位鼠标位置,但是鼠标定位教程贴没提(

scripts还是如我这来得方便来自: Android客户端

29

主题

751

回帖

574

积分

骑士

Rank: 4Rank: 4

UID
3322408
第纳尔
1748
精华
0
互助
68
荣誉
0
贡献
0
魅力
6
注册时间
2022-2-3
鲜花(57) 鸡蛋(0)
发表于 2023-5-20 05:35:04 来自手机 | 显示全部楼层
战争傀儡阿格兰 发表于 2023-5-16 08:25
支持!话说哪些界面或者菜单,是系统限定死的无法改的啊?

不如问哪些能改。事实上单机这块除了战场只会面板外,就只有选旗帜之类边边角角的玩意儿不是可以改的了。来自: Android客户端

31

主题

210

回帖

187

积分

见习骑士

Rank: 3

UID
2462463
第纳尔
1587
精华
0
互助
23
荣誉
0
贡献
0
魅力
83
注册时间
2015-3-3
鲜花(58) 鸡蛋(0)
发表于 2023-5-27 21:52:14 | 显示全部楼层
#功能:建立一个文本对象
#格式:(create_text_overlay, reg1, "str_sample_banner", tf_center_justify),
#说明:当前创建的对象在presentation中的id会储存在reg1中,也可以使用自定的全局变量"$xxx"代替reg1。"str_sample_banner"是文字的内容,也可以使用如"@...."这样的快捷字符串,或者事先将文字内容存在诸如"s1"等此类字符串变量中在这里直接调用s1。
#tf_center_justify为文字的排版格式,详见第二部分
create_text_overlay                              = 910 # (create_text_overlay, <destination>, <string_id>), #returns overlay id
有第三个隐藏参数!!!!写全了是这样的!!!

(create_text_overlay, <destination>, <string_id>,tf_center_justify),

0

主题

21

回帖

6

积分

平民

Rank: 1

UID
3338361
第纳尔
503
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2022-3-19

骑砍中文站APP会员勋章

鲜花(0) 鸡蛋(0)
发表于 2023-6-26 16:02:30 来自手机 | 显示全部楼层
鼠鼠的帖子纯干货啊来自: iPhone客户端

31

主题

210

回帖

187

积分

见习骑士

Rank: 3

UID
2462463
第纳尔
1587
精华
0
互助
23
荣誉
0
贡献
0
魅力
83
注册时间
2015-3-3
鲜花(58) 鸡蛋(0)
发表于 2023-10-27 16:32:22 | 显示全部楼层
(create_check_box_overlay, <destination>, <checkbox_off_mesh>, <checkbox_on_mesh>),
                                                          # Creates a checkbox overlay. Returns checkbox overlay_id.
在如下触发器的时候
        (ti_on_presentation_event_state_change,
        [

                (store_trigger_param_1, ":object"),
                (store_trigger_param_2, ":value"),

                (eq, ":object", "$g_111"),
                (assign, "$g_222", ":value"),   
取消勾,返还0
打上勾,返还1

43

主题

1165

回帖

442

积分

骑士

Rank: 4Rank: 4

UID
3065189
第纳尔
675
精华
0
互助
16
荣誉
0
贡献
2
魅力
11
注册时间
2019-3-28

骑士美德之英勇勋章[杰出会员活跃勋章]

QQ
鲜花(108) 鸡蛋(0)
发表于 2023-10-29 21:43:21 | 显示全部楼层
大佬,请问这个语句该怎么用。在战团里找到实例就是选择旗帜,但是一直不知道怎么在里面做选项 create_button_overlay

###设置容器框
set_container_overlay                     = 945 # (set_container_overlay, <overlay_id>), #sets the container overlay that new overlays will attach to. give -1 to reset
忠 誠 勇 毅 ,心 系 社 會

17

主题

633

回帖

345

积分

见习骑士

Rank: 3

UID
3102512
第纳尔
2385
精华
0
互助
30
荣誉
0
贡献
0
魅力
74
注册时间
2019-9-6

骑砍中文站APP会员勋章战团正版勋章霸主正版勋章

鲜花(55) 鸡蛋(0)
 楼主| 发表于 2023-10-30 18:06:41 | 显示全部楼层
半世尘埃 发表于 2023-10-29 21:43
大佬,请问这个语句该怎么用。在战团里找到实例就是选择旗帜,但是一直不知道怎么在里面做选项 create_butt ...

设置指定的overlay对象作为一个底部容器,然后后面creat的就在这个容器里面了,坐标是基于这个底部容器的,再set -1就跳出这个容器
解解解解解解解解解解解解解解解解解解

16

主题

108

回帖

197

积分

见习骑士

Rank: 3

UID
3304622
第纳尔
690
精华
0
互助
26
荣誉
3
贡献
0
魅力
158
注册时间
2021-12-28
鲜花(31) 鸡蛋(0)
发表于 2023-11-15 09:12:38 | 显示全部楼层
很好的贴子,期待更新
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

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

GMT+8, 2024-12-27 12:19 , Processed in 0.157068 second(s), 36 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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