三国群英2吧 关注:45,912贴子:1,015,293

回复:【脚本基础教程】第七章:物理引擎(地火 / 地焰涌 / 地焰星燃)

只看楼主收藏回复

最后,我们还将移植大地狂啸中画面抖动的效果及其音效。我们一直没有为该武将技中的任何元素增添音效,即使火球落地也没有爆炸的声音;我们现在就将一并处理这个问题。
这里,为简便起见,笔者直接在当前摄像机位置上增加随机的偏移量。这是因为在多级武将技中,摄像机要在各个地裂喷发点之间来回移动,不能像大地狂啸一样瞄准一个固定位置;但是,这样做带来的坏处是,我们事实上构造了一个二维的随机游走过程,根据相关的数学定理,随着画面的抖动,我们会离最开始摄像机对准的中心位置越来越远……由于我们的代码已经很多了,这个问题笔者选择不去处理,实际效果还是能看的。

这里,每3 Tick中有2 Tick会抖动一次屏幕,同时,每80 Tick重播一次地震的音效。
主函数中也添加相应的异步调用。当然,时间要算准:
// 地震效果
asynccall ShakeCameraAndQuakeSound(80 * (level -1) + 260);


IP属地:美国本楼含有高级字体39楼2020-03-31 04:17
收起回复
    武将技“地火”的完整代码




    IP属地:美国本楼含有高级字体41楼2020-03-31 10:51
    回复
      2026-01-12 22:16:13
      广告
      不感兴趣
      开通SVIP免广告


      完成!我们终于制造出了一个复杂度和原版武将技匹敌的“指向性”杀兵技。
      在这一章中,我们综合运用了许多之前章节介绍的知识点,来构建我们的这个武将技。在本章的中部,我们介绍了三国2脚本的物理引擎和加速度系统;虽然加速度只有两个维度,无法实现任意方向的加速度,但是对于一般情况而言这样已经足够了。针对“地火”武将技的需求,我们还介绍了球坐标相关函数的使用方法。
      下一章中,我们将涉足数组。我们之所以把数组放在如此靠后的位置,是因为在编写武将技的绝大多数情况下,我们都完全不需要使用数组。不过,作为三国2脚本的重要语法特性,数组仍然是绕不过去的一环。


      IP属地:美国本楼含有高级字体42楼2020-03-31 10:57
      回复
        本章引入的系统函数和官方函数
        // 批量载入图形文件
        void BatchLoadShape (string path);
        // 得到“关键度”最高的士兵(人堆中的士兵)
        int GetMostImportantSoldier (int isLeft);
        //得到随机活着的士兵
        int GetRandomSoldierHandleFromAlive (int isLeft);
        //得到以(x0, y0)为中心,坐标在[x0-width,x0+width],
        //[y0-width, y0+width]矩形范围内的士兵数量
        int GetForceCountInRect (int isLeft, int x0, int y0, int width, int height);
        //得到以(x0, y0)为中心,坐标在[x0-width,x0+width],
        //[y0-width, y0+width]矩形范围内的第n个士兵
        int GetNthForceInRect (int isLeft, int x0, int y0, int width, int height, int n);
        //按照球坐标设置物件速度
        void SetObjectSpeed_Sphere (int object, int theta, int phi, int speed);
        //按照球坐标,以参考物件为原点设置物件位置
        void SetCoordinateByReference_Sphere (int object, int referenceObject, int theta, int phi, int radius, int zOffset);
        //设置物件是否受重力影响
        void SetObjectHasGravity (int object, int hasGravity);
        //设置重力加速度的大小(32768=1)
        void SetObjectGravity (int object, int gravity);
        //设置阻力加速度的大小(1=1)
        void SetObjectFriction (int object, int friction);
        //设置阻力加速度的大小(0x10000(65536)=1)
        void SetObjectFriction1 (int object, int frictionTimes0x10000);
        //设置OF_TARGET标记的物件的目标
        void SetObjectTarget (int object, int targetObject);


        IP属地:美国本楼含有高级字体43楼2020-03-31 11:08
        回复
          贴了三天,总算是贴完了这一章。
          一开始构想这章的内容的时候,想的其实只是从地裂中抛出火球这个效果,和物理引擎的关系最密切。但是写着写着发现很多东西前面都没有介绍过(比如武将技的打击目标),加上要做得完成度比较高的话,有很多额外的东西需要考虑,最后堆着堆着就30+页了。
          说来各位可能不信,写这个武将技浪费时间最多的地方,其实是在怎么弄出那个地裂效果……我前面刚写过OF_DARKLIGHT一般用不上,结果到这章才发现这个效果还非得用DARKLIGHT不可,简直花式打自己脸。
          这个武将技算注释有200+行,堆了不少东西进去,感觉炫技成分大于理论成分;而且,阻力其实没有真正用在这个武将技里面。不过,至少教程里有一个够复杂的、可以比肩原版的一些大型武将技的实例了。希望对各位有所启迪吧。


          IP属地:美国44楼2020-03-31 11:22
          回复
            附图:关于第三节中的“地裂”和“地裂岩浆”两个物件是如何组合的
            下面的结果是我在PS里设置两个图片的混合模式完成的。我设置了一个灰色的底,这样可以表现出各个物件和背景底色混合时的结果。读者也可以在该图中看出OF_WHITELIGHT(加色)和OF_DARKLIGHT(减色)两个物件标记的作用和显示效果。


            IP属地:美国本楼含有高级字体45楼2020-03-31 11:50
            回复
              压技时间还可以长点


              IP属地:湖南来自Android客户端46楼2020-03-31 14:05
              回复
                666666


                IP属地:河南47楼2020-08-09 16:14
                回复
                  2026-01-12 22:10:13
                  广告
                  不感兴趣
                  开通SVIP免广告
                  好复杂,做为一个伸手党,就准备问吧主要TXT文件直接复制了。


                  IP属地:福建48楼2020-08-09 17:05
                  收起回复
                    所以什么时候出mod,我可以提供测试


                    49楼2020-08-13 00:04
                    收起回复