2012-07-06 82 views
2

此代码在黑色屏幕上显示图像assassin1.png。这个图像有一个与它相关的宝石身体和形状。在它下方还有一个名为floor的隐形静态pymunk对象。重力是在图像上引起的,它在无形的地板上休息。使pyglet和pymunk自然跳转成精灵字符

当我按下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() 

回答

3

您需要对身体施加冲动。冲动是动量的变化,这是质量乘以速度。我假设你想让你的asassin直线跳起来。如果是这样的话,你必须把冲动应用到身体的中心。

body.apply_impulse(pymunk.Vec2d(0, 60), (0, 0)) 
+0

您*总是*将冲动应用到身体的中心,无论您是想要直线跳跃还是以一定角度跳跃。将它应用到中心以外的唯一时间是如果你想要身体旋转以及跳跃。 – 2017-03-27 13:10:35

3

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

问题是,真实的物理,如宝兽的来与许多副作用,你真的不想要。例如,当你的角色侧身跑动时,他们会遇到摩擦拖动地板,无法通过他们的重心进行操作,因此往往会使他们旋转或倒下。您可能会找到解决方法,但这些方法会产生其他不良的副作用。例如,如果您将角色制成具有较大平底边缘的蹲下形状,则这也会影响碰撞检测。如果你减少与地面的摩擦,这将意味着他们不会随着时间的推移而减速。你可以添加更多的改进来纠正这些事情,但是它们会有更多的副作用。我在这里给出的例子只是冰山一角。还有许多更复杂的效应会导致严重问题。

取而代之的是,拥有代表角色速度的变量并将其添加到每个帧的位置将极为简单。检测它们是否碰到类似平台的东西,如果是,则设置它们的水平或垂直速度,以便它们不会移动到平台中。这也带有一些微妙的问题,但它们通常比物理模拟更容易修复。