首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pymunk hitreg问题

Pymunk hitreg问题
EN

Stack Overflow用户
提问于 2018-10-16 01:49:50
回答 1查看 36关注 0票数 2

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

下面是代码

代码语言:javascript
复制
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次,直到停止工作。有人知道怎么修吗?

EN

回答 1

Stack Overflow用户

发布于 2019-05-21 04:50:43

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

有几种方法可以缓解这个问题。有时做多个这样的事情可能是个好主意。

  1. 确保对象的速度永远不会太高。要做到这一点,一种方法是使用自定义速度函数,并在具有运动过快趋势的物体上内置限制:

limit_velocity

  • Depending limit_velocity(身体,重力,阻尼,dt):max_velocity = 1000 pymunk.Body.update_velocity(身体,重力,阻尼,dt) l= body.velocity.length if l> max_velocity: scale = max_velocity /l body.velocity = body.velocity * scale body_to_limit.velocity_func = def根据要求,将速度钳制在多个帧上可能更有意义。那么limit函数可以看起来像这样:

def limit_velocity(身体,重力,阻尼,dt):max_velocity = 1000 pymunk.Body.update_velocity(身体,重力,阻尼,dt)如果body.velocity.length > max_velocity: body.velocity = body.velocity *0.99

  • 在对space.step的调用中使用较小的dt值。一种简单的方法是在应用程序中多次调用space.step。这也将有助于使整体模拟更加稳定。

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

我用这个解释更新了pymunk文档,并在这里做了更多说明:http://www.pymunk.org/en/latest/overview.html#object-tunneling

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52822211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档