2

このコードは、画像assassin1.pngを黒い画面に表示します。この画像にはピムンクのボディと形状が関連付けられています。その下には、presentと呼ばれる目に見えない静的な 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()
4

2 に答える 2

3

あなたは体に衝動を加える必要があります。インパルスは運動量の変化であり、質量と速度の積です。私はあなたがあなたの暗殺者をまっすぐにジャンプさせたいと思います。その場合は、体の中心に衝撃を加える必要があります。

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

PyMunk のような物理ライブラリを使用してプラットフォーマーを作成するのは非常に困難です。私はこれに反対することを強くお勧めします。代わりに、独自のコードにジャンプするなどの物理現象を管理することをお勧めします。

問題は、ピムンクのような現実的な物理学には、本当に望ましくない多くの副作用が伴うことです。たとえば、キャラクターが横向きに走っている場合、床に対して摩擦抵抗が発生します。これは、重心を介して動作することができないため、回転したり倒れたりする傾向があります。これに対抗する方法が見つかるかもしれませんが、これらには他の望ましくない副作用があります。たとえば、キャラクターを大きな平らな下端を持つしゃがんだ形状にした場合、これは衝突検出にも影響します。床との摩擦を減らすと、時間の経過とともに速度が低下しなくなります。これらのことを修正するためにさらに改良を加えることができますが、それらにはさらに多くの副作用があります。ここで挙げた例は氷山の一角にすぎません。

代わりに、キャラクターの速度を表す変数を用意し、それをフレームごとに位置に追加する方がはるかに簡単です。プラットフォームなどに衝突したかどうかを検出し、衝突した場合は、プラットフォームに移動しないように水平または垂直の速度を設定します。これにはいくつかの微妙な問題も伴いますが、通常は物理シミュレーションよりもはるかに簡単に修正できます。

于 2015-03-05T09:30:08.800 に答える