Screeps 新手入门 · 第 7 篇 建议按照系列顺序阅读;每篇只解决一个新手当前会遇到的问题。
这一篇会用到上一篇的身体部件
[WORK, CARRY, MOVE]是新 Creep 的身体清单,spawnCreep()会让 Spawn 按照这张清单开始创建。
还不熟悉三个基础部件时,可以先回到第 6 篇:认识 WORK、CARRY 和 MOVE。
一、创建前需要准备什么
本文假设房间中已经有一个属于自己的 Spawn。
开始前,请确认:
- 你知道 Spawn 的真实名称;
- 房间当前可用于生成 Creep 的 Energy 足够;
- 游戏中还没有名为
Worker1的 Creep。
本文示例使用:
Spawn 名称:Spawn1
新 Creep 名称:Worker1
在最早期房间中,生成 Energy 主要来自 Spawn;建造 Extension 后,也可以使用房间中可用的 Extension Energy。
二、创建 Creep 需要哪三项内容
1. 找到自己的 Spawn
const spawn = Game.spawns['Spawn1'];
名称写错时,spawn 会是 undefined。在访问 spawn.spawning 或调用 spawn.spawnCreep() 前,先检查:
if (!spawn) {
console.log('找不到 Spawn1,请检查名称和大小写');
return;
}
2. 准备身体部件
[WORK, CARRY, MOVE]
| 部件 | 作用 | Energy 成本 |
|---|---|---|
WORK |
提供工作和采集能力 | 100 |
CARRY |
提供携带空间 | 50 |
MOVE |
提供移动能力 | 50 |
这只基础 Creep 一共需要:
200 Energy
3. 设置唯一名称
'Worker1'
名称不能和已有 Creep 重复。
创建请求一旦被正式接受,名称会立刻进入这次生成流程,因此不要在后面的 tick 继续无条件使用同一个名称提交。
三、第一次调用 spawnCreep()
const result = spawn.spawnCreep(
[WORK, CARRY, MOVE],
'Worker1'
);
这段代码可以理解成:
让这个 Spawn 使用 WORK、CARRY 和 MOVE,开始创建一只名为 Worker1 的 Creep,并把 API 返回值保存到
result。
如果返回:
OK
表示生成请求已经被接受。
但这里要区分三个状态:
请求被接受
≠
Creep 已经生成完成
≠
Creep 已经可以执行普通工作动作
四、最容易误解的时序:Game.creeps[name] 不等于“生成完成”
旧版文章把 Game.creeps['Worker1'] 讲得太晚了,容易让人误以为:
必须等整个生成过程结束以后,
Worker1才会出现在Game.creeps。
当前官方 engine 不是这样处理的。
在本文核对的当前 engine 中,正式 spawnCreep() 请求通过校验后,会在同一次 JavaScript 执行中创建:
Game.creeps['Worker1']
并让这个临时生成中的 Creep 满足:
Game.creeps['Worker1'].spawning === true
然后才返回:
OK
因此:
Boolean(Game.creeps['Worker1'])
只能证明这个名称当前已经有一个 Creep 对象,不能证明生成已经完成。
真正判断“是否还在 Spawn 中”,应该看:
const creep = Game.creeps['Worker1'];
if (creep?.spawning === true) {
// 已经进入 Game.creeps,但仍在生成
}
等到后续 tick:
creep.spawning === false
才表示它已经离开生成阶段,可以进入正常角色逻辑。
证据边界 2026-08-11 已接受的 Console 证据确认了真实
spawnCreep()返回OK,并确认该 Creep 后续确实存在且身体正确;当时没有直接捕获中间spawning === true窗口。上面这一段“同 tick 进入Game.creeps”来自当前官方 engine 源码核对,不冒充新的 Console 实测。
五、dryRun 又是另一条边界
如果使用:
const result = spawn.spawnCreep(
[WORK, CARRY, MOVE],
'Worker1',
{
dryRun: true
}
);
dryRun: true 只检查当前请求条件,不正式开始生成。
当前 engine 会在创建 Game.creeps[name] 之前直接返回 dryRun 结果。
所以:
dryRun === OK
不意味着:
Game.creeps['Worker1']
已经被创建。
这也是为什么“dryRun 通过”和“正式请求已经开始生成”不能混成一个状态。
六、完整的新手代码
Screeps 会在每个 tick 重新运行主循环。
为了避免重复提交同名 Creep,可以同时检查:
Game.creeps['Worker1']是否已经存在;- Spawn 是否已经在生成其他 Creep。
module.exports.loop = function () {
const spawn = Game.spawns['Spawn1'];
if (!spawn) {
console.log('找不到 Spawn1,请检查名称和大小写');
return;
}
const creep = Game.creeps['Worker1'];
if (creep) {
if (creep.spawning === true) {
// Worker1 已进入生成流程,但还不能执行普通工作
return;
}
// Worker1 已经生成完成
return;
}
if (spawn.spawning) {
return;
}
const result = spawn.spawnCreep(
[WORK, CARRY, MOVE],
'Worker1'
);
if (result === OK) {
const created = Game.creeps['Worker1'];
console.log({
action: 'spawn-worker1',
result,
existsAfterAcceptedCall: Boolean(created),
spawningAfterAcceptedCall:
created?.spawning ?? null
});
} else if (
result !== ERR_NOT_ENOUGH_ENERGY
&& result !== ERR_NAME_EXISTS
&& result !== ERR_BUSY
) {
console.log(`创建 Worker1 返回:${result}`);
}
};
保存前先修改 Spawn 名称 把
'Spawn1'换成游戏中的真实 Spawn 名称。'Worker1'也可以修改,但存在检查和创建命令必须使用同一个名称。
这份代码把“对象存在”和“生成完成”分成了两个判断:
!Game.creeps.Worker1
→ 尚未进入这次生成流程
Game.creeps.Worker1?.spawning === true
→ 已进入生成流程,但仍在生成
Game.creeps.Worker1?.spawning === false
→ 已经生成完成
七、怎样查看创建结果
第一次练习时,先认识四个常见返回值:
| 返回结果 | 最简单的理解 | 当前代码怎样处理 |
|---|---|---|
OK |
正式生成请求已接受 | 记录结果,再观察生成状态 |
ERR_NOT_ENOUGH_ENERGY |
当前可用于生成的 Energy 不足 | 等待 Energy 增加 |
ERR_NAME_EXISTS |
名称已经被占用 | 检查名称与重复提交 |
ERR_BUSY |
Spawn 当前已经在生成 | 等待当前生成流程 |
更完整的返回码可以看:spawnCreep() 失败怎么查。
补充证据:empty body 参数边界 2026-09-04 的一条真实 Screeps Console
dryRun记录中,StructureSpawn.spawnCreep([], name, { dryRun: true })返回ERR_INVALID_ARGS (-10)。当时Spawn3处于 active、idle 状态,观测到的 busy flag 在调用前后都为false;accepted record 同时注明没有提交 spawn intent。这条证据只证明 空 body[]这一种参数错误路径;本文不扩展完整ERR_INVALID_ARGS成因,其他参数错误继续由上面的返回码专题负责。
八、保存代码后应该观察什么
按顺序观察:
- Console 是否持续出现“找不到 Spawn1”;
- Energy 足够时,正式调用是否返回
OK; Game.creeps['Worker1']是否已经存在;- 生成阶段的
Game.creeps['Worker1'].spawning是否为true; - 等待后续 tick,直到
spawning变为false; - 再让角色逻辑开始控制这只 Creep。
为什么房间画面里还没看到可工作的 Creep?
因为“对象已经进入 Game.creeps”和“生成完成”是两件事。
一个仍然:
creep.spawning === true
的 Creep 还在 Spawn 中,不能按普通 Worker 去执行采集、移动等正常角色逻辑。
九、现有 Console 证据证明了什么
本文保留原有已接受证据,不把源码结论伪装成新的实测。
EV-1132EEA6DB475F4BDE4C
真实环境中,一个唯一的:
[WORK, CARRY, MOVE]
spawnCreep() 请求返回:
OK (0)
后续又确认了对应 Creep 存在并具有预期身体。
这证明了:
- 该正式请求在真实环境中被接受;
- 后续观察到精确对应的 Creep;
- body 符合预期。
它没有直接捕获同一次执行中的 Game.creeps[name].spawning === true 中间状态。
EV-5F64D77F6CEDD1637FA3
真实 dryRun 验证了重复名称:
ERR_NAME_EXISTS (-3)
EV-1EB26EDDC7D65006ADB2
真实 dryRun 验证了 Energy 不足:2400 Energy 的 body 超过房间当时 2300 可用 Energy,返回:
ERR_NOT_ENOUGH_ENERGY (-6)
EV-BD81087C010F40D037B1
2026-09-04,真实 Screeps Console 在 shard3 / W39N52 对属于自己的 active、idle Spawn3 执行了受控 dryRun:
Game.spawns.Spawn3.spawnCreep(
[],
'L82745772',
{ dryRun: true }
)
返回:
ERR_INVALID_ARGS (-10)
审核记录确认:
Spawn3在调用前处于 active、idle 状态;- 观测到的 busy flag 在调用前后都保持
false; - 该 dryRun 没有提交 spawn intent。
这条证据只证明空 body [] 会在这个已观察路径上被拒绝为 ERR_INVALID_ARGS (-10);它不证明其他所有 ERR_INVALID_ARGS 成因,也不把 dryRun 结果当成正式生成行为。
因此本文目前的证据层级是:
正式 OK + 后续 Creep/body:Console 已验证
dryRun 名称重复:Console 已验证
dryRun Energy 不足:Console 已验证
dryRun 空 body:Console 已验证 ERR_INVALID_ARGS (-10)
同 tick Game.creeps[name].spawning:官方 engine 源码确认,未新增 Console 证据
十、三个常见问题
1. Game.creeps['Worker1'] 已经存在,为什么它还不能工作?
先检查:
Game.creeps['Worker1'].spawning
如果是 true,它仍在生成阶段。
2. Energy 一直不足
本文中的:
[WORK, CARRY, MOVE]
需要 200 Energy。
如果要系统排查 Energy、body、dryRun 和其他返回值,继续看:spawnCreep() 失败怎么查。
3. Spawn 名称写错
完整代码会先:
if (!spawn) return;
所以不会继续访问 undefined.spawning。
十一、这一篇真正要记住什么
| 代码 / 状态 | 最简单的理解 |
|---|---|
Game.spawns['Spawn1'] |
找到指定 Spawn |
[WORK, CARRY, MOVE] |
新 Creep 的身体清单 |
spawn.spawnCreep(body, name) |
正式请求 Spawn 开始生成 |
result === OK |
正式生成请求已经被接受 |
Game.creeps[name] |
该名称当前已经存在 Creep 对象;不代表生成完成 |
Game.creeps[name].spawning === true |
仍在生成 |
Game.creeps[name].spawning === false |
已离开生成阶段 |
dryRun: true |
只检查,不正式创建 Creep 对象 |
总结
这一篇,我们第一次让 Spawn 安全地创建一只新的 Creep,并把最容易混淆的时序拆开:
正式 spawnCreep() 返回 OK
→ 同一次执行中 Game.creeps[name] 已存在且 spawning === true
→ 后续 tick 持续生成
→ spawning === false
→ 才进入正常角色逻辑
所以不要把:
Boolean(Game.creeps[name])
当成“已经生成完成”的判断。
下一篇将继续介绍:房间中有多只 Creep 后,为什么需要给它们分配不同的工作。
官方参考资料
- Screeps API Reference:Game.creeps
- Screeps API Reference:StructureSpawn.spawnCreep
- Screeps API Reference:Creep.spawning
- Screeps API Reference:BODYPART_COST
- 官方 engine:StructureSpawn.spawnCreep
- Screeps Documentation:Creeps 与身体部件
资料核对日期:2026-08-16。当前官方 engine master 为 80977824199a596d174d392fd0cf8c458c21fcbd(4.3.2)。现有 Console 证据继续保留;同 tick Game.creeps[name].spawning 时序来自官方 engine 源码核对,未冒充新的真实服务器观测。