gpt4 book ai didi

python - 在 pyglet 中使用 pymunk 重力

转载 作者:太空宇宙 更新时间:2023-11-04 09:14:18 25 4
gpt4 key购买 nike

此代码在黑色屏幕上显示图像 assassin1.png,静止不动地位于 (50, 80) 位置。

目标是在该图像上引发 pymunk 引力,使其掉落。我关注了 pymunk tutorial它是使用 pygame 编写的,并试图对其进行改编。我不知道为什么我的代码没有对我的图像应用重力。有人可以告诉我我做错了什么以及我应该改变什么才能使其正常工作吗?

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()

最佳答案

问题是您设置了一次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 )

但是这个位置永远不会更新。

另一个问题是,在 pygame 示例中,主循环的每次迭代都会调用 space.step(1/50.0),而您的只会在绘制窗口时调用。

因此,首先,您应该确保每帧调用 space.step。通过使用 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)

下一步是确保 Sprite 的位置与 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)

并在新的 update 方法中调用 self.player1.update():

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

def on_draw(self):
...

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

(您可能应该去掉一些不需要的实例成员,但那是另一个话题)

关于python - 在 pyglet 中使用 pymunk 重力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11360195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com