跳到主要内容

getMultipleActors 获取场景指定区域中的多个角色

getMultipleActors

类型: MethodDeclaration

所属类: SceneContext

定义位置: scene.ts

描述

获取场景指定区域中的多个角色

返回值:目标角色列表

参数

参数名类型描述默认值
\{ x, y, area = 'rectangle', width = 1, height = 1, radius = 0.5, selector = 'any', teamId = '', activation = 'active', \}`{
/** 选择区域中心X */
x: number
/** 选择区域中心Y */
y: number
/** 选择区域类型 */
area?: 'rectangle' | 'circle'
/** 矩形区域宽度 */
width?: number
/** 矩形区域高度 */
height?: number
/** 圆形区域半径 */
radius?: number
/** 目标角色选择器 */
selector?: 'enemy' | 'friend' | 'team' | 'any'
/** 选择器队伍ID */
teamId?: string
/** 激活状态条件 */
activation?: 'active' | 'inactive' | 'either'
}`--

返回值

类型: Array<Actor>

目标角色列表

源代码

位置: 第 903 行

public getMultipleActors({
x,
y,
area = 'rectangle',
width = 1,
height = 1,
radius = 0.5,
selector = 'any',
teamId = '',
activation = 'active',
}: {
/** 选择区域中心X */
x: number
/** 选择区域中心Y */
y: number
/** 选择区域类型 */
area?: 'rectangle' | 'circle'
/** 矩形区域宽度 */
width?: number
/** 矩形区域高度 */
height?: number
/** 圆形区域半径 */
radius?: number
/** 目标角色选择器 */
selector?: 'enemy' | 'friend' | 'team' | 'any'
/** 选择器队伍ID */
teamId?: string
/** 激活状态条件 */
activation?: 'active' | 'inactive' | 'either'
}): Array<Actor> {
const inspector = SceneContext.actorInspectors[selector]
const teamIndex = Team.get(teamId)?.index ?? -1
const actors = []
let skipCond
switch (activation) {
case 'active':
skipCond = false
break
case 'inactive':
skipCond = true
case 'either':
break
}
switch (area) {
case 'rectangle': {
const halfW = width / 2
const halfH = height / 2
const cells = this.actor.partition.get(x - halfW, y - halfH, x + halfW, y + halfH)
const length = cells.count
for (let i = 0; i < length; i++) {
for (const actor of cells[i] as Array<Actor>) {
if (actor.active === skipCond) {
continue
}
const distX = Math.abs(x - actor.x)
const distY = Math.abs(y - actor.y)
if (distX <= halfW && distY <= halfH && inspector(actor.teamIndex, teamIndex)) {
actors.push(actor)
}
}
}
break
}
case 'circle': {
const cells = this.actor.partition.get(x - radius, y - radius, x + radius, y + radius)
const length = cells.count
for (let i = 0; i < length; i++) {
for (const actor of cells[i] as Array<Actor>) {
if (actor.active === skipCond) {
continue
}
const dist = (x - actor.x) ** 2 + (y - actor.y) ** 2
if (dist <= radius ** 2 && inspector(actor.teamIndex, teamIndex)) {
actors.push(actor)
}
}
}
break
}
}
return actors
}

文档生成时间:2025/7/7 12:07:06