Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pymunk hitreg问题_Python_Pymunk - Fatal编程技术网

Python Pymunk hitreg问题

Python Pymunk hitreg问题,python,pymunk,Python,Pymunk,我想创建一个弹球游戏,但球有时不会与其他物体碰撞。 例如: 这是密码 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, rad

我想创建一个弹球游戏,但球有时不会与其他物体碰撞。 例如:

这是密码

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())中从墙的一侧移动到墙的另一侧,球将穿过隧道

有几种方法可以缓解此问题。有时候,做不止一个这样的事情可能是个好主意

  • 确保物体的速度永远不会太高。一种方法是使用自定义速度函数,该函数在有移动过快趋势的物体上内置一个限制:

    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
    
  • 根据需要,将速度限制在多帧上可能更有意义。然后,极限函数可以如下所示:

    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
    
  • 在对space.step的调用中使用较小的dt值。一种简单的方法是在应用程序中的每个帧多次调用space.step。这也将有助于使整体模拟更加稳定

  • 我认为1或2是你最好的选择


    我用以下解释更新了pymunk文档:

    顺便说一句,这不是完全相同的代码,我丢失了它,但这是相同的场景,发生了相同的问题。