我正在学习Pygame / SDL2并遇到了一个不太有帮助的错误。
Traceback (most recent call last):
File "pygame.py", line 98, in <module>
sys.exit(run())
File "pygame.py", line 94, in run
world.process()
File "/usr/local/lib/python2.7/dist-packages/sdl2/ext/ebs.py", line 238, in process
s_process(self, comps)
File "/usr/local/lib/python2.7/dist-packages/sdl2/ext/ebs.py", line 277, in process
raise NotImplementedError()
NotImplementedError
我知道NotImplementedError是一些特定类型的Python错误。我对Python的了解不是专家级的。我是否正确相信它只是意味着我有一个拼写错误或我是否有一个更系统的问题,如版本问题?在这个tutoiral的前几步中,一切都运行良好。我正在关注这个sdl2 / pygame教程http://pysdl2.readthedocs.io/en/rel_0_9_4/tutorial/pong.html#adding-the-game-world
这是我的源代码。
import sys
import sdl2
import sdl2.ext
WHITE = sdl2.ext.Color(255, 255, 255)
class SoftwareRenderer(sdl2.ext.SoftwareSpriteRenderSystem):
def __init__(self, window):
super(SoftwareRenderer, self).__init__(window)
def render(self, components):
sdl2.ext.fill(self.surface, sdl2.ext.Color(0, 0, 0))
super(SoftwareRenderer, self).render(components)
class MovementSystem(sdl2.ext.Applicator):
def __init__(self, minx, miny, maxx, maxy):
super(MovementSystem, self).__init__()
self.componenttypes = Velocity, sdl2.ext.Sprite
self.minx = minx
self.miny = miny
self.maxx = maxx
self.maxy = maxy
def process(self, world, componentsets):
for velocity, sprite in componentsets:
swidth, sheight = sprite.size
sprite.x += velocity.vx
sprite.y += velocity.vy
sprite.x = max(self.minx, sprite.x)
sprite.y = max(self.miny, sprite.y)
pmaxx = sprite.x + swidth
pmaxy = sprite.y + sheight
if pmaxx > self.maxx:
sprite.x = self.maxx - swidth
if pmaxy > self.maxy:
sprite.y = self.maxy - sheight
class Velocity(object):
def __init__(self):
super(Velocity, self).__init__()
self.vx = 0
self.vy = 0
class Player(sdl2.ext.Entity):
def __init__(self, world, sprite, posx=0, posy=0):
self.sprite = sprite
self.sprite.position = posx, posy
self.velocity = Velocity()
class Ball(sdl2.ext.Entity):
def __init__(self, world, sprite, posx=0, posy=0):
self.sprite = sprite
self.sprite.position = posx, posy
self.velocity = Velocity()
def run():
sdl2.ext.init()
window = sdl2.ext.Window("The Pong Game", size=(800, 600))
window.show()
world = sdl2.ext.World()
spriterenderer = SoftwareRenderer(window)
world.add_system(spriterenderer)
factory = sdl2.ext.SpriteFactory(sdl2.ext.SOFTWARE)
sp_paddle1 = factory.from_color(WHITE, size=(20,100))
sp_paddle2 = factory.from_color(WHITE, size=(20,100))
sp_ball = factory.from_color(WHITE, size=(20, 20))
movement = MovementSystem(0, 0, 800, 600)
spriterenderer = SoftwareRenderer(window)
world.add_system(movement)
world.add_system(spriterenderer)
ball = Ball(world, sp_ball, 390, 290)
ball.velocity.vx = -3
player1 = Player(world, sp_paddle1, 0, 250)
player2 = Player(world, sp_paddle2, 780, 250)
running = True
while running:
events = sdl2.ext.get_events()
for event in events:
if event.type == sdl2.SDL_QUIT:
running = False
break
world.process()
return 0
if __name__ == "__main__":
sys.exit(run())
感谢你们对Longhorns所关心的任何光芒。
答案 0 :(得分:1)
我使用def process(self, world, componentsets):
检查了您的代码是否有错误的缩进。它必须是类方法。
现在它是类外的函数,因此MovementSystem
使用其默认方法process()
(来自sdl2.ext.Applicator
),它只有一个命令raise NotImplementedError()
。它是他们必须(过)写这个函数的develores的信息。