NotImplementedError Python 2.7,sdl2 Pygame

时间:2016-10-29 06:12:16

标签: python pygame

我正在学习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所关心的任何光芒。

1 个答案:

答案 0 :(得分:1)

我使用def process(self, world, componentsets):检查了您的代码是否有错误的缩进。它必须是类方法。

现在它是类外的函数,因此MovementSystem使用其默认方法process()(来自sdl2.ext.Applicator),它只有一个命令raise NotImplementedError()。它是他们必须(过)写这个函数的develores的信息。