besiege吧 关注:85,452贴子:857,580

我在BSG里玩儿俄罗斯方块

只看楼主收藏回复

在BSG里,你不止能够造飞机坦克大炮,你甚至还可以玩扫雷、打飞机、三维弹球等。
当然啦,现在,我们也可以玩俄罗斯方块了!




IP属地:河南1楼2018-02-05 21:21回复


    来自Android客户端4楼2018-02-05 21:28
    回复
      看~前面有一个大佬,他的编程知识是度娘的的8倍。
      我们要怎么做呢?从后面慢慢地接近他,然后抓住他并去掉……呸 不是 我们要膜拜他并向他求问原理……
      所以说原理是什么啊大佬!


      IP属地:广西6楼2018-02-05 22:15
      收起回复
        有没有贪吃蛇


        IP属地:江西7楼2018-02-05 22:33
        收起回复

          继可动人偶,besiege又一神教诞生


          IP属地:广东8楼2018-02-05 22:51
          收起回复
            视频里,实现程序的原理可能讲解的不是很清楚,我就在帖子里再讲解详细一点吧。
            首先是方块形状随机设置系统。
            方块形状随机设置系统的核心,就是“叉叔随机数”。
            叉叔的行为设置为随机走动,而在叉叔周围的不同方位设置多个触箱,每个触箱代表了不同的形状。这样一来,我们就能够产生需要的形状了。
            俄罗斯方块一共7种形状。叉叔进入每个触箱后,首先触箱会将叉叔失活,之后将4个方块移动到指定位置,构成特定的形状。然而实际上,从初始的T形转变到另外6种形态都只需要移动一个方块及其伴随触箱。而第8个触箱则同样是长条形触箱,这样就能一定程度上降低游戏难度。
            “叉叔随机数”完成后并不会直接启动方块,启动程序分别写在了建造箱的按键里和两个命令方块1-5、2-5里面。
            建造箱里的程序是,首先激活叉叔(叉叔自身设置为开局失活),等待1.5s确保叉叔已经触发触箱了,再把第一组下落方块和伴随触箱送到起点,然后激活命令方块1-1,1-2,1-3,1-4。这4个分别控制下落、左移、右移、左右滚转。
            而后面的自动切换过程,交给了各组的伴随触箱。伴随触箱接触任意方块后,重置4个伴随触箱,并关闭本组的4个命令方块,之后就会激活本组的第5个命令方块。这个命令方块就会在下降本组的下落方块后,将另一组的方块和伴随触箱送到顶部起点,同时激活对方的前4个命令方块。
            这还不算完,同时还要激活并复原自己的叉叔,然后复原本组的4个下落方块。就这样,完成一次复杂的落地循环。


            IP属地:河南9楼2018-02-05 23:16
            收起回复
              然后就同时介绍下落系统、左右平移系统吧。

              这三个系统的基础都是,让所有本组的方块和触箱向指定方向移动一格(3m)。因为是一个命令方块控制多个物体,所以不能用instant功能立刻移动,必须是duration,而且时间原则上不能少于0.02s,否则都会出错。
              下落系统每等待0.3s给方块运动一次,无限循环。
              左右平移是变量控制的。建造箱控制变量“left”“right”,按下后相应+1,这样变量就从0变到了1。而X-2和X-3号命令方块分别在感应到变量变为1的时候,首先关闭命令方块1,之后再移动方块。移动完成后再将命令方块1打开,同时变量-1。
              这个-1很重要。
              左右边框在感应进入的时候,是直接将变量=3。而如果命令方块2和3里面是=0的话,一旦命令结束变量就会回到0,边框就没有了作用。而如果是-1的话,进入后变为了3,命令方块程序完成也只是减为2,限制条件依然有效。
              当边框触箱感应方块“exit”后,将变量=0。


              IP属地:河南10楼2018-02-05 23:30
              回复
                滚转系统就比较有意思了。
                滚转系统是两层变量的控制系统。首先是按键里控制变量“roll”,左转-1,右转+1。在命令方块4里面,在分别感应变量roll=-1或1时,首先关闭命令方块1,之后分别将变量“trans”-0.1或者+0.1,最后将roll变量归0。
                之所以这样套一层,就是为了隔绝按键和方块的动作相应。因为是两组方块,如果按键直接改变变量trans,那个第二组等待的时候也会跟着变,这就会变得很麻烦。这样双层变量隔离后,第二组在未启动时,命令方块都是关闭的,因而不会响应变化。
                另外,命令方块4中只有关闭命令方块1,而没有启动。这是为了,让方块在在响应转动操作后,让方块来启动命令方块1,这样就能够保证,一定会是方块转动完成之后,才会重新启动下落。


                IP属地:河南11楼2018-02-05 23:38
                回复
                  方块落地系统在视频里讲的比较多了,这里简单说几点。
                  落地固定是个相当复杂的过程,总的来讲就是:
                  命令方块1最后一次操作方块和触箱下移——伴随触箱接触到了已经升起的方块(或者最后一排隐藏的方块)——伴随触箱立刻reset——下落方块向下运动——下落方块运动到了最下面每个固定方块的动作触箱——动作触箱感应“enter”后就升起固定方块——另一组的下落方块和伴随触箱运动到起点——激活自己的叉叔——reset叉叔和下落方块。
                  其中,伴随触箱的程序是:
                  感应“enter”后,立即失活本组的1,2,3,4这4个命令方块(避免运动);
                  之后等待0.04s(等待方块和触箱真正运动到位,避免位置偏差);
                  之后reset4个伴随触箱,再将trans归0,然后激活命令方块5.
                  命令方块5激活后:
                  让本组的下落方块下移;
                  之后,再将下一组的方块和触箱移动到起点;
                  激活另一组的前4个命令方块,同时激活自己的叉叔;
                  reset自己的叉叔(准备产生新一轮的随机形状),同时reset本组的4个下落方块;
                  最后将自己关闭。
                  就这样,完成了后面所有的落地循环。
                  固定方块的上升,发生在命令方块5激活、并控制本组4个下落方块下降后,由动作触箱感应。
                  大家隔着屏幕,会觉得,是下落的方块固定在了最底排。实际上,是下落的方块控制升起了“固定不动”的方块


                  IP属地:河南12楼2018-02-05 23:52
                  回复
                    这个对于我没用了……你拿去吧


                    IP属地:广东13楼2018-02-05 23:59
                    回复
                      满排清场系统视频讲解了很多,这里就说说程序的布置吧。
                      程序的整个过程是这样的:
                      首先,某一排的本排变量“row_X”=10,然后升起本排的抑制柱,同时降下本排第三位置的抑制触箱——之后分为两种情况;
                      第一种情况,本排没有收抑制,那么,本排的上扬柱升起,随后下落,并将本排变量再加1,到11——本排所有方块和触箱和圆柱在本排变量=11后,瞬间移动到最顶端——其余各排,所有感应到上扬柱的,控制这一排的10个固定方块和10个固定触箱以及“上扬”“抑制”两个圆柱一起向后移动一格(3m)。
                      这里说明一下,为什么变量=11时,用的“瞬间”移动。移动到最顶端,用的是绝对位置控制。这个意思就是,不管起点在那里,都让指定物体运动到世界坐标为后面的数字所指定的位置。这样一来,我就不需要知道现在的位置在哪里了,只要设置绝对坐标,它就一定会到最顶排去。而因为是绝对坐标,所以不管设置多少的运动时间,它都会到达,不会说因为跳帧问题走到一半不走了,所以直接设置为instant。

                      第二种情况,如果本排被抑制了,那么就会将上扬柱失活。待所有抑制柱离开后(就是前面的完成了动作了),再将上扬柱激活,继续完成之前的动作。
                      然后是各个物体里面写的程序了。
                      首先是三个感应本排变量=10的:抑制触箱(3号触箱)、抑制柱、上扬柱。
                      抑制触箱感应本排变量=10后,下降一点;抑制柱感应到后,上升一点。
                      上扬柱感应到之后,先等待一会儿(等待抑制触箱和抑制柱到位),然后上升自己去接触上扬触箱(2号触箱),之后再下降自己,再将本排变量+1成11,再控制自己飞到最顶排,然后将本排变量归0。本排所有物体感应到本排变量=11后,分别各自运动到最顶排。
                      抑制程序写在抑制触箱里。抑制触箱感应“enter”“圆柱”后,将本排抑制变量+1。而感应“exit”圆柱后,将本排抑制变量-1。当感应到抑制变量=0时,激活上扬柱。
                      用抑制变量而不是直接“exit”后激活上扬线的原因在视频里有讲,这里不再多说。
                      上扬柱激活后,启动自己内部的“on activate”程序。这段程序和感应本排变量=10一抹一样。


                      IP属地:河南14楼2018-02-06 00:22
                      回复
                        但是,正如视频里所说,后面这个满排系统被我改掉了双线抑扬法被改成了计数位移法并正式发布。
                        至于为什么视频里面没介绍那个呢……主要的原因是双线抑扬法显得逼格特别高
                        当然,其实主要的原因是……我是先规划的剧本,然后做的录音,最后录制的视频。等我开始录制视频了发现,双线抑扬法在录制的时候非常不稳定……于是就在录制当中停了下来,把系统整个改动后再继续录制……所以各位也知道这个过程有多辛苦了吧


                        回归正题,计数位移法就非常简单了。和双线抑扬法的对比图如上。这一回没有了抑制线,只有上扬线。上扬柱进入上扬触箱后,并不是立即激发后退运动,而是给那一排的计步变量+1。上扬柱重新下来后,再和之前一样,本排变量row_X+1到11,整体飞到顶排。
                        之后,各排根据自己的计步变量的多少,等待后往下运动不同的距离。变量为1,下移1格;变量为2,下移2格;以此类推。
                        整个程序就这么多,就这么简单所以就是这么的简洁可靠。这也是我遇到跳帧bug后坚持改进的原因。
                        值得一说的是,计步变量的相应动作分别写在了4个方块里,如下图所示。



                        这也是个很重要的设置。计步变量的相应必须要放在消排动作之后,这样的话就必须要有开始的响应时间的延迟。因此,如果放在一个物体里面,并且按照一次运动一格,之后变量-1的思路,那么每一次运动都要等待这个延迟,这是完全的浪费时间。所以必须要三个程序分开。
                        三个程序分开,又不能变量=1走一格,变量=2走两格。因为变量是一个一个加起来的,那么假如最终变量=4,那么变量为1/2/3的程序都会被启动起来,这样就会出现同时运动bug。为此,程序最后设置为,不同变量值都是向后移动1格距离,但是变量=1延迟0.08s,=2时延迟0.12s,以此类推。这样,变量2的响应就会落在1之后,互不冲突。
                        最后说说程序分配。
                        本排变量=10,只有上扬柱感应,并且和之前的一样。
                        上扬触箱感应“enter”圆柱后,给本排计步变量+1。
                        从本排的第2触箱开始,到第5触箱,分别书写了计步变量不同变量值的动作,都是在延迟一定时间后,向下移动一格,之后再将计步变量归0。
                        4个相应计步变量的程序,最后都有归0,但是并不会影响动作。因为动作的相应是从变量等于各值的时候启动的,而归0一定发生在启动之后,所以即使是多次归0,也不会终止已经启动的动作。
                        这里就体现出了变量控制和命令箱控制的区别了。
                        变量控制就是,变量值来了,就启动。不管中间经历了什么过程(除非命令的载体被失活)否则这段已经启动的程序不会终止。
                        而命令箱就是,自己被激活了,就启动。而一旦命令箱被失活,那么承载的程序也会立刻终止。
                        因此活用两种控制系统,对于复杂系统的设计非常有用。


                        IP属地:河南15楼2018-02-06 00:50
                        回复
                          最后就简单放几个计数器的程序吧。
                          计数器也是一个多层变量控制系统。最底层是“score”,用于积累每排第1触箱产生的积分。之后score将积分传递给了one,之后再传给ten、hun、tho。




                          可以看到,我预留了千位的计数变量不过我觉得应该不会有人这么无聊在bsg里面玩到几千分吧
                          至于响应动作,要单独为每个变量值设置动作。而且,只有处于激活(可视)状态的方块才能相应命令,所以10个数字的命令分别写在了3个方块里,保证写有程序的方块,在响应自己的3个程序的时候,都处于激活状态。

                          视频里没有说清楚的程序,基本上都在这里补充了,也可以帮助各位吧友好好理解整段程序了。
                          如果有什么问题,欢迎提问~~~


                          IP属地:河南16楼2018-02-06 00:57
                          回复
                            可怕。。。


                            来自Android客户端17楼2018-02-06 04:18
                            回复