猫史档案馆


【box3 代码岛3.0 基础教程 】初学者脚本入门指南(1)

用户:XHXIAIEINXHXIAIEIN查看:19 回复:34 评论:19 创建时间:2020-06-30T19:50:35


【代码岛3.0 基础教程 】 初学者脚本入门指南(1)

原本这篇文章是一篇非常简单的技术贴
不过最后在发布之前,想了一想,决定还是补充一些基础知识,让更多同学能看得懂。

开始吧

 

写给脚本初学者的介绍

有许多同学兴高采烈得申请到代码岛3.0权限的时候,在帖子中看到@吉吉喵 帖子是这么说的:

 

 

这些词听上去似乎特别香啊JS萌新秒上手”“自学很简单”对萌新特别友好”

 

 

结果,一打开页面看到这个。。。


 

还有这个。。。

 

啊,这。。
全部看不懂啊!怎么办!!太难了!!
英语考试都还没及格呢!(划掉)

 

 

于是预算着学习脚本的期望。又打开了几个有附源码的官方范例。。

 

啊!看到如此工整的代码,实在太优秀了!!忍不住呼出一声:喵
感觉奇怪的知识又增加了!(虽然代码真是一句没有看懂…hhh)

 

我是谁?我在哪?我在干什么?这是什么东西?

 

 

 

不用怕!
不懂代码只是因为你还不知道它具体会有什么效果而已~
如果你知道它对应是什么东西,很快,就能学会了~

 

因此,在接触代码之前,最好要知道自己到底要实现什么功能。先在脑海中想象出这个功能是怎样运作的,再去研究如何实现。

 

举几个社区中的提问帖作为例子:如何知道想要什么效果呢?像这样

  1. 怎么让一个区域里的所有方块消失 (毁图玩家默默笑出了声)
  1. 如何让传送门只传送指定人物
  1. 怎么让模型围着人物转?
  1. 碰到东西,就变成东西的模样
  1. 如何改变指定玩家的颜色

有明确的想法,就能有针对性的找到对应的教程、或者查看手册去了解如何实现它。但假如在此之前,还不知道自己想做什么,一上来就去凑别人写的一大段现成的代码,不知道每一句对应的是什么东西,它具体运行了哪些工作,确实是很难学的会。

 

这不仅是说脚本,假如box3是图形化工具,你是否能做出上面的功能?
应该…是没问题吧(小声 理不直气壮.jpg)

 

 

(不过上面这些同学提的问题好像还没有解决哇…没事,后面我一起给大家讲讲吧)

 

 

好了,该进入正题了。
代码岛3.0的脚本到底该怎么学?
来,我教你。

 

我们先打开box3的API文档,也就是它的说明书:https://docs.box3.codemao.cn/

 

就是这个。

 

打开之后是不是一脸懵逼!!??
(嗯,我懂你,其实我看到的时候也是一样的懵 :)


 

哎,既然现在还看不懂,就先不看它了,我们自己玩一下!

 

回到刚才的问题:
怎么让一个区域里的所有方块消失

 

其实这问题,应该是许多人刚接触代码岛3.0的同学都想问的。

在box3世界中,[方块]其实是一种特殊的东西,区别于[实体]。

你可以想象成整个代码岛世界是一个巨大的”魔方“。欸,魔方你玩过吧?就是那个大佬拿在手里拧啊拧啊,六面的颜色就还原了那个魔方)x 当然了,魔方不仅只有3x3阶的。而box3代码岛这个甚至可以更大!

 

你看,初始地图大概就已经有这么大了!!

 

创建新的工程项目的时候,默认就是一片绿绿的喵原,上面铺满了[方块]

如果你晚上睡不着觉,就不要去数天上的星星了,不如来代码岛数方块吧。编辑器右上角有只虫子的图标,这是调试模式,打开之后,可以看到鼠标对应的方块位置。走到(0,8,0)的位置开始数吧~

 

盯着一行从头数到尾,应该是能数出127个方块的!你看,我已经数出来了!(叉腰)

那么问题来了,一行有127格,共有127列,课代表,能不能算一下面积??

 

有同学会问,你是不是数错啦!上面明明写的是126!!怎么说是127啊??

因为。。。这个是从0开始数的啊!0 1 2 3 4... 

 

懂了吧?方块的坐标位置,是这么计算的。

 

 

 

