找回密码
 点一下
查看: 2206|回复: 10

设置技能GCD遇到的问题。

[复制链接]
发表于 2011-3-4 17:15:44 | 显示全部楼层 |阅读模式
想设置一下单位技能的GCD,模仿wow那种的。
效果是使用一个技能后,如果该技能的CD大于GCD,则该技能进入其CD,否则进入GCD;该单位所有其他技能同时进入GCD。

我最初的做法是设置了技能Cost[].Charge里的相关属性
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Cost index="0">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Charge>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<CountMax value="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<CountStart value="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<CountUse value="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Link value="GCD"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<TimeUse value="1.5"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Location value="Unit"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</Charge>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</Cost>
单位原来的Cost[].Cooldown并没有修改。
试验的结果是单位使用技能后,所有技能进入GCD,GCD结束后,使用的技能再显示其剩余CD。


我的想法是可能Cost[].Charge会比Cost[].Charge中的TimeUse优先显示,于是做了一次修改,如下:
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Cost index="0">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Cooldown>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Link value="GCD"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<TimeUse value="1.5"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Location value="Unit"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</Cooldown>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Charge>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<CountMax value="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<CountStart value="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<CountUse value="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Link value="Abil/##id##"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<TimeUse value="3"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Location value="Abil"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</Charge>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</Cost>
也就是将GCD设置到Cost[].Cooldown.TimeUse,而将技能的CD设置到Cost[].Charge.TimeUse,然后出现了问题。
其效果看起来不错,单位使用技能后,该技能进入CD,其余所有技能进入GCD。
但是在刚才的技能可以使用后,马上再次使用,其CD就会延长一个Cost[].Charge.TimeUse时间,其后每次使用都会再次增加一次。

我又返回到初次的设置,发现了同样的问题。
问题出现的方法是:使用一个长CD的技能后,待GCD结束再使用一个其他的技能,然后就发现GCD延长了。

不知道是我设置的问题,还是技能的Charge有问题,求解答。

//===================================================

补充一下(刚才补充错了,编辑下),如果设置如下:
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Cost index="0">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Cooldown>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Link value="GCD"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<TimeUse value="2"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Location value="Abil"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</Cooldown>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Charge>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<CountMax value="20"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<CountStart value="20"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<CountUse value="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Link value="Abil/##id##"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<TimeUse value="3"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Location value="Abil"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</Charge>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</Cost>
使用技能后会进入2秒的CD,而其计数不消耗。
但是如果修改Cost[].Cooldown.TimeUse>=Cost[].Charge.TimeUse,其计数的回复就会随着技能的使用越来越慢,时间差不多是n*Cost[].Charge.TimeUse(n是技能连续使用的次数)。

这又是什么原理呢?
同时想问大家是如何实现GCD的呢?
发表于 2011-3-4 20:11:43 | 显示全部楼层
你是用触发器设置的吗?

如果是的话,我觉得可能是你计算CD的算法有问题?
回复

使用道具 举报

发表于 2011-3-4 21:01:33 | 显示全部楼层
如果是自定义界面的话,建议还是将gcd作为一个技能独立出来
sc2原界面的话,纯数据这个还真的不是很好做(如其中一个问题就是:需要施法时间的技能应该是施法开始时转gcd而不是施放完成后转)还是触发器做这个方便些

头目的触发器原理在这里
http://bbs.islga.org/read-htm-tid-50443-fpage-3.html

捕捉cast/prepare事件
挨个检测每个受gcd影响的技能的cd,
剩下的就都简单了
回复

使用道具 举报

发表于 2011-3-4 21:25:38 | 显示全部楼层
说的好混乱,楼主还是顺便发下问题地图比较好。
回复

使用道具 举报

发表于 2011-3-4 21:31:25 | 显示全部楼层
关于技能cd的控制呢~~其实还是用触发器最为方便~~因为怎么设CD都可以呢~~
回复

使用道具 举报

 楼主| 发表于 2011-3-4 21:45:09 | 显示全部楼层
好吧,那么就用触发器来做吧,这样GCD的值修改起来也方便。

