三国群英2吧 关注:45,915贴子:1,015,392
  • 16回复贴,共1

【脚本基础教程】第九章(下):士兵技(骑兵冲锋)

只看楼主收藏回复

视频来自:百度贴吧


IP属地:美国1楼2020-04-19 08:56回复
    大佬有想法


    2楼2020-04-19 09:35
    回复
      2026-01-14 05:49:35
      广告
      不感兴趣
      开通SVIP免广告
      大佬,请问下根目录是指哪个?


      IP属地:湖南来自iPhone客户端3楼2020-04-19 09:41
      回复
        士兵突击,666,有重击。


        IP属地:重庆来自Android客户端4楼2020-04-19 09:54
        回复
          冲锋。。好厉害。。


          IP属地:广东来自Android客户端5楼2020-04-19 10:24
          回复
            强悍的冲锋


            6楼2020-04-19 10:34
            回复
              关于在Things ini中加入脚本调用代码的内容,请先参阅本章第一节:
              https://tieba.baidu.com/p/6612770332
              另:一楼视频为了演示,没有太认真打。还望轻喷。


              IP属地:美国7楼2020-04-19 10:49
              回复
                四、士兵技的创建
                士兵技能的创建和必杀技有许多类似的地方。和必杀技一样,我们可以往士兵物件在Things ini中的定义里添加脚本的调用。
                我们添加的士兵技属于长枪兵骑兵。编辑Things ini如下:
                [OBJECT]
                Name = 長槍兵 (騎兵)
                Sequence= 141
                Type = %TYPE_FORCE
                Space = 8,8,64,0
                Flags = OF_MAN, OF_BIGSHAPE
                Process =%ForceSoldierObjectProcess
                Directory = \Force\
                Wait = MCHW0001, #16, MCHW0002, #8, MCHW0003,#8, MCHW0004, #16, MCHW0003, #8, MCHW0002, #8
                Walk = #4, MCHR0001, MCHR0002, MCHR0003,MCHR0004, MCHR0005, MCHR0006, MCHR0007, MCHR0008, MCHR0009
                Attack = #0, MCHA0002, !50201, #3, MCHA0002, MCHA0003, MCHA0004, MCHA0005, MCHA0006, MCHA0007,@%OM_ATTACK, MCHA0008, MCHA0009, MCHA0010, MCHA0011, SCROVER
                Win = #0, MCHB0002, !50201, #3, MCHB0002, MCHB0003, MCHB0004, MCHB0005, MCHB0006, MCHB0007, @%OM_ATTACK,MCHB0008, MCHB0009, MCHB0010, MCHB0011, SCROVER
                Defense = #8, MCHD0002,SCROVER
                Death = #5, MCF10001, MCF10002, MCF10003,MCF10004, #128, MCF10006, #5, MCF10007, MCF10008, MCF10009, MCF10010, #128,MCF10010, #9999, @%OM_DEATHSTOP, SCROVER
                Pain =#5, MCFS0001, MCFS0002, MCFS0003, MCFS0004, #128, MCFS0006, #5, MCFS0007,MCFS0008, MCFS0009, MCFS0010, #128, MCFS0010, #9999, @%OM_DEATHSTOP, SCROVER
                这里我们用到了一个小技巧。我们希望士兵技在攻击动作未开始时就触发,但是,如果将!50201直接放在序列的最前面,反而是无效的(具体原因尚不明确)。因此,我们往序列的最开始加了一个持续时间为0的帧(#0),这样在保持动画效果不变的同时,使得我们的!50201脚本能在动画序列开始之前执行。
                我们先编写主函数,测试一下是否有效:



                IP属地:美国本楼含有高级字体8楼2020-04-19 11:34
                回复
                  2026-01-14 05:43:35
                  广告
                  不感兴趣
                  开通SVIP免广告
                  五、实例推进:确定骑兵冲锋的终点
                  我们希望实现的效果是一个“骑兵冲锋”的效果:当士兵技发动时,骑兵将向前踏过正前方的三名士兵,然后回到原来的位置;如果被自己人或敌方主将挡住,则士兵技将提前结束。
                  我们来手动实现一下。
                  首先,在士兵技主函数HorseCharge的开头,我们先获取施放士兵技的士兵、所属方和士兵面朝的方向;由于士兵技的攻击会涉及到主将,因此,我们还需要通过本章第二节(见7楼的链接)中介绍的方法,获取敌方主将物件。如下:

                  其次,我们需要判断冲锋的距离。我们已经提到,这一士兵技在冲锋时只会冲倒面前的3个敌方士兵,如果遇到自己人或对方主将则停下来;因此我们需要经过一轮遍历,逐个确定面前的3个单位是否是敌方士兵。这会有一点麻烦,但逻辑并不复杂;无非是使用GetForceHandleByXY函数得到指定战场坐标处的士兵或主将,然后,使用GetForceSide确定所属方。


                  IP属地:美国本楼含有高级字体9楼2020-04-19 11:38
                  回复
                    六、在脚本中位移士兵
                    现在我们确定了要冲倒几个人。下一步是,将士兵进行位移,冲倒面前的士兵。
                    然而,有一个问题:在群2中,通过脚本是无法真正改变士兵的位置的。读者可以试着使用SetObjectCoordinate函数,强制将一个随机士兵移动到(0, 0)位置,可以发现:1. 小地图上士兵的位置并没有变化;2. 士兵物件会被“平移”回自己原来所在的位置。
                    我们可以试着操作一下。我们创建一个新的代码文件,将士兵技的内容暂时写为,强制移动到(0,0)的位置(即地图的左下角):


                    可以看到,虽然在地图的左下角出现了士兵,但是,士兵会朝着自己本该在的位置“漂移”回去;画面左下方露出马尾巴的士兵是刚被位移到(0,0)坐标的士兵,而在他旁边的是正在往回漂移的士兵。此外,小地图的左下角没有出现绿点,这说明士兵并没有被真正移动到那里,而是仍然在原来的位置,并且,仍然可以遭受攻击(见画面中死亡的士兵)。


                    IP属地:美国本楼含有高级字体10楼2020-04-19 11:42
                    回复
                      看上去,这个特性有一些令人沮丧。不过,至少有一个好消息:至少我们可以在脚本中指定士兵的位置——这意味着,我们可以通过手动动画的方式,在每一Tick都强制指定士兵的位置,来达到我们想要的攻击画面效果。虽然每一帧系统都会试图将士兵往回拉,但是每一帧我们都会强制更新士兵的位置,这样就会使得往回拉的动作失效。
                      我们来着手实现这个效果。
                      首先,触发骑兵冲锋时,骑兵处于攻击(AT()TACK或WIN)动画序列中;但是既然是冲锋,骑兵应该处于移动状态。因此我们使用SetObjectAnimate设置骑兵的动画为WALK序列:
                      // 士兵技动画开始:播放士兵WALK序列
                      SetObjectAnimate(soldier, OAF_WALK);
                      接着,我们来实现手动动画。这个冲锋的过程每冲过1格用时9 Tick;对于每个Tick,我们都计算骑兵物件应该处于的X坐标,并连续使用SetObjectCoordinnate、SetObjectDir、SetObjectSpeed_Cylind三个函数,确保在这一Tick内,士兵的位置正确、朝向正确、不会发生位移。

                      最后,每冲过一段位移,我们都判断士兵的当前屏幕坐标处是否有敌方士兵。如果有敌方士兵,则使用KillForce函数将其杀()死:

                      这样就完成了。


                      IP属地:美国11楼2020-04-19 11:46
                      回复
                        最后,我们希望在骑兵冲过所有距离,抵达目标位置后,跑回他原本应该在的位置。不过,我们已经提过,EXE在士兵物件的位置偏离其真实位置时,会自动将士兵逐渐拉回原地;因此这个步骤完全可以交给EXE代劳,我们无需做任何事情。
                        入口函数方面,我们还需要添加士兵技的施放概率。为了方便起见,我们象征性地设为100%,这样比较容易看到效果:


                        IP属地:美国12楼2020-04-19 11:50
                        回复
                          士兵技“骑兵冲锋”的完整代码



                          IP属地:美国本楼含有高级字体13楼2020-04-19 11:53
                          回复

                            上图中,某位骑兵连续冲过了3个身位,将3名朴刀兵冲倒在地。
                            至此,必杀技和士兵技的部分我们就介绍完毕了。
                            如果运用更复杂的内存操作的话,我们可以实现更丰富的效果。例如,我们可以使用内存操作短时间内修改了对方的兵种,并使用CreateSoldier函数创建指定兵种。此外,如果兵种自身为远程兵的话,我们甚至可以将调用脚本的 !xxxxx 命令替换原来的OM_ATTACK,让士兵每次射出的物件都是武将技物件,并由我们自己来决定远程攻击的效果。本章的内容仅供抛砖引玉;笔者希望本章的内容能为新的、有创意的必杀技和士兵技提供一些启迪。
                            (本章引入的系统函数和官方函数,均已在上半部分介绍过。)


                            IP属地:美国本楼含有高级字体14楼2020-04-19 11:56
                            回复
                              2026-01-14 05:37:35
                              广告
                              不感兴趣
                              开通SVIP免广告
                              附录:一些可能的内存操作
                              之前已经提过,通过内存操作,我们可以实现许多功能。笔者在此列举一些可能的做法,以供启迪。
                              在士兵技中,我们之前提到过,可以通过改变我方的兵种类型,来指定为我方招出特定兵种的士兵,同时不影响其他的士兵,也不影响兵种相克(因为它已经在战前计算士兵战力时计算完成)。例如,下面的代码指定召唤长枪兵骑兵:

                              注意在修改兵种、召唤士兵后,记得把兵种改回来。否则会影响到之后伏兵武将技的结果。此外,还需说明的是,这种方法召唤出的士兵,虽然兵种相克仍按照我方原来的兵种,但其远程攻击属性是它自己的属性;例如,我方是长枪兵,召唤出弓箭兵,弓箭兵一样是可以射箭的——并且因为相克仍然是长枪兵的相克,可以轻松地射穿对面的朴刀和武斗。


                              IP属地:美国本楼含有高级字体15楼2020-04-19 11:59
                              收起回复