pyxen.world.near()

返回某点半径范围内的实体,最近的在前。

world.near(x, y, radius, *components, without=None)

返回位置与 (x, y) 的距离不超过 radius 的实体,最近的在前。距离相同的两个实体总是按相同顺序排列。组件和 without 的用法与 world.all() 相同;不指定组件时,所有实体都算在内。

实体很多时也很快:Pyxen 把实体按位置放进网格,只查看圆所覆盖的地方。所以一发子弹查找附近的敌人,有 50 个敌人和有 5000 个敌人时花费差不多。


参数

参数类型说明
xfloat点的 x,以世界像素为单位
yfloat点的 y,以世界像素为单位
radiusfloat离点多远,以像素为单位。0 会找到正好在点上的实体
*componentsstr实体必须全部拥有的组件名,与 world.all() 相同
withouttuple实体不能拥有的组件名

命中的子弹

每发子弹伤害它碰到的敌人,而不用检查游戏里的每个敌人:

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 会找到所有实体,最近的在前。
  • 结果反映的是询问时的位置:物体移动后请再问一次。