我最近对 Screeps 上瘾了,我重构了一些代码来实现基于任务的实现。任务是诸如“步行到然后收获,直到你满负荷”之类的东西,并且基于编写为 ES6 样式类的单个基本任务模板。Creeps 可以通过加载相关任务文件并返回新任务实例的包装器 (tasks.js) 分配任务。
今天我遇到了一个奇怪的错误,让我觉得我没有完全理解 Javascript 的继承模型。下面是相关代码:
Task.js:(基础任务类)
class Task {
constructor(taskName) {
// Parameters for the task
this.name = taskName; // name of task
this.quiet = false; // suppress console logging if true
this.creep = [creep assigned to this task]
this.target = [thing task operates on, e.g. "repair this wall"]
...
}
...
// Execute this task each tick. Returns nothing unless work is done.
step() {
...
if (creep.pos.inRangeTo(target, this.targetRange)) {
var workResult = this.work();
console.log(this.quiet) // < returns false, should be true?
if (workResult != OK && this.quiet == false) {
creep.log("Error: " + workResult); // < is printed when run
}
return workResult;
} [else move to target]
}
...
// Task to perform when at the target
work() {
// overwrite this in child class
}
}
module.exports = Task;
task_harvest.js:(收获任务)
var Task = require('Task');
class taskHarvest extends Task {
constructor() {
super('harvest');
// no mention of this.quiet here
}
...
work() {
console.log("harvest:" + this.quiet);
return this.creep.harvest(this.target);
}
}
module.exports = taskHarvest;
tasks.js:(通过函数调用生成新任务实例的包装器)
module.exports = function (taskName) {
var TaskClass = require('task_' + taskName); // all tasks follow this naming pattern
var taskInstance = new TaskClass;
return taskInstance;
};
收割机.js:(收割机蠕变的行为模型)
var tasks = require('tasks');
var roleHarvester = {
...
harvest: function (creep) {
var target = Game.getObjectById(creep.memory.assignment);
var taskHarvest = tasks('harvest');
taskHarvest.quiet = true; // < this task shouldn't print anything
creep.assign(taskHarvest, target); // assigns to creep.task
return OK;
},
...
run: function (creep) { // executed every tick
// execute the task
creep.task.step();
},
...
}
当我分配一个从源中获取的cree 时,我从task_harvest.js 创建一个新任务,将其quiet
属性设置为true
,并将它和它的目标绑定到cree。一旦cree有一个任务,它就会被指示运行它,直到它变得无效(代码未包含在上面)。蠕变可以很好地执行任务,但它仍会将所有内容记录到控制台。
我认为在harvester.js 中,当我设置时taskHarvest.quiet = true;
,从Task.js 导入的行为会this.quiet
显示为true
. 然而,似乎情况并非如此。在roleHarvester
,运行console.log(creep.task.quiet)
返回true
,但在蠕变执行分配的任务时Task
,运行给出。console.log(this.quiet)
false
我可以将quiet
作为可选参数添加到构造函数中,但这很复杂,我想知道为什么我正在做的事情不起作用。