三国群英2吧 关注:45,932贴子:1,015,590

回复:【脚本基础教程】第五章:摄像机与标记(武将技:前后伏兵)

只看楼主收藏回复

因此我们需要为士兵设置OF_MIXER标记。
有两种方法使得物件身上带有标记。其中一种方法是在Things点ini中设置:
[OBJECT]
Name = 弓箭兵
Sequence=103
Type = %TYPE_FORCE
Space = 8,8,64,0
Flags = OF_MAN, OF_BIGSHAPE
Process =%ForceSoldierObjectProcess
Directory= \Force\
Wait = MFW10001, #16, MFW10002, #8, MFW10003,#8, MFW10004, #16, MFW10003, #8, MFW10002, #8
Walk = #4, MFR10001, MFR10002, MFR10003,MFR10004, MFR10005, MFR10006, MFR10007, MFR10008
Attack = #3, MFA10001, MFA10002, MFA10003, MFA10004,@%OM_ATTACK, #8, MFA10005, #3, MFA10006, MFA10007, MFA10008, SCROVER
Win = #3, MFA20001, MFA20002, MFA20003,MFA20004, MFA20005, @%OM_ATTACK, MFA20006, MFA20007, MFA20008, SCROVER
Defense =#8, MFD10002, SCROVER
Death = #5, MFF10001, MFF10002, MFF10003, #128,MFF10004, #5, MFF10005, #128, MFF10005, #9999, @%OM_DEATHSTOP, SCROVER
Pain = #5, MFFS0001, MFFS0002, MFFS0003, #128,MFFS0004, #5, MFFS0005, #128, MFFS0005, #9999, @%OM_DEATHSTOP, SCROVER


