mindustry吧 关注:12,873贴子:77,316

回复:逻辑处理器前瞻性教程

取消只看楼主收藏回复

【sensor】
这是一个传感器语句,可以探测目标单位的信息。

两个参数+一个返回值。
@copper是要探测的【属性】,block1是被探测的【单位】,通常是关联的方块。
result是返回值,探测到的【属性值】会赋给变量result
例:监测大型核心(core:nucleus)里有多少铜,并显示在信息板上
(输入框太小,变量名显示不全,这都怪anuke



23楼2020-08-13 23:53
收起回复
    续:sensor可以探测16种物品的储量,4种液体的储量,以及其他信息
    目前其他信息列表如下。
    totalItems物品总数
    totalLiquids液体总数(
    totalPower电力总量
    itemCapacity物品容量
    liquidCapaticy液体容量
    powerCapaticy电力容量
    powerNetStored电网电量
    powerNetStored电网电能容量
    powerNetIn电网输入
    powerNetOut电网输出
    health生命值
    heat热量(钍堆)
    efficiency效率
    rotation转向角度
    x坐标
    y坐标
    shootX准星x坐标
    shootY准星y坐标
    shooting是否正在开火
    enabled是否启用


    24楼2020-08-14 00:17
    收起回复
      一觉起来,9274,而且多了新的语句。我感觉这帖开早了


      25楼2020-08-14 11:09
      回复
        更新至be 9274
        【control】
        控制目标属性,相当好用的语句。至此半只脚迈入自动化控制

        它目前可以控制两种属性,enabled 和 shoot,点击enabled输入框会弹出菜单切换。分别来看

        -enabled
        是否启用。两个参数。
        block1是要控制的【单位】,通常是关联的方块。to后的0是要设定的【属性值】,目前只有1和0(即布尔值真&假)

        -shoot
        射击目标。四个参数。
        block1是要控制的【单位】,xy是射击点的实体网格坐标,shoot是否开火(1是0否)。
        提醒:
        实体网格坐标:建筑网格坐标=8:1
        不是相对坐标,而是地图坐标


        26楼2020-08-14 11:53
        收起回复
          做自动化,得有条件语句吧?
          【jump】

          若///,则跳转到第///条语句,否则继续运行。
          有三个参数+一个隐藏的参数。
          三个参数不讲了,看下图应该能理解意思。中间那个比较运算符通过点击切换。

          隐藏的参数是跳转到【第几条】语句。在编辑界面,拖动jump右侧的白色箭头牵引到目标语句即可。
          效果如图:

          【end】

          立即结束,指的是立即结束本次处理器循环。配合jump就可以在过程中有条件地执行某些语句
          应用:

          这是一个规划中的塑钢中转线。假设要求优先保供弹,预留200塑钢库存,富余时才启动通向核心的传送带。
          语句如下

          探测塑钢量,if判定,<200则跳转到第二个control关闭传送带,否则执行第一个control打开传送带(然后执行end开始新循环)
          顺便这是一种实现if else的方法,其他方法当然有,自行摸索吧



          27楼2020-08-14 14:45
          收起回复
            写一半了,申个精


            28楼2020-08-14 14:50
            回复
              最近群里一堆人在问radar怎么用,吧里也
              be 9292
              【radar】
              利用某单位的视野来搜索符合要求的生物【单位】。
              这是你接触的第一个动态获取单位的指令。在这之前,sensor和control都需要对单位进行操作,而你只有关联的方块可以用,但现在嘛

              5个参数+一个返回值。
              turret1是要借用视野的【方块】。看简介里有【范围】(不是能量范围或者别的什么特殊范围)的,范围显示效果像炮塔那样虚线的,应该就能用。
              target后面三项是筛选器,可以同时筛选3个属性。可选项分别为:
              any任意
              enemy敌人
              ally友军
              player玩家
              flying空中
              ground地面
              只有满足3个属性的会进入名单。最后名单要经过order排序获取最优目标。
              order是顺序,0倒序1正序。目前radar只按距离远近排序。
              result是返回值,返回一个储存了单位的变量。你可以直接用这个变量名去尝试做sensor、control之类的事情,如果不可用的话只会没效果而已。
              例:下图语句借用浪涌炮ripple1的视野探测附近的敌方·空中·玩家,倒序(距离最远者),输出到enemy1.并用sensor读取enemy1的xy坐标

              radar只能搜索生物和玩家,目前还不能获取方块有英语好的神族可以和anuke探讨一下

              目前radar只有按距离远近排序,但参数只是隐藏了而已,如图distance。希望新版本没事


              36楼2020-08-18 12:50
              收起回复
                be 9292
                【变量操作】
                部分内容需要数学和计算机相关知识

                【set】
                直接给名为result的变量赋值。如果变量不存在,就相当于创建。
                数字支持十进制,字符串请使用英文双引号,变量复制请填变量名
                【binary op】
                二元运算。将a和b经过某运算的值赋给result

                可用的算子有
                +,-,*,/,<,>,≤,≥小学生过关项
                ^乘方,= a ^ b
                max,min求最值
                dst距离,= √(a ^ 2 + b ^ 2)
                atan2反正切,= arctan(b / a)。接收的是平面直角坐标系的xy坐标,返回相应的角度°。
                %求余,= a (mod b)
                ==相同,返回逻辑真1假0
                not相异,返回逻辑真假
                <<左移一位,把a写成二进制后,左移一位并在末尾补0,再转为十进制输出
                >>右移一位,右移一位(删去末位),其余同上
                or或,and与,xor异或,自行了解"布尔逻辑运算"
                【unary op】
                一元运算,将b经过某运算的值赋给result

                可用的算子有
                -相反数
                not非,自行了解"布尔逻辑运算"
                abs绝对值
                log对数,对自然常数e
                log10对数,对10
                sin,cos,tan高中生过关项
                floor向下取整
                ceil向上取整
                sqrt开二次方,相当于b ^ (1/2)
                rand生成随机数,取值范围可能是[0,b)。了解java的神族可以看看能不能取到b


                37楼2020-08-18 14:03
                收起回复
                  be 9303
                  数据存取存储器专场,信息板爬

                  【write】
                  将变量的值写入存储器。存储器是那个长得像信息板的方块
                  三个参数。
                  result,要写入的变量的名称。cell1,关联的存储器方块名称。at,是存储器内的地址名。
                  提醒:写入变量、地址名这两处,只支持数字和变量(根据变量的值)。如果输入字符串则转换为1。从硬编码的层面,存储器只有32个double的空间,也就是只能存32个值,因此地址名取值为0~31。

                  【read】
                  从存储器读取。三个参数。
                  result,读取后赋给的变量名。cell1,同前。at,同前。
                  若读取失败,不会改变result的值。
                  例:一条值为114514的数据从左处理器传递给右处理器并打印到信息板


                  39楼2020-08-18 14:43
                  收起回复

                    be 9336
                    【getlink】
                    根据连接顺序动态获取关联的【方块】。一个参数,一个返回值。
                    link井,要获取的关联位次,从0开始计数。
                    result,储存了【单位】的变量
                    众所周知,处理器在关联新的方块的时候,会将该方块记录到类似下图表格的内部数组中(图示仅供参考)

                    getlink就是根据序号来获取对应的方块,提高代码的灵活性。
                    常见的应用情境比如你设计了一个草控电弧炮的代码(连接一台浪涌作为视野,再搜索敌人并控制电弧攻击)
                    现在希望推广应用到其他炮塔组合,则可以使用getlink设计。以后只需复制粘贴代码,再按代码规定的顺序连接即可
                    例:通用型炮塔雷普玩家
                    使用getlink获取第一个方块(#0)作为雷达,radar获取玩家,计算signal确定是否开火,最后getlink和control组合控制第二三四五(#1234)个关联方块
                    -代码
                    getlink radar1 0
                    radar player any any distance radar1 0 target
                    sensor x target @x
                    sensor y target @y
                    bop mul x y signal
                    getlink t1 1
                    getlink t2 2
                    getlink t3 3
                    getlink t4 4
                    control shoot t1 x y signal 0
                    control shoot t2 x y signal 0
                    control shoot t3 x y signal 0
                    control shoot t4 x y signal 0
                    -效果(适配范例:火焰雷达+电弧,熔毁雷达+蓝瑟)



                    41楼2020-08-19 14:42
                    收起回复
                      be 9336
                      绘图语句万众瞩目的绘图!

                      【draw】
                      相当复杂的绘图语句,显示屏专属。谨记显示屏为80x80像素
                      点击第一个参数可以选择要进行的操作:

                      可选操作为:
                      clear,清空并设置背景色,使用RGB颜色空间,参数为红R绿G蓝B
                      color,设置画笔颜色,使用RGBA颜色空间,参数为红R绿G蓝B透明度A
                      stroke,设置画笔粗细(适用line,linerect,linepoly),参数为画笔粗细stroke(单位像素)
                      line,线段,参数为起点xy和终点xy坐标
                      rect,矩形(填充),参数为起点xy坐标+宽width↔高height↕
                      linerect,矩形(边框),参数同上
                      poly,多边形(填充),参数为中心xy坐标+边数side+半径radius+逆时针旋转rotation
                      linepoly,多边形(边框),参数同上
                      triangle,三角形(填充),参数为三个点的xy坐标

                      将就一下
                      【drawflush】
                      把处理器缓冲的图像绘制到显示屏上。一个参数。
                      display1为指定的显示屏。
                      这两个和print、printflush差不多,都是先缓冲,再用flush输出到方块。
                      感兴趣的可以百毒“双缓冲绘图”,是这个技巧。
                      提醒:默认画笔是白色,如果要用画笔画其他颜色的图形,就必须在作之前使用color。
                      提醒:处理器执行draw语句,是发送指令给显示器并让显示器执行。当多处理器同时操作一个显示器时,需要留心color和stroke设定
                      这个玩意让我想起了以前玩过的gdi+
                      语句讲完了,稍后弄几个例子吧


                      42楼2020-08-19 20:21
                      收起回复
                        @红巾起 申精


                        43楼2020-08-19 20:26
                        收起回复
                          例1(be 9336)
                          34楼提到的,anuke官方示范之仓库内容物控制传送带

                          从效果图看,anuke的设计要求大概是容器铜储量>=20时,启动传送带,否则要保持传送带关闭
                          由于前文没有讲绘图程序思路,所以后面遇到绘图我会着重一点


                          先关联方块。
                          【控制传送带】,写:

                          其中,二元运算输出的是“copper≥20”这一命题的真伪性,真1假0。这里能直接算信号值enable1,就不要用jump,技巧之一,划重点
                          -效果-

                          下一步是【绘图】,代码如下,加了注释
                          sensor copper container1 @Copper //探测铜储量,不多谈
                          draw color 86 86 102 255 0 0 //背景色
                          draw rect t 0 2 80 0 0 //指针t可以控制x坐标,在t所指示纵列先填满背景色86,86,102
                          draw color 225 200 20 255 0 0 //土黄色动点,在指针t所指示的纵列标出铜储量对应的点
                          draw rect t copper 2 2 0 0
                          draw color 255 20 20 255 0 0 //红色刻度线,恰在20铜的高度,位置和t无关,每t都画
                          draw rect 0 20 80 2 0 0
                          drawflush display1
                          bop add t 1 t //t是计时器,也是绘图位置的指针(模拟扫描那种感觉)。当t≥80,就跳回0
                          jump 11 greaterThanEq t 80
                          end
                          set t 0
                          -效果-

                          Done


                          44楼2020-08-19 21:45
                          收起回复
                            新内容有在探索
                            已经弄到新建存档了


                            64楼2020-10-11 17:16
                            收起回复
                              be 10530
                              a-neko添加了4个新指令专门用来调教单位,分别是
                              unit bind
                              unit locate
                              unit control
                              unit radar


                              66楼2020-10-17 01:52
                              回复