2012-07-06 78 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這樣的物理庫編寫平臺遊戲真的很困難。我強烈建議不要這樣做,而是像管理自己的代碼一樣管理物理。

問題是,真實的物理,如寶獸的來與許多副作用,你真的不想要。例如,當你的角色側身跑動時,他們會遇到摩擦拖動地板,無法通過他們的重心進行操作,因此往往會使他們旋轉或倒下。您可能會找到解決方法,但這些方法會產生其他不良的副作用。例如,如果您將角色製成具有較大平底邊緣的蹲下形狀,則這也會影響碰撞檢測。如果你減少與地面的摩擦,這將意味着他們不會隨着時間的推移而減速。你可以添加更多的改進來糾正這些事情,但是它們會有更多的副作用。我在這裏給出的例子只是冰山一角。還有許多更復雜的效應會導致嚴重問題。

取而代之的是,擁有代表角色速度的變量並將其添加到每個幀的位置將極爲簡單。檢測它們是否碰到類似平臺的東西,如果是,則設置它們的水平或垂直速度,以便它們不會移動到平臺中。這也帶有一些微妙的問題,但它們通常比物理模擬更容易修復。