pyxen.GridBody

GridBody 是一个基于网格的碰撞组件,与 GridMap 交互。

有关碰撞概念,请参见碰撞。


构造函数

GridBody(
    *,
    pos=None,
    size=None,
    move=None,
    tag=None,
    mask=None
)

所有参数均为仅关键字参数。


参数

参数类型描述
pos(x, y)初始位置(像素)
size(w, h)碰撞体大小(像素)
move(x, y)移动向量
tagint碰撞体标签
mask(int, …)要碰撞的图块标签元组

示例

e = world.spawn(
    name="hero",
    sprite=sprite,
    layer=LAYER_HERO,
    body=GridBody(
        pos=(64, 64),
        size=(16, 16),
        move=(0, 0),
        tag=TAG_PLAYER,
        mask=(TAG_WALL, TAG_MONSTER)
    )
)

附加 GridBody

在 spawn() 时:

player = world.spawn(
    body=GridBody(pos=(32, 32), size=(16, 16))
)

或稍后:

entity = world.spawn()
entity.body = GridBody(size=(16, 16))

属性

move

使用元组或 Vector2 设置每帧的移动向量。move 接受浮点数,因此你可以以亚像素速度移动:

body.move = (1, 0)      # 1 pixel/frame
body.move = (0.5, 0)    # half a pixel/frame — moves 1px every other frame

move 会跨帧保持(它是每帧的速度);将其设为 (0, 0) 即可停止。位置始终保持像素级精确:小数部分的移动会累积,并以整像素为单位逐步应用,因此碰撞和渲染保持清晰且确定。

读取 move 返回 Vector2:

m = body.move
print(m.x, m.y)

计划中的属性

属性描述
pos碰撞体位置
size碰撞体大小
tag碰撞体标签
mask碰撞掩码

标签系统

tag

每个碰撞体有一个标签:

body.tag = TAG_PLAYER

mask

掩码定义此碰撞体与哪些标签碰撞:

body.mask = (TAG_WALL, TAG_MONSTER)

GridBody + GridMap 交互

GridBody 根据标签过滤与 GridMap 中的图块及其他 GridBody 碰撞。

GridBody 必须是 GridMap 实体的子节点才能处理碰撞。


移动示例

body = player.body

if input.keyboard.left.down:
    body.move = (-1, 0)

if input.keyboard.right.down:
    body.move = (1, 0)

最小设置

level = world.spawn(
    map=GridMap(
        rows=10,
        columns=10,
        size=(16, 16)
    )
)

player = world.spawn(
    parent=level,
    body=GridBody(
        pos=(16, 16),
        size=(16, 16),
        tag=1,
        mask=(2,)
    )
)

常见模式:玩家 vs 墙壁

TAG_PLAYER = 1
TAG_WALL = 2

player = world.spawn(
    body=GridBody(
        pos=(32, 32),
        size=(16, 16),
        tag=TAG_PLAYER,
        mask=(TAG_WALL,)
    )
)

如果图块设置为:

map.set(row=0, column=5, tag=TAG_WALL)

玩家将与其碰撞。