gpt4 book ai didi

python - Pymunk hitreg 问题

转载 作者:行者123 更新时间:2023-12-05 07:29:23 28 4
gpt4 key购买 nike

我想创建一个弹球游戏,但球有时不会与其他物体碰撞。示例:https://youtu.be/HwSXwJ4-d2w

这是代码

import pyglet, pymunk
from pymunk.pyglet_util import DrawOptions

win = pyglet.window.Window(1280, 720, resizable=False)
options = DrawOptions()

space = pymunk.Space()
space.gravity = 0, -1000



def Ball(mass, radius, coords):
circle_moment = pymunk.moment_for_circle(mass, 0, radius)
circle_body = pymunk.Body(mass, circle_moment)
circle_shape = pymunk.Circle(circle_body, radius)
circle_shape.elasticity = 1.0
circle_body.position= coords
space.add(circle_body, circle_shape)

def BouncyCircle(mass, coords, radius):
circle_moment = pymunk.moment_for_circle(mass, 0, radius)
circle_body = pymunk.Body(mass, circle_moment, pymunk.Body.STATIC)
circle_shape = pymunk.Circle(circle_body, radius)
circle_shape.elasticity = 2.0
circle_body.position= coords
space.add(circle_body, circle_shape)

def Segment(mass, PointA, PointB, thickness):
segment_moment = pymunk.moment_for_segment(mass, PointA, PointB, thickness)
segment_body = pymunk.Body(mass, segment_moment, pymunk.Body.STATIC)
segment_shape = pymunk.Segment(segment_body, PointA, PointB, thickness)
segment_shape.elasticity = 0.7
segment_body.position = 0,0
space.add(segment_body, segment_shape)



Ball(0.1, 15, (640, 550)) #Falling Ball

BouncyCircle(1, (650,100), 40) #Ball

Segment(10, (105,55), (1195,55), 5) #Border
Segment(10, (100, 50), (100,680), 5)
Segment(10, (105, 675), (1195,675), 5)
Segment(10, (1200, 50), (1200, 680), 5)


@win.event

def on_draw():
win.clear()
space.debug_draw(options)

def update(dt):
space.step(dt)


if __name__ == "__main__":
pyglet.clock.schedule_interval(update, 1/60)
pyglet.app.run()

当它非常慢时也会发生这种情况,有时它会弹跳 10 次直到停止工作。有人知道如何解决吗?

最佳答案

这很可能是因为球移动得太快了。如果一个物体(例如球)在单个模拟步骤(调用 space.step())中从墙的一侧移动到墙的另一侧,球将穿过。

有几种方法可以缓解这个问题。有时,执行多个操作可能是个好主意。

  1. 确保物体的速度永远不会太高。一种方法是使用自定义速度函数,该函数在倾向于移动过快的物体上内置限制:

    def limit_velocity(body, gravity, damping, dt):
    max_velocity = 1000
    pymunk.Body.update_velocity(body, gravity, damping, dt)
    l = body.velocity.length
    if l > max_velocity:
    scale = max_velocity / l
    body.velocity = body.velocity * scale

    body_to_limit.velocity_func = limit_velocity
  2. 根据要求,在多个帧上限制速度可能更有意义。那么 limit 函数可能看起来像这样:

    def limit_velocity(body, gravity, damping, dt):
    max_velocity = 1000
    pymunk.Body.update_velocity(body, gravity, damping, dt)
    if body.velocity.length > max_velocity:
    body.velocity = body.velocity * 0.99
  3. 在调用 space.step 时为 dt 使用较小的值。一种简单的方法是在应用程序的每个帧中多次调用 space.step。这也有助于使整体模拟更加稳定。

我认为 1 或 2 是您的最佳选择。

我用这个解释更新了 pymunk 文档 + 在这里多了一点:http://www.pymunk.org/en/latest/overview.html#object-tunneling

关于python - Pymunk hitreg 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52822211/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com