Ben*_*ey4 1 python pyglet game-physics pymunk
此代码assassin1.png在黑色屏幕上显示图像,静止在位置(50,80).
目标是在该图像上诱导花栗鼠引力,使其落下.我按照pymunk教程使用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()
Run Code Online (Sandbox Code Playgroud)
问题是你设置了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 )
Run Code Online (Sandbox Code Playgroud)
但这个位置永远不会更新.
另一个问题是在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)
Run Code Online (Sandbox Code Playgroud)
下一步是确保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
Run Code Online (Sandbox Code Playgroud)
像这样创建你的刺客实例:
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)
Run Code Online (Sandbox Code Playgroud)
并调用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)
Run Code Online (Sandbox Code Playgroud)
(你应该摆脱一些不需要的实例成员,但这是另一个话题)