2

此代码assassin1.png在黑屏上显示图像。此图像具有与之相关的 pymunk 身体和形状。在其下方还有一个不可见的静态 pymunk 对象,称为floorpresent。重力作用在图像上,它停留在看不见的地板上。

我想让我的图像在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()
4

2 回答 2

3

使用像 PyMunk 这样的物理库编写平台游戏真的很困难。我强烈建议不要这样做,而是像跳入自己的代码一样管理物理。

问题是像 pymunk 这样的现实物理会带来许多你真的不想要的副作用。例如,当您的角色侧身奔跑时,他们会在地板上受到摩擦阻力,这种阻力无法通过他们的质心进行操作,因此往往会使他们旋转或摔倒。您可能会找到抵消这种情况的方法,但这些方法会产生其他不良副作用。例如,如果您将角色设置为具有大平底边缘的蹲下形状,那么这也会影响碰撞检测。如果你减少它们与地板的摩擦,这将意味着它们不会随着时间的推移而减速。您可以添加更多改进来纠正这些问题,但它们会产生更多副作用。我在这里给出的例子只是冰山一角。

取而代之的是,拥有一个代表角色速度的变量,并将其添加到每一帧的位置上要简单得多。检测他们是否撞到了平台之类的东西,如果是,设置他们的水平或垂直速度,使他们不会进入平台。这也带来了一些微妙的问题,但它们通常比物理模拟更容易修复。

于 2015-03-05T09:30:08.800 回答
3

你需要给身体施加一个冲动。冲量是动量的变化,即质量乘以速度。我假设你希望你的刺客直接跳起来。如果是这种情况,您必须将冲动施加到身体的中心。

body.apply_impulse(pymunk.Vec2d(0, 60), (0, 0))
于 2012-07-13T17:01:51.427 回答