想做红警和CNC那种一边造单位一边减钱的系统该怎么做呢
银河编辑器吧
全部回复
仅看楼主
level 15
意思就是:当建造一个单位/建造时,钱不会先预支掉(比如点5个枪兵,不会一下子扣掉5个枪兵的钱,即使实际没有5个枪兵的钱也可以点5个枪兵),然后钱在每个枪兵的造兵的时间里逐渐减少,一直到序列完成或者资金不足,那就暂停直至有资金时才恢复。
暂且不讨论单位的问题,单位余实在想不到有啥办法暂停它,队列压根就没暂停,给兵营上个冻结行为又不太靠谱。尝试用触发器做了一个建筑的
思路是这样:把建筑的造价调为0。自己写两个函数,根据单位类型分别返回其建造时间和晶体矿费用。每1s检查一次正在进行建造的建筑,然后费用除时间得出每s造价,触发器核对钱够不够,够就减,不够就让建造暂停。
但实际做下来后,放在命令与征服复刻MOD中测试,还是有问题:
1、因为MCV同一时间只建造1建筑,所以使用的是SCV同款建造技能。但问题来了,建造是可以手动中断,然后去造其他建筑的。如果是因为没有资金而中止后,在有钱之后应该怎么让MCV再自动回头建之前的建筑呢?又怎么判定哪些是手动中止的,哪些是自动中止的呢?
2、而当有多台MCV或者起重机(提供一个新生产序列的建筑)时这就更迷惑了,哪个MCV/起重机应该去建哪些建筑??
3.、如果有个玩家先用MCV下了个建筑,然后暂停,又下了一个新建筑,又暂停,用起重机接上其中一个,接着用同一台MCV下了其他建筑,结果三个建筑没造完的时候钱又不够了,这样等钱来的时候情况就更迷惑了。
——————————
退一步来讲,不整这些乱七八糟的玩意,就只是让建造单位和建筑时实现“只先付第一个单位的钱”可以吗?
意思就是:点5个枪兵,瞬间扣掉第一个枪兵的50块然后开始训练,但是先不扣后面的,如果到了后面的没有50块,就像卡人口一样暂停住。建筑同理,按Shift下几个建筑,只有第一个先扣钱,后面的等开始造的时候再扣。只是这样的话,有可行的办法吗?
------------------------------------
谦卑·荣誉·牺牲·英勇·怜悯·灵性·诚实·公正!谨以上述守则为名,签订永恒契约,以吾「世界」为名,守护汝直至一生一世!
致扩散性百万亚瑟王·魔法之派·妖精·艾尔。
2020年05月05日 14点05分 1
level 14
物编也不难啊,首先当然要把价格调为0
给造兵建筑一个0.125周期行为,加个指令数量验证器来移除
效果写个切换验证器有没有1块钱
有就扣钱,没有就给个0.125秒的时停
2020年05月05日 23点05分 3
level 14
挺简单的
2020年05月06日 13点05分 6
嗯,感谢思路。不过这样应该怎么识别训练单位的不同,从而控制不同的费用呢?使用切换 + 一大串的指令队列验证器,根据队列中的训练技能切换不同的资源检测和扣钱?
2020年05月06日 14点05分
不过这个思路也可以直接触发器化,这样切换费用就方便很多
2020年05月06日 14点05分
level 15
按照楼上路边的思路用触发器基本实现了1楼所说的效果
首先事件是0.25s的计时器,然后将每个玩家的所有生产建筑都加进各自的单位组变量里
挑选每一个生产建筑,如果有特殊情况(停电,EMP等)就将其从单位组直接踢出
如果没有,则开始检测是否正在处于生产状态,如果没有,将其从单位组直接踢出
如果正在生产状态,则开始计算扣钱的流程,首先确定单位的建造时间。建造时间由一个根据单位类型返回整数的函数取得(由于是每0.25s计算一次,因此返回值是真正的建造时间的四倍,例如下面的图里执法兵返回的是12,但其实真正的建造时间是3s。)
如果生产建筑处于电力不足的缓速状态(生产速度只有0.5),则将时间乘以2
接着获取每0.25s应该扣除的价格,依然使用一个自定义整数函数根据单位类型返回价格,再除时间
然后进入到有钱无钱的判定。如果有钱就减钱,并在减完后再判定一次还有没有钱支付下一次,如果没有就即时附加行为中断建造,防止白嫖0.25秒
如果没钱就直接附加行为暂停建造。
最后保险起见净空变量,结束一个循环。最终For Loop会将所有玩家的所有生产建筑都过一次这个循环,完成1楼所提到的效果。流程应该还可以再优化一下,比如可以把剔除没有处于生产状态的建筑单独放在最前面,可以让杂乱感减少一点。
——————————————————————————
但是这样整完之后马上出现了新的问题。
玩家如果取消了训练,应该怎么把钱返还给他们呢??
原本余想的是:在取消训练的时候捕捉训练的进度,乘以价格再把那个数值的资源给予玩家,于是写了这么个东西:
但是实战后发现不行啊,并没有返还钱,大概是根本不能捕捉进度,因为当触发“训练进度为已取消”时进度就已经变成不存在了吧。
倒是有一个想法是每0.25s都捕捉所有正在生产的建筑进入一个单位组,然后将其第一个槽位训练进度(百分比)也是每0.25s一一对应写入整数变量组。当触发任意单位训练进度为取消事件时,就将整数变量组里对应的训练进度乘以单位价格后,将资源返还。不知道可不可行。
感觉乱死了,还要想想怎么样确保两组变量的数据一一对应...
------------------------------------
谦卑·荣誉·牺牲·英勇·怜悯·灵性·诚实·公正!谨以上述守则为名,签订永恒契约,以吾「世界」为名,守护汝直至一生一世!
致扩散性百万亚瑟王·魔法之派·妖精·艾尔。
2020年05月07日 16点05分 7
level 15
返还钱的系统也做好了。不过经过测试,每次返还的时候还是会少返还一个0.25s的钱,因为在点击“取消时”的前0.25s的数据无法记录(点取消时进度直接变0了)。不过这个余也不打算解决,就当做是反悔的小惩罚(就像取消建筑一样)。
首先是总览,由3个触发器,2个全局变量组成。变量的数组可以看到是1024。也就是说理论上如果同一时间处于训练状态的建筑超过1024个,第1025个就无法记录了(但当然那是不可能的)
——————————————
然后进入到【记录单位的生产进度】的触发器
然后第一步,将所有正在处于生产状态的建筑捕获入局部单位组。
挑选单位组种的每一个单位,开始对每一个单位进行检测操作。
第一个要检测的,是这个单位“有没有被记录过”
检测方式是使用while loop,检测全局变量“正在生产的单位”的1024个数组里有没有其中一个是被挑选到的单位。
Index从1开始,如果第1个不是被挑选的单位,就继续到第2个,第3个,第4个。
如果单位在其中一个数组被检测到,index就停止叠加,定位在这个数组。
如果单位不存在于任何数组中,index会一直叠加到 =1024,然后因为不满足“index != 1024”的条件而停止叠加。
然后进入下一步。
如果Index不等于1024
那么说明,这个单位当前的生产进度已经被记录过。所以直接同时设置两个全局变量的Index数组为对应数值,由于Index是一样的,因此两个全局变量在数组上也就形成了对应的关系。
如果Index等于1024
就说明,这个单位当前的生产进度从来没有被记录过。因此,需要找到一个两个全局变量的同一序号数组【均为空】的数组。(比如,只有当 正在进行生产的单位[1] ,生产进度记录[1],两个都为空时,才能用1号数组来进行记录。任一一边不为空均不能用。)
因此将Index重新设置为1,开始While Loop语句。
如果“正在生产的单位[Index]” 或者 “生产进度记录[Index]” 任意一方不为空,都必须跳过,并将Index+1,继续检测下一组数组。
当检测到两个变量的Index组都为空时,While Loop语句结束。
然后同时设置两个全局变量的Index数组为对应数值。
——
然后将Index重置为1,继续下一个检测循环,一直到所有单位都检测完成。
——————————
至此,当整个触发器完成时,可以实现:
1、对已经记录过的生产进度进行更新。
2、对还没有记录过的生产进度予以记录。
记录触发器完成。
2020年05月09日 14点05分 8
level 15
【当取消训练时返还的触发器】
事件为训练进度已取消是毫无疑问的了。
Tips:由于训练进度取消的瞬间,进度就归零了,因此这个返还是缺少了最后还未记录的0.25s(余是以0.25s为一个检测循环)的钱的。但好像有时候又不会少?反正无伤大雅...
————————
While Loop开头,Index默认为1。
如果触发单位(也就是进行训练的单位0)不等于 全局变量:正在生产的单位[Index] 的话。就index+1继续检测
一直检测到触发单位=正在生产的单位index,进入下一步。
如果一直检测到index>1024还没检测到,证明出了某种BUG,应当直接跳过剩余动作。
随后设置局部变量里的进度为 生产进度
因为生产进度的记录是实数,举例当进度是50%时,会记录为50.0实数。因此这里需要将局部变量的进度除以100,变成百分比进度。
然后设置单位价格,用的自定义函数上面讲过了。
设置应该返还的钱,用进度乘以单位价格,因为单位价格之前用的是整数,而进度是实数,因此需要先实数化。
然后就可以修改玩家晶体矿了,将应该返还的钱整数化之后予以添加。
最后【不能忘记】把两个全局变量的Index号数组都重设为无的状态,将其回收。不然接下来的游戏里这两个数组就会因为记录了废弃数据而【不能用了】,而且也没有什么好的办法可以再精确定位到这些废弃数据并删除。所以必须在流程结束的时候就即时清空回收。
2020年05月09日 14点05分 9
level 15
最后一个触发器。
【单位训练完毕的时候清空数据】
事件为单位训练进度已完成。由于单位训练完成了,所以必须清空对应的全局变量中的数据。
While loop和上面取消的触发器里是一样的,就不再赘述。
一样是检测到 当 触发单位=正在进行生产的单位[Index] 时,
就可以定位到废弃数据所在的Index数组。
然后清空对应的两个全局变量[Index]
和取消训练触发器的最后清空类似,也是必须在单位完成训练的时候就及时清空对应的Index数组,将其回收。否则一旦过了这个时点,将很难再定位到废弃的数据,会使得其中两个数组就会因为记录了废弃数据而【无法使用】。
——————
如果不能及时将废弃数据清空的话,1024个数组也远远不够用的,顶多训练第1024个单位的时候就会把数组全占满了。所以必须及时将废弃数据清空,将变量对应数组归零。
——————
至此,这个系统完成了。
2020年05月09日 14点05分 10
level 15
最后再补一个
这个触发器的存在是为了避免玩家白嫖时间
打个比方:
余的触发器检测是0.25s一个轮回的
但是如果有一个玩家,它刚好在一个0.25s结束后的0.01s(此时距离下次检测还有0.24s)
点击了训练
那么即使他完完全全,一分钱也莫得
也还可以白嫖0.24s,因为下一次的统一检测要在0.24s后。
因此就有了上图的触发器,当玩家选择开始一个新的训练时
会自动给负责训练的建筑加一个0.26s的暂停训练。
也就是说,在0.26s里训练进度会维持在0
而在0.24s后,触发器开始统一检测。如果检测到玩家的钱是足够的,也会自动解开这个暂停训练,确实的防止了白嫖0.24s的进度。
------------------------------------
谦卑·荣誉·牺牲·英勇·怜悯·灵性·诚实·公正!谨以上述守则为名,签订永恒契约,以吾「世界」为名,守护汝直至一生一世!
致扩散性百万亚瑟王·魔法之派·妖精·艾尔。
2020年05月09日 14点05分 11
level 14
大佬给跪了
2020年05月10日 03点05分 12
level 1
楼主在吗,想要一个恋活里的蛋糕物品mod
2020年07月06日 19点07分 13
1