找回密码
 点一下
查看: 1408|回复: 5

函数/结构/数组引用作为GUI参数的使用方式

[复制链接]
发表于 2016-4-16 16:13:26 | 显示全部楼层 |阅读模式
搞不清函数/结构/数组引用的童鞋请打开:传送门

这三种引用可以在某些情况下提供一种简单的手段来降低Galaxy代码的编写难度。不过玻璃渣坑爹的一直没有提供GUI支持。
简单来说,一方面你无法将引用(或引用对应的实力类型变量)作为GUI函数的返回值类型,另一方面你也无法将其作为GUI函数或动作的参数类型使用。



目前找到了一种绕弯子的方法实现引用作为一个GUI下的函数或动作的参数类型的方法。
它是基于自定义函数或动作采用的宏实现的,
从某种意义上来说,这种方法并没有实现对应固有函数的参数变量的设置,而是采用宏的方式,将参数写入一段调用原函数的宏代码中。
所以从Galaxy脚本的角度来看,与直接编写对应的Galaxy脚本没有差别。


自定义函数或动作的设置如下图(以动作为例):
1.png
我们可以看到参数的类型是<任意类型>,这个类型需要勾选“子函数”或"自定义脚本"才能选择。
然后在自定义脚本代码中写入如下内容:
  1. TestA(#PARAM(lp));
复制代码
其中TestA()函数的代码如下:
  1. void TestA (structref<gs_Struct> lp_ref)
  2. {
  3.         TriggerDebugOutput(1, IntToText(lp_ref.lv_x), true);
  4.         lp_ref.lv_x = 1;
  5. }
复制代码
我们可以看到这个函数的参数是一个结构体引用。
这个函数的使用方式如下图所示:
2.png
注意使用带有引用的GUI函数或动作时,设置引用参数值前需要自己将变量类型修改为“任意类型”然后在自定义代码中填写变量的Galaxy变量名(非GUI变量名)
详细设置方式如下图所示
3.png
对应触发的galaxy代码会自动生成成为:
  1. //--------------------------------------------------------------------------------------------------
  2. // Trigger: TriggerA
  3. //--------------------------------------------------------------------------------------------------
  4. bool gt_TriggerA_Func (bool testConds, bool runActions) {
  5.         // Actions
  6.         if (!runActions) {
  7.         <span style="line-height: 1.5;">       </span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">return true;</span>
复制代码
这里仅以结构体引用为例,其他两种引用是同样可用的,具体见附件。
引用作为参数类型.SC2Map (25.83 KB, 下载次数: 11)





发表于 2016-4-20 00:56:09 | 显示全部楼层
居然还有沙发。
学习一下看看。
回复

使用道具 举报

发表于 2016-4-20 01:13:36 | 显示全部楼层
这玩意有点曲高和寡啊。似乎想不到什么时候有用,或许对于一些极其复杂的脚本会有帮助。目前只用到过需要传入和返回数组的情况,不过我都用数据表解决了。目前看来,使用楼主的方案似乎能简化脚本。不过可惜还是无法返回数组。
回复

使用道具 举报

发表于 2016-4-20 01:23:15 | 显示全部楼层
细想一下,如果能直接传入结构体的话,在某些情况确实相当方便啊。比如最近有人提到的扑克牌系统,完全可以定义一个结构体作为一张牌的模板,其成员包括牌的花色,牌的牌面文本,牌的权值等等。在处理牌时,直接传结构体过去就好了。
回复

使用道具 举报

 楼主| 发表于 2016-4-20 08:51:12 | 显示全部楼层
可以返回三种引用,不过不是作为返回值,而是从参数返回
因为这些参数是引用,所以在子函数下修改,会最终修改参数的值

例子中就有
另外一点要注意,如果是在Galaxy代码中,使用引用作为参数
比如structref<X> lp_Struct, 然后你将lv_S作为参数输入到调用的函数中
那么如果你在函数中将lp_Struct的引用对象修改成为另外的结构体
那么lv_S是不会有任何改变的,但是如果你只是修改了lp_Struct.X这个属性
那么lv_S.X也会对应的修改,
这点把结构体看做一个单位X属性看做单位的生命值就容易理解了

不同的是使用这贴中的方法,如果你自定义脚本中没有以Galaxy下函数调用的方式来调用另外的函数
而是直接将函数的内容写入自定义脚本,那么修改lp_Struct的引用对象,会修改lv_S
这点看使用这类自定义函数动作的最终Galaxy代码就能看懂了
回复

使用道具 举报

发表于 2016-4-20 13:29:25 | 显示全部楼层
这东西肯定很有价值,只是多数情况下用不到。就好比物理学上的弦理论,很有价值,但在绝大多数领域,几乎用不到。作为高端的作者,掌握这种方法还是很有必要的。在应对复杂的脚本时,可以有效的简化代码,减少工作量。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-4-19 11:09 , Processed in 0.270022 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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