Screeps基础教程 1 游戏界面和基础脚本
Screeps基础教程 1 游戏界面和基础脚本
房间与控制台
游戏界面
上面的正方形称之为room(房间),在真实的游戏中,房间是由出口互相连接的,在模拟模式中,这个房间只对我们自己可用。
room(房间)
在房间中间的物体叫做spawn(虫巢),这是我们的殖民地中心,而我们通过底部的面板来编写代码进行游玩。点击console(控制台)标签,在这里我们可以输入代码,但是这个代码只可以运行一次。我们先随便输入一些东西。
控制台
正如你所看到的那样,我们的命令会在控制台响应(代码的错误也会在这里显示)。所有输出都复制到浏览器控制台(Ctrl+Shift+J)中,我们可以在其中展开对象以进行调试。按Alt+Enter可以打开和关闭底部面板。
生产第一个爬虫
爬虫是由虫巢生产的,每一个爬虫都会有身体部件和名字。所以我们先通过名字先选择要生产爬虫的虫巢,然后在通过“spawnCreep”方法来生产一个爬虫。
在控制台输入代码:Game.spawns[Spawn1].spawnCreep( [WORK, CARRY, MOVE], Harvester1 );
虫巢正在生产爬虫
让我们点击视图按钮,然后点击刚刚生产的爬虫,我们会在右侧看到爬虫的一些属性。
视图资源采集与爬虫部件
这个黄颜色的小方块叫做source(资源点),里面存有energy(能量),这是一种非常宝贵的资源。拥有work(工作)身体部件的爬虫可以进行采集,拥有carry(搬运)身体部件的爬虫可以进行搬运。work部件越多采集的越快,carry部件越多搬运的能量资源也就越多,每个carry部件可以负载50单位的source,move部件则负责移动,move部件越多的爬虫走的越快(carry部件数量相同的条件下)。
source
是时候让我们的爬虫进行工作了。点击Script(脚本)标签,在这里我们可以编写永久运行的脚本,在每个tick(游戏的基本时间单位,在本房间内游戏时间的速度是 1 tick/s)下循环一遍。在这里我们可以不断的更改程序来控制爬虫的行为,即便我们处于离线状态(仅仅在真正的游戏中,不是模拟环境中)也可以正常运行。如果想将脚本提交到游戏中,可以点击“对号”按钮提交,也可以使用快捷键(Ctrl+Enter)(后来发现Ctrl+S也可以,无意间发现的,我写点东西就习惯性的Ctrl+S一下,可能是职业病吧)。
接下来让我们送一个爬虫去采集source,我们会用到 “harvest”方法,这个方法要求energy source与爬虫相邻。
在Script下输入以下代码:
module.exports.loop = function () {
//选择名为“Harvester1”的creep(爬虫)
var creep = Game.creeps[Game.creeps[Harvester1]];
// 找到刚才的creep所在房间的资源列表
var sources = creep.room.find(FIND_SOURCES);
// 对第一个资源点资源进行采集,如果不在范围之内,移动到第一个资源点
/* 无编程基础请仔细阅读并理解这段:creep.harvest(sources[0]) 进行了两个动作1、对资源列表里的第一个资源点采集。2、返回一个值。如果采集成功返回一个值,采集不成功返回另一个值,使用if判断 采集返回的值与ERR_NOT_IN_RANGE(常量:代表不在范围内,即采集失败)的值相是否相等,如果相等则向资源点移动。*/
if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) {
creep.moveTo(sources[0]);
}
}
采集能量的爬虫返回虫巢与资源交付
如果想让我们的爬虫将能量交付给虫巢,我们需要使用“Creep.transfer”方法。但是爬虫必须要在虫巢的旁边,所以需要我们的爬虫返回到虫巢旁边。通过检判断爬虫所负载与爬虫的负载上限来判断爬虫应该是采集资源还是返回虫巢交付资源。
在Script下输入以下代码:
module.exports.loop = function () {
var creep = Game.creeps[Harvester1];
// 如果负载的能量小于负载上限
if(creep.carry.energycreep.carryCapacity) {
//继续采集资源
var sources = creep.room.find(FIND_SOURCES);
if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) {
creep.moveTo(sources[0]);
}
}
// 否则
else{
// 向虫巢Spawn1传送能量资源,如果不在范围内则向Spwan1移动
if(creep.transfer(Game.spawns[Spawn1],RESOURCE_ENERGY)==ERR_NOT_IN_RANGE ) {
creep.moveTo(Game.spawns[Spawn1]);
}
}
}
交付能量爬虫寿命与多个爬虫控制
现在这个爬虫一直会重复这个工作直到死去,记住,几乎所有爬虫大约有1500 ticks的寿命。在那之后,爬虫会衰老并死亡(教程中禁用了)。现在让我们通过控制台再生成一个爬虫(消耗200能量单位),我们可以等到收集足够的能量再去生产一个爬虫。如果我们在能量不足的情况下去生产爬虫的话,控制台返回错误代码ERR_NOT_ENOUGH_ENERGY(-6)。
在控制台输入:Game.spawns[Spawn1].spawnCreep( [WORK, CARRY, MOVE], Harvester2 );
注意:这个爬虫的名字为Harvester2,如果名字重复的话是不会生成爬虫的,会在控制台返回(-3)。
现在第二个爬虫也已经准备好了,但是它还不会移动。我们完全可以复制第一个爬虫的行为代码复制一份贴上去,然后将复制的代码中爬虫名字改为第二个爬虫的。比如说这样:
module.exports.loop = function () {
var creep = Game.creeps[Harvester1];
if(creep.carry.energycreep.carryCapacity) {
var sources = creep.room.find(FIND_SOURCES);
if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) {
creep.moveTo(sources[0]);
}
}
else {
if( creep.transfer(Game.spawns[Spawn1], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE ) {
creep.moveTo(Game.spawns[Spawn1]);
}
}
// 注意这里变量名的变化
var creep1 = Game.creeps[Harvester2];
// 还有这里
if(creep1.carry.energycreep1.carryCapacity) {
var sources = creep.room.find(FIND_SOURCES);
if(creep1.harvest(sources[0]) == ERR_NOT_IN_RANGE) {
creep1.moveTo(sources[0]);
}
}
else {
if( creep1.transfer(Game.spawns[Spawn1], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE ) {
creep1.moveTo(Game.spawns[Spawn1]);
}
}
}
但是最好的方法是使用循环,像这样:
module.exports.loop = function () {
// 每次循环获取名字,注意红色的字
for(var name in Game.creeps) {
// 然后选取相应的爬虫
var creep = Game.creeps[name];
if(creep.carry.energycreep.carryCapacity) {
var sources = creep.room.find(FIND_SOURCES);
if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) {
creep.moveTo(sources[0]);
}
}
else {
if( creep.transfer(Game.spawns[Spawn1], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE ) {
creep.moveTo(Game.spawns[Spawn1]);
}
}
}
}
模块化(类别)
现在,让我们通过将这类爬虫的行为引入单独的模块来改进代码。在脚本编辑器左侧的MODULES(模块)部分的帮助下,创建一个名为role.harvester的模块,并在module.exports对象内定义一个包含一类爬虫行为的运行函数。
module.exports= {
/** @param {Creep} creep **/
/** run:function(creep) 这个模块的一个方法的名称(run可以改成其他的名字)。如果别的模块想使用这段代码的话就需要先获得这个模块,然后使用.run(变量)来调用 **/
run: function(creep) {
if(creep.carry.energycreep.carryCapacity) {
var sources = creep.room.find(FIND_SOURCES);
if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) {
creep.moveTo(sources[0]);
}
}
else {
if(creep.transfer(Game.spawns[Spawn1], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) {
creep.moveTo(Game.spawns[Spawn1]);
}
}
}
};
role.harvester的模块
现在,我们可以重写主模块代码,只留下循环和方法require(“role.harvester”)对新模块的调用。
// 获取role.harvester模块
var roleHarvester = require(role.harvester);
module.exports.loop = function () {
for(var name in Game.creeps) {
var creep = Game.creeps[name];
// 调用role.harvester模块的run方法
roleHarvester.run(creep);
}
}
主模块结束语
第一部分到这里就结束了,接下来我会继续写官方教程的翻译。以后还可能会翻译官方的API文档。不知道说啥了,到这就结束吧。
以上就是(Screeps基础教程 1 游戏界面和基础脚本)全部内容,收藏起来下次访问不迷路!