找回密码
 点一下
楼主: 屋上

如何實現互斥的建築升級?

[复制链接]
发表于 2008-3-19 19:35:13 | 显示全部楼层
对哦~~这个是bug呢~~等下我回去的时候修改下~~
回复

使用道具 举报

发表于 2008-3-19 20:13:39 | 显示全部楼层
我前面的帖子里也修改了~~所以这里只提改动过的部分~~注意由于TD的塔都是无敌的~~所以这里没有考虑塔死亡的情况哦~~如果你的塔能被攻击~~那么也可直接把死亡事件套升级取消那个触发上~~




由于触发器中无法直接地获得被取消的塔升级~~所以这里有点小麻烦~~

所幸塔升级和科技研究不同~~并不存在研究队列这个潜在问题~~因此只要实现记录下塔在开始升级时候的单位类型就可以了~~

这边用了个单位组来记录目前该玩家所拥有的所有正在进行2选1升级的塔~~然后如果取消升级的塔是组中最后一个塔~~则恢复到2选1状态~~如果还有其他任何正在进行这种升级的塔~~则不恢复~~


发现塔正在进行关键升级,则编入单位组
[trigger]
Start
    Events
        Unit - A unit Begins an upgrade
    Conditions
        Or - Any (Conditions) are true
            Conditions
                (Unit-type of (Triggering unit)) Equal to Guard Tower
                (Unit-type of (Triggering unit)) Equal to Cannon Tower
    Actions
        Unit Group - Add (Triggering unit) to UpgGroup[(Player number of (Triggering player))]
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                (Unit-type of (Triggering unit)) Equal to Guard Tower
            Then - Actions
                Player - Limit training of Cannon Tower to 0 for (Triggering player)
            Else - Actions
                Player - Limit training of Guard Tower to 0 for (Triggering player)
[/trigger]


撤销升级的话首先退出单位组,在看看里面是不是已经没单位了(也就是自己是最后一个退出的)
[trigger]
UCancel
    Events
        Unit - A unit Cancels an upgrade
    Conditions
        UpgLock[(Player number of (Triggering player))] Equal to False
        ((Triggering unit) is in UpgGroup[(Player number of (Triggering player))]) Equal to True
    Actions
        Unit Group - Remove (Triggering unit) from UpgGroup[(Player number of (Triggering player))]
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                (UpgGroup[(Player number of (Triggering player))] is empty) Equal to True
            Then - Actions
                Player - Limit training of Guard Tower to -1 for (Triggering player)
                Player - Limit training of Cannon Tower to -1 for (Triggering player)
            Else - Actions
[/trigger]

建造完成的塔也需要退出,确保组中的单位全部是正在建造关键升级的单位
[trigger]
UFinish
    Events
        Unit - A unit Finishes an upgrade
    Conditions
        Or - Any (Conditions) are true
            Conditions
                (Unit-type of (Triggering unit)) Equal to Guard Tower
                (Unit-type of (Triggering unit)) Equal to Cannon Tower
    Actions
        Set UpgLock[(Player number of (Triggering player))] = True
        Unit Group - Remove (Triggering unit) from UpgGroup[(Player number of (Triggering player))]
[/trigger]

UniqueResearch.w3x

20 KB, 下载次数: 10

回复

使用道具 举报

发表于 2008-3-19 22:47:44 | 显示全部楼层
  1.     事件
  2.         单位 - 任意单位 开始施放技能
  3.     条件
  4.         (施放技能) 等于 咆哮
  5.     动作
  6.         单位 - 命令 (触发单位) 建造/升级为 炮塔
  7.         玩家 - 设置 神秘之塔 不可取得的 对 ((触发单位) 的所有者)
复制代码

当然这个测试还不成功,因为没有办法捕捉到单位升级事件……
不过从另一个角度来说,可以通过禁用升级后的单位来进行限定,太晚了,睡了~明天再找找
回复

使用道具 举报

发表于 2008-3-19 22:53:16 | 显示全部楼层
刚才不甘心,又测试了一次,结果如下:
  1.     事件
  2.         单位 - 任意单位 开始建筑升级
  3.     条件
  4.         ((触发单位) 的类型) 等于 炮塔
  5.     动作
  6.         玩家 - 设置 神秘之塔 不可取得的 对 ((触发单位) 的所有者)
  7.         玩家 - 设置 防御塔 不可取得的 对 ((触发单位) 的所有者)
复制代码