除了眼前的方块,脚底下也有方块,一共有8层。玩家脚下的这一层是第8层。因为站得高啊!

最顶部的第8层是喵地,第2~7层是泥土,最底下是1层喵。(MC玩家表示这很熟悉)

 

如果你是一名肝帝,可以直接在编辑器中,切换到【地形】模式,一个个点击方块来放置。但是在游戏运行的时候,要怎么更换方块呢??比如,我不想玩家出生在一片喵原里。能不能换成其他的地形,比如雪地、山脉、蛋糕!

 

在游戏开始的时候,想把方块全部都去掉,该怎么做?

 

所以,这就需要用到【脚本】了!

脚本是这样的写,先不用思考里面写的是什么

world.onPlayerJoin(({ entity }) => 
{
  for(let x = 0; x<=126; x++){
  for(let z = 0; z<=126; z++){
  for(let y = 0; y<=8; y++){
    voxels.setVoxel(x, y, z, 0);
  }}}
});

 

把这段代码粘贴到【脚本】中,按右上角的黄色运行按钮,看看效果。

 

发现没有,方块全部没了,但是脚底下没方块,结果角色一直往下跳,无限重生。

 

所以,接下来我们再来创建自己的方块就可以了。比如,我想把下面铺满【蛋糕】!!蛋糕是哪个方块啊?哦方块的名称叫:”pink_cake”,在这里能看到。

 

放3层的蛋糕,然后再做大一些,长,宽各有80格!怎么样(应该可以吃上好久了)

 

这次的脚本是这么写的:
我加上了简单的注释,每一部分大致做了什么东西。而具体的后面再细讲

// 玩家进入游戏的时候
world.onPlayerJoin(({ entity }) => 
{
  // 去掉原本的方块
  for(let x = 0; x<=126; x++){
  for(let z = 0; z<=126; z++){
  for(let y = 0; y<=8; y++){
    voxels.setVoxel(x, y, z, 0);
  }}}

  // 自己创建一个蛋糕地形。
  for(let x = 0; x<80; x++){
  for(let z = 0; z<80; z++){
  for(let y = 0; y<3; y++){
    voxels.setVoxel(x, y, z, 'pink_cake');
  }}}
    
});

 

还是一样,复制粘贴进去

 

 

看吧,蛋糕岛就建造好了~

 

 

看了看,这一篇教程好像写的有点多了。其他内容可以下次再写一篇。如果你喜欢这篇教程,可以留个言说一下~最重要的是,和我说说,能不能看的懂!

 

最后,留个彩蛋。下一篇教程(如果有的话),就写这个:

//-----------------------------------------------
// 玩家进入游戏的时候

world.onPlayerJoin(({ entity }) => 
{
   // 创建地形
   createPlatfrom()

   // 初始化玩家的属性
   player_initialize(entity.player)
   world.onTick((tick) => { player_Particle(entity)});
});


function createPlatfrom()
{
  // 去掉原本的方块
  for(let x = 0; x<=126; x++){
  for(let z = 0; z<=126; z++){
  for(let y = 0; y<=8; y++){
    voxels.setVoxel(x, y, z, 0);
  }}}

  // 自己创建一个蛋糕地形。
  for(let x = 0; x<80; x++){
  for(let z = 0; z<80; z++){
  for(let y = 0; y<3; y++){
    voxels.setVoxel(x, y, z, 'pink_cake');
  }}}
}


//-----------------------------------------------
// 初始化玩家的属性

function player_initialize(entity)
{
    // 修改玩家位置,并将出生点重新设在这里。
    entity.position = new Box3Vector3(40, 2.5, 40)
    entity.spawnPoint.copy(entity.position)

    // 修改地图边界,玩家位置超出这个范围,就会重生
    entity.movementBounds = new Box3Bounds3(
      new Box3Vector3(-20, -20, -20),   // 下限
      new Box3Vector3(100, 20, 100)       // 上限
    );


    // 修改玩家属性,比如移动速度等。
    entity.walkSpeed = 0.38          // 最大步行速度。默认0.22
    entity.walkAcceleration = 0.42   // 步行加速度。默认0.19

    entity.runSpeed = 0.99           // 最大奔跑速度。默认0.4
    entity.runAcceleration = 1.45    // 奔跑加速度。默认0.35

    entity.jumpSpeedFactor = 0.425           // 跳跃速度。默认0.85
    entity.jumpAccelerationFactor = -0.08    // 跳跃加速率。默认0.55
    entity.jumpPower = 0.98                  // 跳跃力度。默认0.96

    entity.doubleJumpPower = 0               // 二段跳力度。默认0.9
    entity.enableDoubleJump = false          // 是否启用二段跳。默认 true
}


