美文网首页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 常用的取对象方法及代码示例

    Screeps 基础运行逻辑 Screeps 中,为了实现某个操作而写的代码,通常都可以分为三个步骤 1. 取到要...

  • day14-类和对象1

    1.面向对象编程 代码示例 2.类的声明 代码示例 代码示例 3.对象方法 代码示例 运行结果 4.构造方法和in...

  • Collections工具类的常用方法

    Collections工具类的常用方法 返回类型方法示意扩展代码示例static voidsort(Lis...

  • 去除字符串中的空格符

    参考地址 Array 对象 - JavaScript 教程 - 网道 ---- join 代码示例 方法二 扩展:...

  • synchronized 用法

    一、代码示例 1.synchronized修饰普通方法 synchronized修饰普通代码,加锁对象为调用这个方...

  • SpringBoot 集成websocket

    一、示例概述 本示例代码简单,用来研究websocket内部方法及它们的调用关系。示例前端做了一个很丑的页面...

  • 深入理解引用与引用传递

    1.引用的本质 比如示例代码: 该代码内存及引用创建过程 (1) 在堆内存创建object对象,对象地址为40f1...

  • (5) session对象的使用

    session对象常用方法: 核心代码session.jsp welcome.jsp

  • 17_网络编程基础

    InetAddress类 该类的对象代表一个ip地址对象 常用的类成员方法: 示例 UDP通信 与UDP协议主要相...

  • synchornized学习笔记

    1.对象锁示例同步代码块锁 两个线程同时访问一个方法 输出结果为: 2.对象锁示例普通方法锁 两个线程同时访...

网友评论

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

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