twine吧 关注:407贴子:167
  • 6回复贴,共1

SugarCube v2 的变量类型和应用

只看楼主收藏回复

twine 变量,有几种
1,$变量,这是全局的变量,可以是阵列,比如说
<<set $shuiguo = ["苹果","香蕉","橘子"]>>
这个叫做$shuiguo的变量,内容就是这三个词。可以往里面添加,也可以执行各种操作,但是很难从里面单独抽取一个元素。似乎最多随机抽取一个,比如说 $shuiguo.random(),就是随机从苹果香蕉橘子里面挑一个。
2 _变量,比如说_i _h,临时的变量,只对这个页面有用,经常是拿来作为<<for>>循环的计数用的。
3,State.variables ["变量名" + 维度1 + 维度2 。。。。 ]
这种变量比较复杂,有很多乱七八糟的操作。但是最重要的是,他可以生成多维度的变量阵列。
比如说,你要设置一个类似RPG的游戏,一个队伍4个角色,每个角色有 HP MP 攻击力 防御力 速度,这样的数值。
如果按照第一个$变量那样设置,就要设置成
$PC1HP
$PC1HP
$PC1HP
$PC1HP
State.variables ["队伍成员参数" + $a + $b] 这一个参数,就用来设置所有队伍


IP属地:上海1楼2022-05-11 18:43回复
    3,State.variables ["变量名" + 维度1 + 维度2 。。。。 ]
    这种变量比较复杂,有很多乱七八糟的操作。但是最重要的是,他可以生成多维度的变量阵列。
    比如说,你要设置一个类似RPG的游戏,一个队伍4个角色,每个角色有 HP MP 攻击力 防御力 速度,这样的数值。
    如果按照第一个$变量那样设置,就要设置成
    $PC1HP $PC2HP $PC3HP $PC4HP
    $PC1MP $PC2MP $PC3MP $PC4MP 。。。。。。。。。等等 一堆函数。
    如果用 State.variables ["队伍成员参数" + $a + $b] ,就能用来设置一堆
    比如说
    <<set State.variables ["队伍成员参数" + 1 + 1] = HP >>
    <<set State.variables ["队伍成员参数" + 1 + 2] = MP >>
    <<set State.variables ["队伍成员参数" + 1 + 3] = ACT >>
    <<set State.variables ["队伍成员参数" + 1 + 4] = DEF >>
    第一个角色的参数就设置好了。
    如果变成第二个角色,就把1变成2,就行了。
    <<set State.variables ["队伍成员参数" + 2 + 1] = HP >>
    <<set State.variables ["队伍成员参数" + 2 + 2] = MP >>
    <<set State.variables ["队伍成员参数" + 2 + 3] = ACT >>
    <<set State.variables ["队伍成员参数" + 2 + 4] = DEF >>
    如果你要初始化一批,比如说10个队员,就可以来一个for循环。
    <<for _i to 1; _i lte 10; _i++>>
    <<set State.variables ["队伍成员参数" + _i + 1] = HP >>
    <<set State.variables ["队伍成员参数" + _i + 2] = MP >>
    <<set State.variables ["队伍成员参数" + _i + 3] = ACT >>
    <<set State.variables ["队伍成员参数" + _i + 4] = DEF >>
    <</for>>
    而如果你要调用任何一个数值,比如在<<if>>命令里面,调用队员3的MP,看看是不是0,就可以
    <<if State.variables ["队伍成员参数" + 3 + 2] == 0>>
    这样。
    从之前的<<for >>循环也可以看出,后面的阵列维度参数,是可以用变量的。所以应用办法也很多。
    另外,<<print>>命令也是有效的,可以<<print State.variables ["队伍成员参数" + _i + 1] >>这样子。


    IP属地:上海3楼2022-05-11 18:57
    回复
      2026-08-16 13:19:24
      广告
      不感兴趣
      开通SVIP免广告
      这个东西,还有个有趣的应用,可以文字符号阵列,画简易的地图。
      比如说 State.variables ["map" + _i + _h],你可以看作一个二维阵列,_i是X轴 _h是Y轴
      你用for循环两次,可以创造出一个X Y二位参数的阵列,给每一个点一个你需要的符号作为图形。然后把这个阵列画出来,你就得到了一个地图。
      <<for _i to 1; _i lte 5; _i++>>
      <<for _h to 1; _hlte 5; _i++>>
      <<set State.variables ["map" + _i + _h] = ".">>
      <</for>>
      <</for>>
      这样就把地图上所有的点,都赋予【.】这个图形。
      然后你再<<for>>和<<print>>一遍,把这些符合号都画出来,你就得到了一个地图。注意要用<<nobr>>去掉命令占据的空间,
      在每一行之后换行。
      <<nobr>>
      <<for _i to 1; _i lte 5; _i++>>
      <<for _h to 1; _hlte 5; _i++>>
      <<print State.variables ["map" + _i + _h]>>


      <</for>>
      <</for>>
      <</nobr>>
      你就会得到一个阵列如下。
      .....
      .....
      .....
      .....
      .....
      这个阵列你看上去不像地图吧?那是因为行距和文字间距没有调整,而且点数太少,我只是拿来举个例子。
      另外要注意的是,这个点阵的原点是左上角。如果你要和现实一样原点在左下角,你需要把Y轴数值变成 (最大值+1-$Y)。
      这个地图上如果你要显示一个角色的位置,$x $y的数值已知。那么你就要在上面<<for>>描绘好以后,再追加一个设定。
      比如说
      <<set $x =1>>
      <<set $y =1>>
      <<set State.variables ["map" + $x + $y] = "o">>
      然后再<<for ....>><<print>>所有的点,你就会得到如下显示
      o....
      .....
      .....
      .....
      .....
      然后你的角色移动了,比如说向右移动了两格子,
      <<set $x += 2>>
      <<set State.variables ["map" + $x + $y] = "o">>
      你再print,你就会得到
      o.o..
      .....
      .....
      .....
      .....
      有两个o,之前主角的位置那个没有复原。这是因为你没有先重新把所有的点再次设定为【.】。
      所以每次都必不可少的先把地图的要素复原。然后再设定被改变的地图要素,你就会得到
      ..o..
      .....
      .....
      .....
      .....
      如此,你就可以绘制得到简单的地图。这在随机地图的游戏特别重要,用图片做地图很困难。
      而具体的行距之类的,需要用<span>之类的命令设置字体大小,颜色,等等。


      IP属地:上海4楼2022-05-11 19:24
      回复
        下面就是我的一个随机地图的游戏,用程序描绘的地图。
        当然了,用HTML语言做这种计算,速度不会很流畅的,点进这个地图,需要等一两秒钟。


        IP属地:上海5楼2022-05-11 19:28
        回复
          State.variables就是存所有$变量的对象,这个[x+y+z]的结果只是访问$xyz而已。
          楼主所说的RPG场景更适合用object变量
          比如:
          <<set $pc1 = {
          name: "玩家",
          hp: 100,
          mp: 50,
          atk: 20,
          def: 5
          }>>
          到时候直接用$pc1.name或者$pc1["name"]就行了


          IP属地:上海来自Android客户端6楼2022-06-24 07:33
          收起回复