Screeps 常用的取对象方法及代码示例
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