1

このコードは、assassin1.png位置(50、80)で静止している黒い画面に画像を表示します。

目標は、その画像にピムンクの重力を誘導して、画像が落下するようにすることです。私はpygameを使用して書かれたpymunkチュートリアルに従い、それを適応させようとしました。コードが画像に重力を適用していない理由がわかりません。誰かが私が間違っていることと、それを正しく機能させるために何を変更すべきかを教えてもらえますか?

import pyglet
import pymunk

class PymunkSpace(object):
    def assassin_space(self, space):
        self.space = space
        self.mass = 91
        self.radius = 14
        self.inertia = pymunk.moment_for_circle(self.mass, 0, self.radius) 
        self.body = pymunk.Body(self.mass, self.inertia) 
        self.body.position = 50, 80 
        self.shape = pymunk.Circle(self.body, self.radius) 
        self.space.add(self.body, self.shape) 
        return self.shape 

class Assassin(pyglet.sprite.Sprite):
    def __init__(self, batch, img, x, y):
        pyglet.sprite.Sprite.__init__(self, img, x , 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.a_space = PymunkSpace().assassin_space(space)
        self.player1 = Assassin(batch = self.batch_draw, img = pyglet.image.load("assassin1.png"), x = self.a_space.body.position.x ,y = self.a_space.body.position.y )

    def on_draw(self):
        self.clear()
        self.batch_draw.draw()
        self.player1.draw()
        space.step(1/50.0) 

if __name__ == "__main__":
    space = pymunk.Space() 
    space.gravity = (0.0, -900.) 
    window = Game()
    pyglet.app.run()
4

1 に答える 1

5

問題は、Sprite一度の場所を設定することです:

self.player1 = Assassin(batch = self.batch_draw, img = pyglet.image.load("assassin1.png"), x = self.a_space.body.position.x ,y = self.a_space.body.position.y )

class Assassin(pyglet.sprite.Sprite):
  def __init__(self, batch, img, x, y):
      pyglet.sprite.Sprite.__init__(self, img, x , y )

しかし、この場所は決して更新されません。

もう 1 つの問題は、pygame の例でspace.step(1/50.0)は、メイン ループのすべての反復で呼び出されるのに対し、あなたのものはウィンドウが描画されたときにのみ呼び出されることです。

したがって、まず、space.stepすべてのフレームで確実に gets が呼び出されるようにする必要があります。を使用してそうしますclock

class Game(pyglet.window.Window):
    def __init__(self):
        ...
        pyglet.clock.schedule(self.update)

    def on_draw(self):
        self.clear()
        self.batch_draw.draw()
        self.player1.draw()

    def update(self, dt):
        space.step(dt)

次のステップは、スプライトの位置が pyglet オブジェクトと同期されていることを確認することです。

アサシンのクラスを変更します。

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

次のように Assassin インスタンスを作成します。

class Game(pyglet.window.Window):
    def __init__(self):
        pyglet.window.Window.__init__(self, width = 315, height = 220)
        self.batch_draw = pyglet.graphics.Batch()
        self.a_space = PymunkSpace().assassin_space(space)
        self.player1 = Assassin(batch = self.batch_draw, img = pyglet.image.load("assassin1.png"), space = self.a_space)
        pyglet.clock.schedule(self.update)

self.player1.update()新しいupdateメソッドを呼び出します。

class Game(pyglet.window.Window):
    def __init__(self):
        ...

    def on_draw(self):
        ...

    def update(self, dt):
        self.player1.update()
        space.step(dt)

(そして、おそらく不要なインスタンス メンバーをいくつか削除する必要がありますが、それは別のトピックです)

于 2012-07-06T12:08:04.633 に答える