Python 使用pyglet和pymunk使精灵角色自然跳跃
此代码在黑屏上显示图像Python 使用pyglet和pymunk使精灵角色自然跳跃,python,game-physics,pyglet,pymunk,Python,Game Physics,Pyglet,Pymunk,此代码在黑屏上显示图像1.png。此图像具有pymunk主体和与其关联的形状。下面还有一个不可见的静态pymunk对象,名为floor。重力在图像上感应,它停在看不见的地板上 我想在按下UP键时使图像自然跳跃。我如何实现这一点 import pyglet import pymunk def assassin_space(space): mass = 91 radius = 14 inertia = pymunk.moment_for_circle(mass, 0, ra
1.png
。此图像具有pymunk主体和与其关联的形状。下面还有一个不可见的静态pymunk对象,名为floor
。重力在图像上感应,它停在看不见的地板上
我想在按下UP
键时使图像自然跳跃。我如何实现这一点
import pyglet
import pymunk
def assassin_space(space):
mass = 91
radius = 14
inertia = pymunk.moment_for_circle(mass, 0, radius)
body = pymunk.Body(mass, inertia)
body.position = 50, 80
shape = pymunk.Circle(body, radius)
space.add(body, shape)
return shape
def add_static_line(space):
body = pymunk.Body()
body.position = (0,0)
floor = pymunk.Segment(body, (0, 20), (300, 20), 0)
space.add_static(floor)
return floor
class Assassin(pyglet.sprite.Sprite):
def __init__(self, batch, img, space):
self.space = space
pyglet.sprite.Sprite.__init__(self, img, self.space.body.position.x, self.space.body.position.y)
def update(self):
self.x = self.space.body.position.x
self.y = self.space.body.position.y
class Game(pyglet.window.Window):
def __init__(self):
pyglet.window.Window.__init__(self, width = 315, height = 220)
self.batch_draw = pyglet.graphics.Batch()
self.player1 = Assassin(batch = self.batch_draw, img = pyglet.image.load("assassin1.png"), space = assassin_space(space))
pyglet.clock.schedule(self.update)
add_static_line(space)
def on_draw(self):
self.clear()
self.batch_draw.draw()
self.player1.draw()
space.step(1/50.0)
def on_key_press(self, symbol, modifiers):
if symbol == pyglet.window.key.UP:
print "The 'UP' key was pressed"
def update(self, dt):
self.player1.update()
space.step(dt)
if __name__ == "__main__":
space = pymunk.Space() #
space.gravity = (0.0, -900.) #
window = Game()
pyglet.app.run()
你需要对身体施加一种冲动。冲量是动量的变化,即质量乘以速度。我猜你想让你的阿萨辛跳起来。如果是这样的话,你必须把这个冲动施加到身体的中心
body.apply_impulse(pymunk.Vec2d(0, 60), (0, 0))
使用PyMunk这样的物理库编写平台构建器真的很难。我强烈建议不要这样做,而是像跳进自己的代码一样管理物理 问题是像pymunk这样的现实物理学带来了许多你真的不想要的副作用。例如,当您的角色侧向运行时,他们将在地板上遇到摩擦阻力,而摩擦阻力无法通过他们的重心运行,因此会使他们旋转或摔倒。您可能会找到一些方法来抵消这一点,但这些方法会产生其他不良副作用。例如,如果将角色设置为具有大平底边的深蹲形状,则这也会影响碰撞检测。如果你减少它们与地板的摩擦,这就意味着它们不会随着时间的推移而减速。您可以添加更多的改进来纠正这些问题,但它们会产生更多的副作用。我在这里举的例子只是冰山一角。还有许多更复杂的影响将导致大问题 相反,使用一个代表角色速度的变量,并在每一帧将其添加到角色的位置,这要简单得多。检测它们是否击中了类似平台的物体,如果击中了,则设置其水平或垂直速度,使其不会移动到平台中。这也带来了一些微妙的问题,但它们通常比物理模拟更容易解决。无论你是想笔直向上跳还是以一定角度跳,你总是将冲动施加到身体的中心。如果你想让身体旋转和跳跃的话,唯一可以把它应用到中心以外的地方。