//-----------------------------------------------
// 玩家身上的粒子特效

function player_Particle(entity)
{
  // 判断玩家的行走状态
  switch (entity.player.walkState) {
    // 正在奔跑
    case Box喵layerWalkState.RUN:
      Object.assign(entity, {
        particleRate: 1000,
        particleLifetime: 2,
        particleSize: [8, 6, 4, 2, 0.5],
        particleColor: [
          new Box3RGBColor(1,1,0),
          new Box3RGBColor(1,1,0),
          new Box3RGBColor(1,0,0),
          new Box3RGBColor(1,0,0),
          new Box3RGBColor(1,1,1),
        ],
        });
      break;
    // 正在行走
    case Box喵layerWalkState.WALK:
      Object.assign(entity, {
        particleRate: 450,
        particleLifetime: 1.75,
        particleSize: [2, 0.65, 0.23],
        particleColor: [
          new Box3RGBColor(0,0,1),
          new Box3RGBColor(0,1,1),
          new Box3RGBColor(1,1,1),
        ],
        });
      break
    // 在其他行走状态不显示粒子
    default:
     Object.assign(entity, {particleRate: 0,particleLifetime: 0 });
  }
}

 

效果是这样的

 

奔跑时候的身上的火焰拖尾效果

 

 

摄像头怎么固定?下次跟你讲!

 

 

相关阅读

社区里也有许多不错的教程帖,值得大家去学习的:

 


回复

上一页1 页 / 共 2下一页
FHR丨萌新滑稽FHR丨萌新滑稽

谢谢你,把我送进了医院(看的头昏眼花)(滑稽)

点赞0


评论


ZNS_哪吒ZNS_哪吒

很好

点赞0


评论


啸月666啸月666

在吗,考虑加工作室吗

点赞0


评论


QBZ_QBZ_

顶顶顶

点赞0


评论


fewafsefjfewafsefj

点赞0


评论


文件传输助脚文件传输助脚

本来就很简单,对大佬特别友好

点赞0


评论


F_S_2F_S_2

谢谢

点赞0


评论


XHXIAIEINXHXIAIEIN

加上固定摄像头的完整脚本~
可以直接在新工程里面测试

c喵ole.clear();

//-----------------------------------------------
// 玩家进入游戏的时候

world.onPlayerJoin(({ entity }) => 
{
   // 创建地形
   create_Platform()

   // 初始化玩家的属性
   player_initialize(entity.player)
   world.onTick((tick) => { player_Particle(entity)});
});


function create_Platform()
{
  // 去掉原本的方块
  for(let x = 0; x<=126; x++){
  for(let z = 0; z<=126; z++){
  for(let y = 0; y<=8; y++){
    voxels.setVoxel(x, y, z, 0);
  }}}

  // 自己创建一个蛋糕地形。
  for(let x = 0; x<48; x++){
  for(let z = 0; z<48; z++){
  for(let y = 0; y<3; y++){
    voxels.setVoxel(x, y, z, 'pink_cake');
  }}}
}


//-----------------------------------------------
// 初始化玩家的属性

function player_initialize(entity)
{
    // 修改玩家位置,并将出生点重新设在这里。
    entity.position = new Box3Vector3(24, 2.5, 24)
    entity.spawnPoint.copy(entity.position)

    // 调整玩家摄像头
    entity.cameraMode = 'FIXED';                         // 摄像机模式
    entity.cameraPosition = new Box3Vector3(24, 16, 80); // 摄像机位置  
    entity.cameraTarget = new Box3Vector3(24, 6, 12);    // 摄像机看向什么位置
    entity.cameraUp = new Box3Vector3(0, 16, 10);        // 摄像机抬头


    // 修改玩家属性,比如移动速度等。
    entity.walkSpeed = 0.38          // 最大步行速度。默认0.22
    entity.walkAcceleration = 0.42   // 步行加速度。默认0.19

    entity.runSpeed = 0.99           // 最大奔跑速度。默认0.4
    entity.runAcceleration = 1.45    // 奔跑加速度。默认0.35

    entity.jumpSpeedFactor = 0.425           // 跳跃速度。默认0.85
    entity.jumpAccelerationFactor = -0.08    // 跳跃加速率。默认0.55
    entity.jumpPower = 0.98                  // 跳跃力度。默认0.96

    entity.doubleJumpPower = 0               // 二段跳力度。默认0.9
    entity.enableDoubleJump = false          // 是否启用二段跳。默认 true


    // 修改地图边界,玩家位置超出这个范围,就会重生
    entity.movementBounds = new Box3Bounds3(
      new Box3Vector3(-30, -20, -30),     // 下限
      new Box3Vector3(64, 20, 64)         // 上限
    );

}


