pyxen.world.near()
返回某点半径范围内的实体,最近的在前。
world.near(x, y, radius, *components, without=None)
返回位置与 (x, y) 的距离不超过 radius 的实体,最近的在前。距离相同的两个实体总是按相同顺序排列。组件和 without 的用法与 world.all() 相同;不指定组件时,所有实体都算在内。
实体很多时也很快:Pyxen 把实体按位置放进网格,只查看圆所覆盖的地方。所以一发子弹查找附近的敌人,有 50 个敌人和有 5000 个敌人时花费差不多。
参数
| 参数 | 类型 | 说明 |
|---|---|---|
x | float | 点的 x,以世界像素为单位 |
y | float | 点的 y,以世界像素为单位 |
radius | float | 离点多远,以像素为单位。0 会找到正好在点上的实体 |
*components | str | 实体必须全部拥有的组件名,与 world.all() 相同 |
without | tuple | 实体不能拥有的组件名 |
命中的子弹
每发子弹伤害它碰到的敌人,而不用检查游戏里的每个敌人:
for shot in world.all("shot"):
for foe in world.near(shot.x, shot.y, 10, "foe"):
foe.foe.hp -= 1
if foe.foe.hp <= 0:
world.destroy(foe)
在这里销毁的敌人再也不会被找到,这发子弹和下一发都不会。
自动瞄准
第一个实体就是最近的,所以用 next 取出它;范围内没有时得到 None:
hero = world.get(name="hero")
target = next(world.near(hero.x, hero.y, 120, "foe", without=("dead",)), None)
if target is not None:
fire_at(target.x, target.y)
塔也用同样的方法,从自己的位置和射程中选择目标。
位置
距离是在点和每个实体的世界位置之间测量的:经过父实体的位置、旋转和缩放后的 x 和 y,也就是它被绘制的地方。对于在根下的实体,或在 (0, 0) 且不旋转、不缩放的父实体下的实体(通常关卡里的敌人就是这样),就是它们的 x 和 y。
同一帧里之前写入的位置会立即生效:先移动子弹,再询问它附近有什么。
特殊情况
- 负的半径什么也找不到。
math.inf会找到所有实体,最近的在前。 - 结果反映的是询问时的位置:物体移动后请再问一次。