Screeps 基础运行逻辑
Screeps 中,为了实现某个操作而写的代码,通常都可以分为三个步骤
1. 取到要操作的对象,以及被操作的对象,并校验这些对象
2. 获取配置参数
3. 执行操作
本文主要讲解Screeps中如何用不同的方式,取到形形色色的对象。
Screeps 常用游戏对象字典
Game.rooms —— 玩家有视野的所有房间
Game.creeps —— 玩家控制的存活的creep
Game.flags —— 玩家插下的旗子
Game.spawns —— 玩家所有控制的spawn
Game.constructionSites —— 玩家控制的建筑工地
creep.store / terminal.store —— 容量对象
Screeps 常用取对象的方法
一、从游戏对象字典中取对象
1. 有名字,直接用名字取,可能取出undefined,这种取数方式一般也称为硬编码,一般只在console或者编写demo时使用。
const room = Game.rooms["W1N1"] // 取房间对象
const creep = Game.rooms["creep1"] // 取creep对象
const flag = Game.flags["Flag1"] // 取旗子对象
const energyStorage = terminal.store["energy"] // 取terminal中能量储量
2. 转换成数组,按照特征过滤取出符合特征要求的对象数组,然后按索引或者循环处理。
const rooms = Object.values(Game.rooms).filter((room)=>( room.controller && room.controller.my )) // 查到所有玩家控制的房间,存入房间数组中
if (rooms.length > 0) const room = rooms[0] // 索引取对象,这里取了第一个(明确知道这个数组只有至多一个对象的时候,才会这么用)
rooms.foreach((room)=>{ //循环操作每个房间 }) // 循环处理数组中的每个对象
const resourceTypes = Object.keys(terminal.store) // 拿到terminal里储仓资源类型的列表
if (resourceTypes.length > 0) creep.withdraw(resourceTypes[0]) // 如果有剩余,则取出第一个资源类型
二、获取房间中的特定对象(位置相关)需要先取到Room或者RoomPosition对象,再进行查找
这种方式返回的结果通常是数组,在数组上进一步过滤可以得到具体的对象
const room = Game.rooms["W1N1"]
const towers = room.find(FIND_STRUCTURES).filter((structure)=>(structure.structureType === STRUCTURE_TOWER)) // 找到房间中所有塔对象的数组
const tower = towers[0]
const target=tower.pos.findClosestByRange(FIND_HOSTILE_CREEPS,{filter:{owner:{username:'Invader'}}}) // 找到离这个塔最近的敌方单位
room.lookForAtArea(LOOK_STRUCTURES,room.storage.pos.y-2,room.storage.pos.x-2,room.storage.pos.y+2,room.storage.pos.x+2,true).filter((look)=>(look.structure.structureType === STRUCTURE_LINK)) // 找到storage 周围2格之内的link的数组
room.find(FIND_STRUCTURES).filter((structure)=>(room.storage && structure.structureType === STRUCTURE_LINK && structure.pos.getRangeTo(room.storage.pos) <= 2)) // 另一种方式 找到storage 周围2格之内的link的数组(比上一种会慢一些)
三、从已有对象获取关联的对象
creep.room, storage.room, terminal.room, tower.room .. 任何的roomObject都有room属性,可以直接取到room对象
room.controller(?) room.storage(?) room.terminal(?) 从room可以直接取到 controller, storage, terminal,如果不存在,返回的就是undefined
creep.store, container.store, tower.store, spawn.store 所有能存储资源的单位,都可以取到 store 对象
四、自己创建的对象
1. RoomVisual —— 房间内界面增加可视化的要素
Game.rooms['W10N10'].visual.circle(10,20).line(0,0,10,20)
newRoomVisual('W10N10').circle(10,20).line(0,0,10,20)
2. RoomPosition —— 创建位置信息,一般用于跨房间的移动,或者序列化后存储位置信息
const pos = newRoomPosition(10,25,'W1N1')
creep.moveTo(pos) // 创建一个位置对象,再移动到那个位置,位置对象不需要视野
游戏地址:Screeps - MMO strategy sandbox game for programmers
玩家交流Q群:565401831