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))
要获取数据,首先创建一个缓冲区持有者对象,该对象用于在调用之间重复使用底层数组。然后调用批处理方法。请注意,需要显式指定正文上要提取的字段。
>>> 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]
还可以获得碰撞数据的仲裁者。请注意,我们需要调用步骤来运行模拟,并首先清除数据数据缓冲区,以便可以重复使用它们:
>>> 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"))
[]
设置数据¶
(see planet.py示例)
TODO
- class pymunk.batch.ArbiterFields(new_class_name, /, names, *, 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(new_class_name, /, names, *, 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中的值
- BODY_ID¶
pymunk.Body.id
。存储在int_buf中的值。
- FORCE¶
pymunk.Body.force
. X和Y存储在float_buf中。
- POSITION¶
pymunk.Body.position
。X和Y存储在FLOAT_BUF中。
- TORQUE¶
pymunk.Body.torque
.存储在float_buf中的值
- VELOCITY¶
pymunk.Body.velocity
。X和Y存储在FLOAT_BUF中。
- class pymunk.batch.Buffer[源代码]¶
基类:
object
- 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缓冲区中返回。