把我的问题简化下吧,就是说当Cost中Cooldown.TimeUse和Charge.TimeUse同时生效的话,会不会有什么bug之类的东西。

问题图传上来了,小电兵的两个技能,一个反馈,连续使用的话技能计数恢复会越来越慢,另一个心灵风暴,不消耗技能计数。

gcd test.SC2Map

15 KB, 下载次数: 11

回复

使用道具 举报

发表于 2011-3-4 21:54:05 | 显示全部楼层
Charge.TimeUse是用来恢复使用次数的啊。Charge和Cooldown本来就不搭界的。

不过要用好Charge和Cooldown的话还是在1.3.0环境下比较好,之前确实存在一些bug的。
回复

使用道具 举报

 楼主| 发表于 2011-3-4 22:14:33 | 显示全部楼层
还是希望它们能友好相处...
感觉利用计数可以制作类似RPG中的怒气,或wow中盗贼的能量值这样额外的能量系统。

顺便请问头目
native fixed    UnitAbilityChargeInfo (unit inUnit, abilcmd inAbilCmd, int inType);

native void     UnitAbilityAddChargeRegen (unit inUnit, string inAbil, string inCharge, fixed inVal);
native fixed    UnitAbilityGetChargeRegen (unit inUnit, string inAbil, string inCharge);
native void     UnitAbilityAddChargeUsed (unit inUnit, string inAbil, string inCharge, fixed inVal);
native fixed    UnitAbilityGetChargeUsed (unit inUnit, string inAbil, string inCharge);

这些函数和其参数都是怎么使用的呢?
回复

使用道具 举报

发表于 2011-3-4 22:32:06 | 显示全部楼层
UnitAbilityAddChargeUsed()在1.3.0之前有bug..这个最好在1.3.0里用.

UnitAbilityChargeInfo()

获得单位身上某技能的Charge情报,第一个参数是单位,第二个参数就是要获得情报的技能命令。为什么是技能命令而不是技能id呢。因为有些技能是每个命令都有单独的Charge的,比如建造技能,那么每个建筑都有单独的Charge,所以是按照技能命令分的而不是按技能分。最后一个是要获得的情报类型。可以选择的就是以下几种。


// Ability charge types
const int c_unitAbilChargeCountMax   = 0;
const int c_unitAbilChargeCountUse   = 1;
const int c_unitAbilChargeCountLeft  = 2;
const int c_unitAbilChargeRegenMax   = 3;
const int c_unitAbilChargeRegenLeft  = 4;

最大使用次数,每次使用消耗的次数,剩下的使用次数。使用次数恢复时间,当前还剩多少时间来恢复。

下面几个都很容易知道作用吧。增加、获取恢复时间。增加、获取已经用掉的次数。

inCharge这个参数填写的就是ChargeLink。

注意ChargeUsed指的是已经用掉的次数。因此如果你想要使用次数+1,那应该填-1。不要搞反了。
回复

使用道具 举报

发表于 2011-3-4 22:34:09 | 显示全部楼层
不过你必须搞明白Charge Location。我以前已经写过Charge Location是做什么用的了吧。

所以其实还有这些针对不同Location的函数。

native void     GameAddChargeUsed (string inCharge, fixed inVal);

native void PlayerAddChargeUsed (int inPlayer, string inCharge, fixed inVal);

native void     UnitAddChargeUsed (unit inUnit, string inCharge, fixed inVal);

native void     UnitBehaviorAddChargeUsed (unit inUnit, string inBehavior, string inCharge, fixed inVal);
回复

使用道具 举报

 楼主| 发表于 2011-3-5 00:27:35 | 显示全部楼层
在游戏里测试了下,稍微理解了。

传一个地图,单位技能的计数会自动恢复,最大为100。

有两个问题,技能计数的回复方法有哪些呢?我在演示里面找到了两个,可以使用行为来回复么?该怎么设置?

另一个就是,需求技能计数的技能,在计数小于其需求的情况下依旧可以使用,这个算是bug吧?

gcd test.SC2Map

16 KB, 下载次数: 17

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-9 11:13 , Processed in 0.286568 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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