可以说,在执行了炮塔升级以后,其它两个塔将不再可以升级!貌似达到了限定要求……取消炮塔升级也一样。
再看了一下题目,貌似如果单位没有升级成功,那么其它塔类型同样可以升级,所以更改事件如下:
  1.     事件
  2.         单位 - 任意单位 完成建筑升级
  3.     条件
  4.         ((触发单位) 的类型) 等于 炮塔
  5.     动作
  6.         玩家 - 设置 神秘之塔 不可取得的 对 ((触发单位) 的所有者)
  7.         玩家 - 设置 防御塔 不可取得的 对 ((触发单位) 的所有者)
复制代码

从理论上来说,这一套应该可以达到楼主的要求,只不过相对应的需要多做触发器(每一个塔都需要对应的触发)。
回复

使用道具 举报

发表于 2008-3-19 23:00:22 | 显示全部楼层
跟你说你先把题目看明白再说~~
回复

使用道具 举报

发表于 2008-3-19 23:08:22 | 显示全部楼层
题目不是 如果塔1可以升级 2 3 4 三种塔,升级了2,所有的塔1都不再可以升级3和4这两种了吗?
从头目你的话中我也是这样理解的:
这边用了个单位组来记录目前该玩家所拥有的所有正在进行2选1升级的塔~~然后如果取消升级的塔是组中最后一个塔~~则恢复到2选1状态~~如果还有其他任何正在进行这种升级的塔~~则不恢复~~

好吧,因为涉及到第二个同时升级的塔会造成一定的麻烦……所以明天再说了~~
回复

使用道具 举报

发表于 2008-3-20 07:06:00 | 显示全部楼层
还明天再说~~我早就给了演示了你究竟没看过~~好像要大家等你大驾来才能解决这个疑难杂症似的~~

看都没看明白问题上来就说我的方法太麻烦~~

然后还美滋滋地拿出来一套方案~~还说什么甘心不甘心~~你用了升级塔的事件来触发的话跟我的演示有什么区别?~~而且你的取消效果都还实现不了~~就算你之后做出来取消效果还不是跟我的演示一样?~~简直莫名其妙~~说人家太麻烦~~自己到头来还是用这种方法~~用这种方法不说罢~~还叫人家等你做出来~~你自己想想你是多么的令人生气~~

我前面的分析你一句也没看进去么?~~
回复

使用道具 举报

发表于 2008-3-20 07:14:35 | 显示全部楼层
而且我这个演示的这种写法还是为了易懂起见~~更方便人理解~~

如果让我用等价物来做的话只需要一个触发器~~


但是那种写法太古怪了~~我担心楼主理解不了用法~~因为要在TD中大量使用的话就不能在不理解的基础上使用~~操作不当容易引起游戏崩溃~~所以我才用这种开始升级、取消升级、完成升级的三段论弄了三个触发~~
回复

使用道具 举报

发表于 2008-3-20 08:36:54 | 显示全部楼层
好吧,我知道错了~我也没说叫谁等嘛~只不过你的方式感觉有点怪怪的,呜,不习惯太高级的用法……
至于取消方面可以利用变量组来进行条件裁定~这方面应该不会有大问题吧……不过做起来的确比较麻烦……
好吧,另外一件事我道歉~呜,我没有仔细看你的触发,可以说跟本没看,我只看你的一些解释……
因为满屏的E文很直觉的我把这个当成JASS了……我知道错了,我认罚,我面壁,我中午不吃饭了(吃面)……
回复

使用道具 举报

发表于 2008-3-20 11:43:50 | 显示全部楼层
  我的想法也基本上是基于等价物原理吧~类似我原来做的通用型物品合成触发一样,利用平行的数据来分别赋值给变量,然后用一个中介的变量来判断是否在升级过程中取消,因为测试时取消的话会反回原始单位,因此在第一个单位开始升级的时候就直接禁止其它单位的使用,这样就不会有第二个同时建造升级的问题~在取消的同时判断中介变量值来进行是否恢复的操作~再次向头目道歉~最近因为某些用JASS的高人的高调行为,让我对JASS有些看法,再加上以为头目的强势出现就是JASS,呜……报歉……
回复

使用道具 举报

 楼主| 发表于 2008-3-20 13:51:23 | 显示全部楼层
-------------------------------------
感謝所有幫忙的人,感謝Renee大詳細的範例
這個我昨天已經實現了
其實用科技需求的方式解決就容易的多了
事件"開始研發"
然後判斷研發的科技是B還是C的需求,然後把另一個的可以昇級等級設0
這樣就可以做出一套多變的科技樹了
---------------------------------------
要做的是一張可以選擇崇拜神明的地圖,基本上想模仿神話+中土戰爭
所以需要這個東西(同時崇拜2位衝突的神明可是很怪的)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-9 05:59 , Processed in 0.040233 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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