mugen吧 关注:70,083贴子:1,456,640
  • 33回复贴,共1

用一个变量控制16个开关的方法

只看楼主收藏回复

这文章是写给要节省变量,且略懂二进制与位元运算的玩家使用.



先谈二进制, 一般我们用的是十进制, 十进制可转成2进制,如下转换, 转换规则请自行查询关键字"二进制"
0 => 0
1 => 1
2 => 10
3 => 11
4 => 100
5 => 101
6 => 110
7 => 111


2进制表示的数是0和1的组合, 因此可以当开关来使用. 将下列二进制数字以白话文描述开关


0 => 全关
1 => 第一个开启
10 => 第一个关闭,第二个开启
11 => 第一个第二个开启
100 => 第三个开启,其他关闭
101 => 第一和第三个开启,第二个关闭
110 => 第二和第三个开启,第一个关闭
111 => 第一和第二个和第三个开启


把二进制数转回十进制也可以达到同样控制效果.


实作的通用写法:
假设您要控制第N个开关.一个变量var(40)是开关
令一个数k = 2的N次幂(N = 0,1,2....,16)
检测第N个开关有无开启的方式是
trigger1 = var(40) & k
开启第N个开关的方式是
var(40) = var(40) | k
关闭第N个开关的方式是
trigger1 = var(40) & k
var(40) = var(40) ^ k


&, |, ^ 是位元运算子, 请劳驾自行搜索
N我目前测到16是可以用的,理论上应该可以到32



实作测试一段用按鍵开关着色与半透明的代码如下,用第二和第十六个开关调整颜色和透明度


[State -1]
type = VarSet
trigger1 = roundstate = 1
v = 40
value = 0


[State -1]
type = VarSet
trigger1 = command = "x"
v = 40
value = var(40) | 2


[State -1]
type = VarSet
trigger1 = command = "y"
Trigger1 = var(40) & 2
v = 40
value = var(40) ^ 2


[State -1]
type = trans
Trigger1 = var(40) & 2
trans = addalpha
alpha = 50,50


[State -1]
type = VarSet
trigger1 = command = "a"
v = 40
value = var(40) | 65536


[State -1]
type = VarSet
trigger1 = command = "b"
Trigger1 = var(40) & 65536
v = 40
value = var(40) ^ 65536


[State -1]
type = palFX
Trigger1 = var(40) & 65536
time = 1
add = 60,0,0


回复
1楼2018-06-15 21:27
    这对于我这数学几何菜鸟来说,完全就是看天书一样@muigoloroh


    回复
    来自Android客户端2楼2018-06-15 22:56
      65536太长不好书写和记忆
      用科学计数法来表达就是2**16
      一个整型变量最大可赋予31个开关
      2**0
      2**1

      2**30


      2**31已经超过mugen可以接受的整数上限了
      MUGEN整数最大值是2**31-1即2147483647


      回复(5)
      3楼2018-06-15 22:57
        是个好办法呢,不错不错(实际上我看不懂


        回复
        来自iPhone客户端4楼2018-06-15 23:35
          学习了


          回复
          来自Android客户端5楼2018-06-15 23:37
            天书


            回复
            来自Android客户端6楼2018-06-15 23:40
              这么用节省是节省,但都这么用怕不是头都要爆炸。一般helper都够用,不够也能用explod凑。不过一帧内的记录explod和helper就会有点问题了...


              回复(6)
              来自Android客户端8楼2018-06-16 00:06
                这个可以有


                回复(3)
                来自手机贴吧9楼2018-06-21 11:19
                  整形变量用的是int
                  4字节,范围从-2^31~2^31-1
                  从1(2^0)到2^30次方一共可以并31个开关。
                  我做过一个简单探测对方招数发生帧数和性能的记忆,单个变量整合成stateno+两位发生帧数+两位性能探测,然后两位就可以分1 2 4 8 16 32六个01位,还是挺好用的。


                  收起回复
                  10楼2018-06-30 17:45
                    缺点只是不适合表示多个选择,就算自己看得懂,让一个不懂的人改一个设定肯定还是一个数字简单


                    回复
                    来自Android客户端11楼2018-06-30 19:59
                      这确实省了不少变量,但别人不一定看得懂吧


                      回复
                      来自Android客户端12楼2018-06-30 21:01
                        这个我2年前就讲过 也有人在更早前讲过 不过没什么意义 因为99%的人都用不到 或者说不会用


                        回复
                        来自Android客户端13楼2018-07-01 02:53
                          30个


                          回复
                          14楼2018-07-23 22:23
                            我觉得我的脑子不够用


                            回复
                            来自Android客户端15楼2018-07-29 22:52
                              不好意思啊,我挖个坟,花了很长时间找到了这个贴,之前在拆ev蛇的过程中发现螺丝前辈写的一败加强的三位数变量,经过拆解后发现是一个取余的算法,于是自己也拿来试着用这个方法,虽然成功了但是我想问这两个方法有什么不同之处么


                              回复
                              来自Android客户端16楼2019-03-22 20:19
                                鱼姐,想你了。


                                回复
                                17楼2019-04-28 00:41
                                  好东西,今天才刚看到,挖坟以示感谢(


                                  回复
                                  18楼2019-06-06 11:00
                                    看得懂的都是大佬,看不懂的也是大佬。而我,不管看不看得懂,都是不是大佬


                                    收起回复
                                    来自Android客户端19楼2019-06-06 13:00