美文网首页Screeps 游戏指南
Screeps 常用的取对象方法及代码示例

Screeps 常用的取对象方法及代码示例

作者: masterkeze | 来源:发表于2021-04-26 15:15 被阅读0次

    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 Documentation

    游戏地址:Screeps - MMO strategy sandbox game for programmers

    玩家交流Q群:565401831

    相关文章

      网友评论

        本文标题:Screeps 常用的取对象方法及代码示例

        本文链接:https://www.haomeiwen.com/subject/zxtjrltx.html