//-----------------------------------------------
// 玩家身上的粒子特效

function player_Particle(entity)
{
  // 判断玩家的行走状态
  switch (entity.player.walkState) {
    // 正在奔跑
    case Box喵layerWalkState.RUN:
      Object.assign(entity, {
        particleRate: 1000,
        particleLifetime: 2,
        particleSize: [8, 6, 4, 2, 0.5],
        particleColor: [
          new Box3RGBColor(1,1,0),
          new Box3RGBColor(1,1,0),
          new Box3RGBColor(1,0,0),
          new Box3RGBColor(1,0,0),
          new Box3RGBColor(1,1,1),
        ],
        });
      break;
    // 正在行走
    case Box喵layerWalkState.WALK:
      Object.assign(entity, {
        particleRate: 450,
        particleLifetime: 1.75,
        particleSize: [2, 0.65, 0.23],
        particleColor: [
          new Box3RGBColor(0,0,1),
          new Box3RGBColor(0,1,1),
          new Box3RGBColor(1,1,1),
        ],
        });
      break
    // 在其他行走状态不显示粒子
    default:
     Object.assign(entity, {particleRate: 0});
  }
}

点赞2


评论


凌_墨水凌_墨水

嗯不错不错,加油R

点赞0


评论


面具狐狸云绾兮面具狐狸云绾兮

点赞0


评论


Lonely_wandererLonely_wanderer

dd

!值的顶!

点赞0


评论


XiangQinxi(邦邦BON)XiangQinxi(邦邦BON)

(我每次名列前3名)

点赞0


评论


神兽喵神兽喵

大佬!

点赞0


评论


SCS_user_eee2detYg0SCS_user_eee2detYg0

e有一个是我新手的时候发的帖,不过我早就会了。其他那些我也会了L(・o・)」

点赞0


评论


SCS_user_eee2detYg0SCS_user_eee2detYg0

不错(≧∇≦*)

点赞0


评论


影_混乱影_混乱

center_image

点赞0


评论


影_混乱影_混乱

center_image

点赞1


评论


两个小八路两个小八路

emotion_编程猫_点赞

点赞0


评论


阳光的流熔怪Uyt5阳光的流熔怪Uyt5

绿绿的喵原哦

点赞0


评论


阳光的流熔怪Uyt5阳光的流熔怪Uyt5

顺便打个广告我之前写的粒子特效https://shequ.codemao.cn/community/306578

点赞0


评论


文件传输助脚文件传输助脚

顶顶

点赞0


评论


BCM墨水瓶BCM墨水瓶

那时候的我不会JavaScript,所以.......

点赞0


评论


三尺五寸上仙三尺五寸上仙

emotion_编程猫_加油

点赞0


评论


月战老兵月战老兵

萌新请注意:喵是n c(去掉空格)

点赞0


评论


黑客熊猫黑客熊猫

我是萌新啥也看不懂,不过你叫的很好,也很幽默,我喜欢你这样的老师

点赞1


评论


马虎的铁奥Kcpb马虎的铁奥Kcpb

                                         大神帮忙看一下为什么这个是错的

 


center_image

点赞1


评论


马虎的铁奥Kcpb马虎的铁奥Kcpb

                  大神帮忙看一下,这个怎么回事

 

 

 

center_image

点赞0


评论


马虎的铁奥Kcpb马虎的铁奥Kcpb

center_image

点赞0


评论


马虎的铁奥Kcpb马虎的铁奥Kcpb

center_image

点赞0


评论


马虎的铁奥Kcpb马虎的铁奥Kcpb

大神帮忙看一下center_image

点赞0


评论