IP属地:中国香港18楼2020-03-20 13:55
回复
    这种方法简洁明了。但是存在一个问题:如果直接在Things点ini中设置标记,将会影响到通过其它方式生成的物件,也即开场自带的士兵。我们试着给弓箭兵在Things点ini中的原型加上OF_MIXER(混色),将会得到以下结果:


    IP属地:中国香港19楼2020-03-20 13:58
    回复
      2026-01-19 08:47:58
      广告
      不感兴趣
      开通SVIP免广告
      因此我们必须采用另一种方法:在脚本运行时再指定标记。我们可以通过以下系统函数获取和设置物件的标记:
      intGetObjectFlags (int objectHandle);
      void SetObjectFlags (int objectHandle, int flags);
      void ClearObjectFlags (int objectHandle, int flagsToClear);
      其中,GetObjectFlags函数用来获取物品的所有标记(将会得到整个bitset)。这个函数很少用到。我们主要用后面两个:SetObjectFlags函数用来设置指定的标记,而ClearObjectFlags函数则用来清除指定的标记。例如:
      SetObjectFlags (intvAttackerMajor, OF_MIXER);
      将会给主将打上OF_MIXER标记。打上标记后,可以再次清除该标记,而不影响其它的标记:
      ClearObjectFlags (intvAttackerMajor, OF_MIXER);


      IP属地:中国香港本楼含有高级字体20楼2020-03-20 14:01
      回复
        我们来实践一下,在为伏兵设置不透明度前先给伏兵加上OF_MIXER(混色)标记:

        得到如下结果:


        IP属地:中国香港21楼2020-03-20 14:04
        回复
          六、加色、减色和混色标记
          所谓加色,就是在背景的基础上,将颜色加上当前物件的颜色;减色则相反,在背景的基础上,将颜色减去当前物件的颜色。混色则是将背景和当前物件的颜色混合。
          本文不在此详细介绍具体的原理,有兴趣的读者可以百度一下。大多数情况下,我们只需要知道,混色用于制造半透明的物件,是设置不透明度所必须的;加色通常用于处理原图中的黑色背景,它总是使得物件变得更亮。减色则很少被用到。
          (更具体地说,加色和减色被用于处理半透明像素的情况。使用RPGViewer将PNG格式导出为SHP时,只能创建全透明和全不透明的像素,无法创建半透明像素。使用加色和减色标记可以达到类似的效果。减色标记用得很少,一般用于物件本身是黑色的情况;具体可以参考第七章第三节中的地裂效果。)
          例如,上一章“大喝”使用的光气环就使用了加色标记;读者可以在Things点ini中找到相应的定义。这个物件的原图的确就长下面这个样子:它的背景是黑色的。利用加色后,由于任何颜色加上黑色都等于原来的颜色,因此施放武将技时看不到黑色的背景。

          [OBJECT]
          Name = 擴張的光氣環
          Sequence=18002
          Type =%TYPE_FORCE
          Space = 0,0,0,0
          Flags = OF_NOGRAVITY, OF_MIXER, OF_WHITELIGHT
          Process =%MagicObjectProcess
          Directory= \MAGIC\008
          Wait = #9999, m008circle
          同时,因为需要调整透明度,混色标记也是需要打上的:SetObjectOpacity只对带混色标记的物件有效。
          (剩下的一个标记是OF_NOGRAVITY。由于我们的物件的z坐标不是0,如果不打上OF_NOGRAVITY标记指定该物件不受重力影响,光气环会自动坠落到地面上;关于重力的相关内容详见第七章第五节。)


          IP属地:中国香港本楼含有高级字体22楼2020-03-20 14:07
          回复
            我们在上面伏兵的代码中,将打上的标记由OF_MIXER改为OF_WHITELIGHT,以显示加色的效果:

            改为OF_DARKLIGHT则可以显示减色的效果:

            如果在Things点ini中指定OF_MIXER,但没有调整物件的不透明度,则物件的不透明度在50%左右。


            IP属地:中国香港23楼2020-03-20 14:10
            回复
              七、“特殊放大的物件”标记
              在Things.ini中,所有主将、士兵类物件都有“特殊放大的物件”标记,即OF_BIGSHAPE。在笔者多年前的Things点ini心得中已经提到过,所谓“特殊放大的物件”,并不是说这个物件在EXE中被特殊放大;相反,它指的是在制作这个物件的SHP的过程中,图形被人为地放大以达到更高的精细度,因此,放到EXE中时,反而需要将这个物件的尺寸缩小。
              读者可以试着用ClearObjectFlags把士兵的OF_BIGSHAPE标记删除:

              将会得到如下“充气”的士兵:

              一般来说,对于纯粹“魔法效果”的物件,使用OF_BIGSHAPE的助益不大(相反,会因为无法缩放而限制操作);但对于相对“实体”的物件(例如冲车、拒马、龙炮之类的武将技物件),使用OF_BIGSHAPE有助于提高图形的精细度。一般而言,在Things点ini中设置即可。
              需要注意两点:
              1. 使用OF_BIGSHAPE会使得图形的宽高缩小到原来的约70%;
              2. 使用OF_BIGSHAPE后,无法使用SetObjectScale()函数对物件进行任何形式的再次缩放。


              IP属地:中国香港本楼含有高级字体24楼2020-03-20 14:13
              回复
                八、利用混色标记实现渐变效果
                为了进一步完成我们的武将技,我们将配合使用混色标记,调整士兵的不透明度,以达到渐变出现的效果。在原版magic点cpp中,奥汀已经预先写好了这个功能,即StepShow函数。不过,我们完全可以自己实现这个函数。
                我们需要做什么?首先,在生成一个士兵后,我们首先用SetObjectFlags,给该士兵打上混色标记;紧接着,我们用SetObjectOpacity,将物件的不透明度设为0;然后,我们用一个for循环,手动每过1 Tick,调整一次物件的不透明度,逐步将物件的不透明度上调为16(100%);最后,当物件完全不透明时,我们删除物件的混色标记。
                具体的代码如下:

                这样就可以实现我们想要的效果了。事实上,除了少了一个参数外,这个函数和magic点cpp中的StepShow函数几乎完全相同。


                IP属地:中国香港本楼含有高级字体25楼2020-03-20 14:17
                回复
                  2026-01-19 08:41:58
                  广告
                  不感兴趣
                  开通SVIP免广告
                  接下来,我们将对每一个士兵应用这个淡入效果。读者可能很自然地想到用这样的办法:

                  且慢——这样会造成一个问题。当进入MyStepShow函数时,由于里面包括一个含Delay的循环,代码会在MyStepShow函数里面等待——这样会导致士兵一个一个出来。我们希望在执行MyStepShow函数时,不影响外层循环的正常执行。有什么办法吗?
                  事实上,并行执行正是三国2脚本的长项,也是奥汀要使用一门脚本语言来编写武将技的根本原因。我们将在下一章“异步与回调”中,详细介绍并行执行多个函数的相关内容。在这里,读者只需要知道,我们可以在不接收返回值的函数调用前,使用asynccall关键字指示程序进行异步调用


                  IP属地:中国香港本楼含有高级字体27楼2020-03-20 14:25
                  回复
                    本章引入的系统函数和官方函数
                    // 摄像机相关函数
                    void SetCameraByReference (int objectHandle, int xOffset, int yOffset); // 根据物件相对位置调整摄像机坐标
                    int GetCameraX (); // 得到摄像机X坐标
                    int GetCameraY (); // 得到摄像机Y坐标
                    // 在指定战场坐标处创建士兵
                    int CreateSoldier (int isLeft, int battleX, int battleY);
                    // 获取、设置和删除标记
                    int GetObjectFlags (int objectHandle);
                    void SetObjectFlags(int objectHandle, int flags);
                    void ClearObjectFlags (int objectHandle, int flagsToClear);
                    // 平移摄像机(magic点cpp)
                    void MoveCamera (int x, int y, int duration);
                    // 渐入效果(magic点cpp);第二个参数指定过多少Tick变化1点不透明度
                    void StepShow (int object, int ticksPerOpacity);


                    IP属地:中国香港本楼含有高级字体29楼2020-03-20 14:31
                    回复
                      (度娘开始抽贴了。看来我得缓一缓,明天再发。)


                      IP属地:中国香港30楼2020-03-20 14:36
                      回复
                        666


                        IP属地:江苏来自Android客户端31楼2020-03-20 14:43
                        收起回复


                          32楼2020-03-21 00:09
                          收起回复


                            IP属地:中国香港33楼2020-03-21 00:46
                            回复
                              2026-01-19 08:35:58
                              广告
                              不感兴趣
                              开通SVIP免广告


                              IP属地:中国香港34楼2020-03-21 00:53
                              回复