找回密码
 点一下
查看: 1364|回复: 23

该段触发中的单位组排泄似乎不正确,求解

[复制链接]
发表于 2012-6-24 00:06:29 | 显示全部楼层 |阅读模式
[trigger]
如果所有条件成立则做动作1,否则做动作2
    If - 条件
        Hero_14_V_Z_Shu_1 大于 0
    Then - 动作
        For Hero_14_V_Z_Shu_2 从 1 到 Hero_14_V_Z_Shu_1, 做动作
            Loop - 动作
                如果所有条件成立则做动作1,否则做动作2
                    If - 条件
                        Hero_14_V_Z_Shu_3[Hero_14_V_Z_Shu_2] 小于或等于 25
                    Then - 动作
                        设置 Hero_14_V_Point_1[Hero_14_V_Z_Shu_2] = (Hero_14_V_Unit[Hero_14_V_Z_Shu_2] 的位置)
                        设置 Hero_14_V_Point_2[Hero_14_V_Z_Shu_2] = (从 Hero_14_V_Point_1[Hero_14_V_Z_Shu_2] 开始,距离 20.00 ,方向为 (Hero_14_V_Unit[Hero_14_V_Z_Shu_2] 的面向角度) 度的位移处)
                        单位 - 立即移动 Hero_14_V_Unit[Hero_14_V_Z_Shu_2] 到 Hero_14_V_Point_2[Hero_14_V_Z_Shu_2]
                        设置 Hero_14_V_Zu_2 = (半径为 1000.00 圆心为 Hero_14_V_Point_1[Hero_14_V_Z_Shu_2] 且满足 ((((匹配单位) 是 (Hero[14] 的所有者) 的敌对单位) 等于 TRUE) and ((((匹配单位) 是存活的) 等于 TRUE) and (((匹配单位) 在 Hero_14_V_Zu_1[Hero_14_V_Z_Shu_2]
                        单位组 - 选取 Hero_14_V_Zu_2 内所有单位做动作
                            Loop - 动作
                                单位 - 命令 Hero[14] 对 (选取单位) 造成 (10.00 x (转换 (Hero[14] 的 驱散 技能等级) 为实数)) 点伤害,攻击类型: 法术 伤害类型: 魔法
                                特殊效果 - 创建并绑定特效到 chest 对 (选取单位) ,使用模型: Abilities\Spells\Other\Stampede\StampedeMissileDeath.mdl
                                特殊效果 - 删除 (最后创建的特效)
                                单位组 - 为 Hero_14_V_Zu_1[Hero_14_V_Z_Shu_2] 添加 (选取单位)
                        单位组 - 删除 Hero_14_V_Zu_2
                        点 - 清除 Hero_14_V_Point_1[Hero_14_V_Z_Shu_2]
                        点 - 清除 Hero_14_V_Point_2[Hero_14_V_Z_Shu_2]
                        设置 Hero_14_V_Z_Shu_3[Hero_14_V_Z_Shu_2] = (Hero_14_V_Z_Shu_3[Hero_14_V_Z_Shu_2] + 1)
                    Else - 动作
                        单位组 - 删除 Hero_14_V_Zu_1[Hero_14_V_Z_Shu_1]
                        单位 - 杀死 Hero_14_V_Unit[Hero_14_V_Z_Shu_2]
                        设置 Hero_14_V_Unit[Hero_14_V_Z_Shu_2] = Hero_14_V_Unit[Hero_14_V_Z_Shu_1]
                        设置 Hero_14_V_Z_Shu_3[Hero_14_V_Z_Shu_2] = Hero_14_V_Z_Shu_3[Hero_14_V_Z_Shu_1]
                        设置 Hero_14_V_Unit[Hero_14_V_Z_Shu_1] = 没有单位
                        设置 Hero_14_V_Z_Shu_2 = (Hero_14_V_Z_Shu_2 - 1)
                        设置 Hero_14_V_Z_Shu_1 = (Hero_14_V_Z_Shu_1 - 1)
    Else - 动作
        触发器 - 关闭 (当前触发)
[/trigger]


我用循环整数的方法把多个单位向前“扔”

而每个被“扔”出去的单位会对范围内的敌人造成伤害并且到了一定距离后删除该单位与绑定的单位组

单位组的排泄我那样写的话伤害判定什么的才能正确,但是似乎泄露了,因为多释放几次后就变得非常卡

麻烦谁帮我看一下到底是哪里出错了。



我把图放上来了,麻烦看看。

主要构思就是会不停得向前方丢出单位

单位在向前移动时会对范围内的敌人造成一次伤害并加入绑定的单位组,此后该单位不会再对单位组内的敌人造成伤害,直到前进了一定距离被删除

按我的逻辑思路来删除单位组和杀死单位是错误的,但是不知道错在哪,求指点。

test.w3x

24 KB, 下载次数: 3

发表于 2012-6-24 07:05:03 | 显示全部楼层
尽管没仔细看楼主的话。

如果是模拟冲击波之类的东西的话,那么这样是可行的

设置单位组ABC

A = 进行快速位移的单位组
B = 造成伤害的单位组(一次性)
C = 已经受到伤害的人(可以不使用)

单位被创建出来,丢到A组(不用创建 直接使用),于是开始了快速移动,同时B单位组负责选取他周围的符合条件的单位,并且不断造成伤害(用完之后,清空并且删除单位组)(如果要支持只受到一次伤害),把B选取到的单位添加到C,同时B的条件里增加一条:单位不在C里。

总之,单位组是一个可以直接使用的东西,如果只是来储存单位,不必创建直接使用。

如果是选取单位,使用后清空删除。

-w- 如果是选取并且储存~~ ,那么这样会比较好:使用选取的单位组选取单位,触发动作把做选取的单位们丢到负责储存的单位组里。
回复

使用道具 举报

 楼主| 发表于 2012-6-24 07:15:12 | 显示全部楼层

回 okolek 的帖子

okolek:尽管没仔细看楼主的话。

如果是模拟冲击波之类的东西的话,那么这样是可行的

设置单位组ABC
....... (2012-06-24 07:05)
是类似冲击波的技能,但是并不是只会造成一次伤害,而是每个冲击波都能造成一次伤害

分别判定,但是现在的问题就是排泄而已……
回复

使用道具 举报

发表于 2012-6-24 12:58:33 | 显示全部楼层
  好吧。刚想说你把触发贴上来。

  这样吧。如果没有人解决的话我下午回来帮你看看。
回复

使用道具 举报

 楼主| 发表于 2012-6-24 14:35:24 | 显示全部楼层

回 okolek 的帖子

okolek:  好吧。刚想说你把触发贴上来。

  这样吧。如果没有人解决的话我下午回来帮你看看。 (2012-06-24 12:58)
谢谢

我的猜测是在选取范围内敌人造成伤害并加入判定单位组而没有成功排泄的原因

比如目前被丢出去的单位有三个,那么循环动作就是1-3次,而1做完了动作,删除单位1和单位组1

但单位和单位组2、3还没完

而循环动作是1-3,所以会不停的泄露单位组。
回复

使用道具 举报

发表于 2012-6-24 15:38:16 | 显示全部楼层

回 冷漠 的帖子

冷漠:谢谢

我的猜测是在选取范围内敌人造成伤害并加入判定单位组而没有成功排泄的原因

....... (2012-06-24 14:35)
  目测没有任何问题...
   先吐槽一下楼主,能不要为变量取这种名字,推荐办法是匈牙利命名前缀法,由一个非常著名的windows的程序员所使用的
       比如如果是点变量,那么加上前缀Loc或者P
      单位,加上前缀U
      单位组,加上前缀G,这样看触发的时候也便于自己理解,不要去很长的怪名字,想循环动作里使用的整数,越短越要,可以使用cout,step之类的命名方式。
  写成来的触发,除了能够正确执行外,还有让人便于理解
回复

使用道具 举报

发表于 2012-6-24 17:24:14 | 显示全部楼层
喜欢用Point来表示点...
回复

使用道具 举报

 楼主| 发表于 2012-6-24 18:26:21 | 显示全部楼层

回 lia77593 的帖子

lia77593:  目测没有任何问题...
   先吐槽一下楼主,能不要为变量取这种名字,推荐办法是匈牙利命名前缀法,由一个非常著名的windows的程序员所使用的
       比如如果是点变量,那么加上前缀Loc或者P
      .. (2012-06-24 15:38)
……

根本不会那些什么单位什么的,取那些变量名字也只因为自己看得懂……

目测没有问题,实际上发动时会很卡……
回复

使用道具 举报

发表于 2012-6-25 15:07:32 | 显示全部楼层
   好吧我还是有一点事情在忙。~~~

不过

你可以先把你的思路写给我。

比如说,你用什么方式来移动或者选取什么的。
回复

使用道具 举报

发表于 2012-6-26 01:10:12 | 显示全部楼层
似乎不是排泄的问题而是弹幕本身的问题。。。

禁用循环里的选取鸟1000范围内的敌人后技能完全不卡
所以卡的原因个人猜测是鸟太多+选取间隔太短+还是循环选取。。
我测的时候将选取、对该单位组做动作、删除该单位组禁用了,完全不卡;之后开启选取和删除单位组就开始卡了,不过第三次施放才开始卡,而如果开启伤害的话第二次放就开始卡了

如果是没排泄的话那么放完技能后应该也会卡卡的,但是放完技能后却很流畅,不管放技能的时候有多卡……
而且T看下来似乎也没有什么泄漏问题。。

不过奇怪的是为什么第一次放不会卡……


我把LZ的T换个写法试试先。。
回复

使用道具 举报

发表于 2012-6-26 02:15:42 | 显示全部楼层
我说LZ啊…………你的马甲设置。。。
太不节省资源了吧。。。
有名有姓有头像有声音有攻击有说明有……总之各种数据。。

test.w3x (27 KB, 下载次数: 5)
改了马甲后你原先的T一点都不卡了。。。我只改了下发动技能那个T,加了条件和设置Hero14 = 触发单位
然后有个我改的版本,Hero 14 3 Time那个触发是J版本的,所以如果不会J的话请直接忽略,然后前两个T的写法上有一点点改动
嘛。。唯一要说的是单个IF-THEN-ELSE里如果不用做动作的话不要用“不做任何动作”,哪怕加个空注释效率都比不做任何动作高
回复

使用道具 举报

 楼主| 发表于 2012-6-26 06:35:52 | 显示全部楼层

回 chyj4747 的帖子

chyj4747:我说LZ啊…………你的马甲设置。。。
太不节省资源了吧。。。
有名有姓有头像有声音有攻击有说明有……总之各种数据。。

改了马甲后你原先的T一点都不卡了。。。我只改了下发动技能那个T,加了条件和设置Hero14 = 触发单位
....... (2012-06-26 02:15)
这只是测试地图,正式地图马甲都有改数据的,现在才知道不改数据会卡……另外才知道原来空注释也比不做动作效率高,真是涨姿势了……

正题,测试了一下,发现改了马甲虽然第一次不会再卡了,但是多释放几次技能后还是会出现卡的问题

而且并不是释放中卡,而是释放后卡,那么就确实是单位组的泄露了。

我重新检查了一下选取单位组造成伤害的触发,我想大概原因是循环整数过后把循环数值-1,虽然马甲弹幕在视觉上的效果没有问题,但是单位组并不会判断你是否已经存在,会直接新建导致泄露……

而且由于循环数值-1的原因,实际用上的单位组只有5个,而我的思路是:

持续向前方投射弹幕(假设前后一共50个马甲),每个弹幕绑定一个单位组,而每个弹幕也只会每个范围内的敌人造成1次伤害,例如,一个敌人始终在弹幕作用范围内,那么每个弹幕能造成10点伤害的话则总共造成500点实际伤害。

现在在第一次不卡的情况下发现,尽管弹幕在持续的向前方投射,但范围内的敌人只受到了5次伤害……

嗯……看来需要用多一个变量记录弹幕的总量么,我先试一试,不行再拜托你们。

多谢。





测试图做出来了,放上演示: test.w3x (24 KB, 下载次数: 3)

目前的情况是弹幕投射正常,伤害次数与伤害判定正常,基本没问题,但是释放到临近结尾时会卡。

原因我认为并不是泄露,而是循环整数没有减少的问题。

原本的循环写法为从1-变量总数,现在我用另一个变量代替1,而每一个弹幕完成了它的任务后就直接把变量+1。

但是循环数值的最大值不变,那么假设前头投出了100个弹幕的话,那么在完成第100个动作前,有99个多余的循环数值而导致释放过程到结尾时卡。

如果用循环数值-1的办法的话又没办法正确的绑定单位组,我现在钻进了个牛角尖,想不通,麻烦帮我想想有什么办法避免多余的循环动作但又不会影响单位组的绑定。
回复

使用道具 举报

 楼主| 发表于 2012-6-27 06:50:39 | 显示全部楼层
……
回复

使用道具 举报

发表于 2012-6-27 08:15:57 | 显示全部楼层
冷漠:……
(2012-06-27 06:50)
LZ不要急啊……别人有空了+有兴趣自然会帮你看~
回复

使用道具 举报

 楼主| 发表于 2012-6-27 08:28:30 | 显示全部楼层

回 chyj4747 的帖子

chyj4747:LZ不要急啊……别人有空了+有兴趣自然会帮你看~ (2012-06-27 08:15)
略蛋疼纠结……
回复

使用道具 举报

发表于 2012-6-27 09:32:17 | 显示全部楼层
没有单位组泄漏,一共只有两种单位组,一个是数组,另一个是临时用的,临时用的那个用完就直接删除了,所以不会泄漏,而数组的那个光看代码想逻辑很蛋疼。。所以我加了点测试,结果如下:
123.png

test(1).w3x (33 KB, 下载次数: 4)
输入t开始测试~

另外。。表示我测试的时候完全没有结束时卡的迹状……
  

LZ若不放心我写的测试,可以将Hero 14 V 3 Time这个T里“测试”那一段里那句自定义代码禁用,然后再测试~
那句自定义代码的作用是把被删除的单位组从哈希表里清除
而test测的是还有没有单位组存在哈希表里~
回复

使用道具 举报

 楼主| 发表于 2012-6-27 11:04:07 | 显示全部楼层

回 chyj4747 的帖子

chyj4747:
没有单位组泄漏,一共只有两种单位组,一个是数组,另一个是临时用的,临时用的那个用完就直接删除了,所以不会泄漏,而数组的那个光看代码想逻辑很蛋疼。。所以我加了点测试,结果如下:



输入t开始测试~
.......
我的WE不是YDWE……没办法打开……

不如你简单的说下改了什么吧

因为想做成多玩家使用,总感觉哪不对。
回复

使用道具 举报

发表于 2012-6-27 11:45:55 | 显示全部楼层
冷漠:我的WE不是YDWE……没办法打开……

不如你简单的说下改了什么吧

....... (2012-06-27 11:04)
LZ会用哈希表或缓存绑定不…………
因为单位组不像单位什么的有自定义值可以用来绑定。。

新建个数组(类型随便,就整数吧)b,新建计数用整数c=0;
你图里的两个单位组,数组的那个以下简称Zu1

每次Zu1 = 新建单位组的时候,让b[c] = 1
然后将 c 绑定给该单位组
c = c+1

每次删除某个Zu1的时候,读取绑定的整数,记作 i
设置b[ i ]=0

最后等技能放完了,用循环测试:
循环整数A从0到c-1
      IF b[A]==1
      THEN  第A个单位组没排泄,提示信息~
回复

使用道具 举报

 楼主| 发表于 2012-6-28 07:59:25 | 显示全部楼层

回 chyj4747 的帖子

chyj4747:

LZ会用哈希表或缓存绑定不…………
因为单位组不像单位什么的有自定义值可以用来绑定。。

新建个数组(类型随便,就整数吧)b,新建计数用整数c=0;
.......
现在的问题并不是说单位组没有排泄

用变量控制循环整数最低值的办法已经可以正常的运行了

唯一不足的地方就是太消耗内存,按你那个图片所看

一共新建了100个单位组,即便技能发动完了会排泄成功技能释放途中卡还是无法避免的

我就想说有没有什么办法可以减少内存的消耗,我的触发是按希瓦(好像是,应该是吧……) 弹射(多人版).w3x (15 KB, 下载次数: 1) 演示逻辑关系写出来的,希瓦写的变量比较标准,你应该能看懂……

我也试过用消息来测试过,用变量减少的方式做的话实际只建了几个变量,而不是像我那样建了100个,但是单位变量能做到的似乎单位组做不到?
回复

使用道具 举报

 楼主| 发表于 2012-6-28 08:31:55 | 显示全部楼层
啊咧……那个……我好像是做出来了……

test.w3x (25 KB, 下载次数: 6)

麻烦龙兄帮我测试一下检查一下泄露吧……

我记得我最初就是这样改,发现还是卡

实在想不到方法才发贴的……

难道当时已经做出来了,只是仅仅因为单位数据没改选取范围太大(为了测试全中伤害才把范围设置为1000,实际为150)和新建删除特效太快才卡而已么……
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-5 02:20 , Processed in 0.358905 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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