pyxen.GridBody
GridBody 是一个基于网格的碰撞组件,与 GridMap 交互。
有关碰撞概念,请参见碰撞。
构造函数
GridBody(
*,
pos=None,
size=None,
move=None,
tag=None,
mask=None
)
所有参数均为仅关键字参数。
参数
| 参数 | 类型 | 描述 |
|---|---|---|
pos | (x, y) | 初始位置(像素) |
size | (w, h) | 碰撞体大小(像素) |
move | (x, y) | 移动向量 |
tag | int | 碰撞体标签 |
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
使用元组或 Vector2i 设置移动向量:
body.move = (1, 0)
读取 move 返回 Vector2i:
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)
玩家将与其碰撞。