1.在main函数编写如下代码,Game包含所有元素的信息。
Game.spawns包含所有生成项的哈希值,每个creep可以设置7个值(对应7个技能属性):
可以通过Game.spawns['基地名称'].spawnCreep([属性1, 属性2,......], 'creep的名称')来设置
WORK
– 能够收集能量, 建造和修复结构, 升级控制器.MOVE
– 移动能力。CARRY
– 传递能量的能力.ATTACK
– 短程攻击能力。RANGED_ATTACK
– 远程攻击能力。HEAL
– 治愈他人的能力。CLAIM
- 声称领土控制权的能力。TOUGH
– “空”部分,唯一目的是防御。
这7个技能属性可以自由搭配,根据你的需要来构建独一无二的属性值。简单来说,属性值越多,creep的移动速度越慢,当受到攻击时,对应部位的属性也会受到伤害。
module.export是node.js中导出模块的方法,loop是游戏的核心循环函数之一,它在每一轮游戏更新时被调用。for循环遍历了Game.creeps中所有creep的名称(下文可见)。
2.如果每次创建一个creep,都要重新写一次行为代码,会很不方便,因此使用for循环,对创建的creep的行为进行定义,定义一个sources,让生成的creep去寻找地图里面的资源,此时如果资源在地图范围里面,并且creep还有剩余空间(getFreeCapacity())搭载资源,则creep移动到sources所在位置收集资源,否则,返回ERR_NOT_IN_RANGE的错误信息。当creep的剩余空间为0的时候,则会让creep移动到基地去存放资源,当然,和寻找资源的时候一样,能否回到基地也是要在地图范围以内,否则也是会弹出错误信息。
3.创建一个新的JavaScript文件,命名为role.harvester,这个文件代码可以编写一个模块,用来控制main函数里面的creep的行为,这样可以在mian函数中直接调用role.harvester模块中的方法,从而减少main函数里面的代码量。
require是node.js中用于加载模块的方法,roleHarvester变量包含了从role.harvester.js文件中提取的对象或者函数。
游戏遍历所有的creeps,并且roleHarvester.run(creep)方法调用了从role.harvester.js导入的run方法,然后传递当前的creep作为参数。
4.总结
在screeps: world的入门教程里面,使用了很多JavaScript的基础语法:
Game.spawns['Spawn1'].spawnCreep( [WORK, CARRY, MOVE], 'Harvester1' );
这一句代码,使用了连续方法调用,首先使用了[]来访问Game.spawns对象的属性,'Spawn1'作为字符串键用来获取Game.spawns
对象中对应的 spawn。然后便是调用了spawnCreep方法来创建新的creep,这一个方法接收bodypart数组和一个creep的名称作为参数,即方法调用时传递了参数。bodypart数组里面的含有creep的技能属性,harvester1为字符串字面量,用来命名新的creep。
var creep = Game.creeps['Harvester1'];
这一句代码是JavaScript里面变量声明,使用var关键字声明了一个变量creep,并将其初始化为Game.creeps对象中名为Harvester1的creep。此外,在ES6规则中,为了规范变量的声明,可以使用let关键字和const关键字来声明变量,两者作用域会有不同。
var sources = creep.room.find(FIND_SOURCES);
这一句代码是JavaScript的数组方法,调用find方法来寻找地图中的资源,FIND_SOURCES是预定义的常量,用来表示地图中的资源。
module.export.loop = function()和require()是node.js里面的两个重要方法,分别用来导出模块和加载模块。