植物大战僵尸吧 关注:575,481贴子:5,164,111

夜晚存冰核与白日存樱辣 —— 对准的使用方法

只看楼主收藏回复

如标题,某种奇妙的对准,以实现任意白卡的存储。


IP属地:山西来自Android客户端1楼2025-02-27 14:16回复
    效果演示:
    【存冰,但是夜晚场地】 https://b23.tv/oMxvKFU


    IP属地:山西来自Android客户端2楼2025-02-27 14:17
    回复
      2026-01-21 01:07:56
      广告
      不感兴趣
      开通SVIP免广告
      在开始一切之前,我需要为不了解frs的读者简单的介绍一下frs。
      frs,是利用旗帜僵尸的旗帜,来去除动画的操作。
      动画去除后他的位置会被释放,进而可以被其他动画占据。
      如果先去除一个植物的动画,再种植另一个刚好使用了这个动画空位的植物,两个植物就会共用动画。


      IP属地:山西来自Android客户端3楼2025-02-27 14:20
      回复
        紧接着,再介绍一个必要的结构叫DataArray,或者大家更能耳熟能详的栈位。
        PVZ的对象都有一个编号,以植物为例,第一个植物是0,第二个植物1,以此类推。当某个植物消失后,他的编号会被空出来供其他植物使用。
        后消失的植物,对应的空位先被使用。
        举个例子,编号4的植物先消失,紧接着编号6的植物消失,那么下一个植物先用编号6,再下一个植物用编号4。


        IP属地:山西来自Android客户端4楼2025-02-27 14:22
        回复
          编号并不是对象一消失就立刻可用的,而是每帧有一个特定的时机来统一回收。
          具体顺序为:
          ... → 植物/僵尸/...编号回收 → 游戏的大部分逻辑 → 动画/特效/...的编号回收 → ...


          IP属地:山西来自Android客户端5楼2025-02-27 14:24
          回复
            除了编号以外,还有一个概念是Key,Key和编号共同形成植物的ID。
            Key有一个初始值,之后每产生一个新对象,就会自动加1,65535后回到1。
            重进关卡或者重开游戏可以把Key恢复到初始值。
            frs需要利用重开游戏来让两个动画的Key和编号都一致来消除动画。
            但就夜晚存冰而言,我们并不需要Key的概念。


            IP属地:山西来自Android客户端6楼2025-02-27 14:26
            回复
              作为引入的内容就到此为止。
              接下来说正题。


              IP属地:山西来自Android客户端7楼2025-02-27 14:26
              回复
                首先我们需要了解两个必要的事实:
                1. 花盆上面放置植物时,对应编号的动画速度设置为0,这一过程不检查动画的Key,只跟编号有关。甚至对应编号的动画不存在也会设置;
                2. 模仿者会先愣神一段时间,然后开始旋转,旋转动画播放完毕后出现模仿植物。


                IP属地:山西来自Android客户端8楼2025-02-27 14:27
                回复
                  2026-01-21 01:01:56
                  广告
                  不感兴趣
                  开通SVIP免广告
                  我们布置这样的结构:
                  找个格子,比如1-1吧,放个花盆。
                  再找个格子,比如2-2吧,放个模仿者。
                  模仿者的动画编号和花盆一样,然后模仿者开始旋转,这时候我们在花盆上放个向日葵(当然其他植物也行,向日葵可以顺带偷个花),模仿者动画就会停止,也就永远不会产生模仿植物。


                  IP属地:山西来自Android客户端9楼2025-02-27 14:28
                  回复
                    我们需要模仿者模仿出来的时候,把向日葵铲除,模仿者继续运动,然后模仿成功!


                    IP属地:山西来自Android客户端10楼2025-02-27 14:28
                    回复
                      模仿者消失后,他的动画就会空出来。
                      我们想让这个过程可持续可重复使用,就不能让这一编号的动画随便乱跑,最好找个植物占据着,这样方便之后继续用。


                      IP属地:山西来自Android客户端11楼2025-02-27 14:29
                      回复
                        这是有可能的。
                        先前提到过,动画死亡后,他的编号并不能马上重用。
                        等到这帧快结束的时候,才会重新启用这个编号。
                        举个例子,假如一个植物死亡之后,一个土豆地雷刚好出土,产生闪灯动画,闪灯动画并不会使用这个植物死亡后留下的动画空位。因为这个动画空位此时还没有回收!
                        只有到这帧快结束的时候(之所以是快结束,是因为之后还有一小段非常小的事情要做),才会把空位回收,恢复可用。


                        IP属地:山西来自Android客户端12楼2025-02-27 14:29
                        回复
                          所以,我们只需要在下一帧立刻种一个植物,就能占据这个动画空位!


                          IP属地:山西来自Android客户端13楼2025-02-27 14:29
                          回复
                            但这仍然有一些问题。一个典型的问题是,如果同一帧,不止有这一个动画死亡了怎么办?比如,同一帧刚好有个樱桃生效,炸死一堆僵尸?


                            IP属地:山西来自Android客户端14楼2025-02-27 14:29
                            回复
                              2026-01-21 00:55:56
                              广告
                              不感兴趣
                              开通SVIP免广告
                              在动画空位回收的时候,按照编号从小到大依次回收。
                              而我们都知道,后回收的先使用。
                              所以我们只需要让花盆对应的动画编号非常大,那就没有问题了。


                              IP属地:山西来自Android客户端15楼2025-02-27 14:30
                              回复