pymunk.batch 模块

批处理模块包含有效获取批处理空间数据的函数。

备注

这个模块是高度实验性的,可能会在未来的Pymunk版本中发生变化,包括主要版本、次要版本和补丁版本!

首先创建空间和两个实体。

>>> import pymunk, pymunk.batch
>>> s = pymunk.Space()
>>> b1 = pymunk.Body(1, 1)
>>> b1.position = 1,2
>>> s.add(b1, pymunk.Circle(b1, 4))
>>> b2 = pymunk.Body(1,1)
>>> b2.position = 3,4
>>> s.add(b2, pymunk.Circle(b2, 4))

要获取数据,首先要创建一个Buffer Holder对象,该对象用于在调用之间重用底层数组。然后调用批处理方法。请注意,需要显式指定要提取的正文上的字段。

>>> data = pymunk.batch.Buffer()
>>> pymunk.batch.get_space_bodies(
...     s,
...     pymunk.batch.BodyFields.BODY_ID | pymunk.batch.BodyFields.POSITION,
...     data,
... )

数据在Buffer对象中作为CFFI缓冲区可用。一个包含任何int数据,另一个包含浮点数据。您可以像这里那样直接使用它,也可以将它传递给实现NumPy数组等缓冲区协议的第三方。

>>> list(memoryview(data.int_buf()).cast("P")) == [b1.id, b2.id]
True
>>> list(memoryview(data.float_buf()).cast("d"))
[1.0, 2.0, 3.0, 4.0]

还可以获得具有冲突数据的仲裁器。请注意,我们需要调用Step来运行模拟,并首先清除数据数据缓冲区,以便可以重用它们:

>>> s.step(1)
>>> data.clear()
>>> pymunk.batch.get_space_arbiters(
...     s,
...     pymunk.batch.ArbiterFields.BODY_A_ID | pymunk.batch.ArbiterFields.BODY_B_ID,
...     data,
... )
>>> list(memoryview(data.int_buf()).cast("P")) == [b2.id, b1.id]
True
>>> list(memoryview(data.float_buf()).cast("d"))
[]
class pymunk.batch.ArbiterFields(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)[源代码]

基类:Flag

用于指定要获取的仲裁器属性的标志字段。

ALL = 65535

所有的田野

BODY_A_ID

pymunk.Body.id 正文A的值存储在int_buf中。

BODY_B_ID

pymunk.Body.id 正文B的值存储在int_buf中。

CONTACT_COUNT

联系人数量(1或2)`。存储在int_buf中的值。

DISTANCE_1

pymunk.ContactPoint.distance 联系人的1。值存储在FLOAT_BUF中。

DISTANCE_2

pymunk.ContactPoint.distance 联系人的2。值存储在FLOAT_BUF中。

IS_FIRST_CONTACT

pymunk.Arbiter.is_first_contact 。存储在int_buf中的值(0或1)。

NORMAL

pymunk.Arbiter.normal 。X和Y存储在FLOAT_BUF中。

POINT_A_1

pymunk.ContactPoint.point_a 存储在FLOAT_BUF中的联系人1的X和Y。

POINT_A_2

pymunk.ContactPoint.point_a 存储在FLOAT_BUF中的联系人2的X和Y。

POINT_B_1

pymunk.ContactPoint.point_b 存储在FLOAT_BUF中的联系人1的X和Y。

POINT_B_2

pymunk.ContactPoint.point_b 存储在FLOAT_BUF中的联系人2的X和Y。

TOTAL_IMPULSE

pymunk.Arbiter.total_impulse 。X和Y存储在FLOAT_BUF中。

TOTAL_KE

pymunk.Arbiter.total_ke 。存储在FLOAT_BUF中的值。

class pymunk.batch.BodyFields(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)[源代码]

基类:Flag

用于指定要获取的正文属性的标志字段。

ALL = 65535

所有的田野

ANGLE

pymunk.Body.angle 。存储在FLOAT_BUF中的值。

ANGULAR_VELOCITY

pymunk.Body.angular_velocity 。存储在FLOAT_buf中的X和Y

BODY_ID

pymunk.Body.id 。存储在int_buf中的值。

POSITION

pymunk.Body.position 。X和Y存储在FLOAT_BUF中。

VELOCITY

pymunk.Body.velocity 。X和Y存储在FLOAT_BUF中。

class pymunk.batch.Buffer[源代码]

基类:object

clear() None[源代码]

将内部数组标记为空(以供重复使用)。

通过调用Clear重用BatchedData对象及其内部数组比每一步创建一个新对象更有效。

float_buf() pymunk._chipmunk.ffi.buffer[源代码]

返回内部数组中浮点数据的CFFI缓冲区对象。

int_buf() pymunk._chipmunk.ffi.buffer[源代码]

返回内部数组中整数数据的CFFI缓冲区对象。

pymunk.batch.get_space_arbiters(space: Space, fields: ArbiterFields, buffers: Buffer) None[源代码]

获取空间中所有活动仲裁器的数据。

使用FIELS属性筛选出您感兴趣的字段。

数据在BATCHED_DATA缓冲区中返回。

pymunk.batch.get_space_bodies(space: Space, fields: BodyFields, buffers: Buffer) None[源代码]

获取空间中所有身体的数据。

使用FIELS属性筛选出您感兴趣的字段。

数据在BATCHED_DATA缓冲区中返回。