Python抛出错误“RuntimeError:调用Python对象时超出了最大递归深度”

时间:2014-08-12 09:40:41

标签: python runtime-error

#imports
import pygame
#globals
SCREENWIDTH = 800
SCREENHEIGHT = 480

class Player(pygame.sprite.Sprite()):
    #relevant variables
    change_x = 0
    change_y = 0
    level = None

    def __init__(self):
        pygame.sprite.Sprite.__init__()
        self.width = 25
        self.height = 25
        self.image = pygame.Surface([width,height])
        self.image.fill(pygame.color.Color('RED'))

    def update(self):
        """ Move the player. """
        # Move left/right
        self.rect.x += self.change_x


        # See if we hit anything
        block_hit_list = pygame.sprite.spritecollide(self, self.level.platform_list, False)
        for block in block_hit_list:
            # If we are moving right,
            # set our right side to the left side of the item we hit
            if self.change_x > 0:
                self.rect.right = block.rect.left
            elif self.change_x < 0:
                # Otherwise if we are moving left, do the opposite.
                self.rect.left = block.rect.right
            self.change_x = 0

        # Move up/down
        self.rect.y += self.change_y

        # Check and see if we hit anything
        block_hit_list = pygame.sprite.spritecollide(self, self.level.platform_list, False)
        for block in block_hit_list:

            # Reset our position based on the top/bottom of the object.
            if self.change_y > 0:
                self.rect.bottom = block.rect.top
            elif self.change_y < 0:
                self.rect.top = block.rect.bottom

            # Stop our vertical movement
            self.change_y = 0

    def go_left(self):
        self.change_x = -1

    def go_right(self):
        self.change_x = 1

    def go_up(self):
        self.change_y = -1

    def go_down(self):
        self.change_y = 1

    def stop(self):
        self.change_x = 0

#collideable object
class Wall(pygame.sprite.Sprite):
    level = None

    def __init__(self, width, height):
        pygame.sprite.Sprite.__init__()

        self.image = pygame.Surface([width,height])
        self.image.fill(pygame.color.Color('Yellow'))

        self.rect = self.image.get_rect()
#collideable object that will later take players to different rooms
class Door(Wall):
    level = None
    def __init__(self):
        Wall.__init__()
        self.width = 5
        self.height = 30

class Level(object):

    background = None

    world_shift_x = 0
    world_shift_y=0
    level_limit_x = -1000
    level_limit_y = -2000

    def __init__(self, player):
        self.wall_list = pygame.sprite.Group()
        self.enemy_list = pygame.sprite.Group()
        self.door_list = pygame.sprite.Group()

    def update(self):
        self.wall_list.update()
        self.enemy_list.update()
        self.door_list.update()

    def draw(self):
        screen.fill(pygame.color.Color('Black'))
        self.wall_list.draw(screen)
        self.enemy_list.draw(screen)
        self.door_list.draw(screen)

    def shift_world(self, shift_x, shift_y):
        #scrolls the screen at a speed of "shift x or y"
        self.world_shift_x += shift_x
        self.world_shift_y += shift_y
        #shifts items within the world with the world
        for wall in self.wall_list:
            wall.rect.x += shift_x
            wall.rect.y += shift_y

        for door in self.door_list:
            door.rect.x += shift_x
            door.rect.y += shift_y

        for enemy in self.enemy_list:
            enemy.rect.x += shift_x
            enemy.rect.y += shift_y

class Level01(Level):
    #test level
    def __init__(self,player):
        Level.__init__()
        self.level_limit_x = -1000
        self.level_limit_y = -2000

        level = [[200,800,0,SCREENHEIGHT],
                 [200,600,50,SCREENHEIGHT],
                 [850,200,50,0],
                 [600,200,50,-50]
                 ]

        for wall in level:
            block = Wall(wall[0], wall[1])
            block.x = wall[2]
            block.y = wall[3]
            block.player = player
            self.wall_list.add(wall)

def main():
    pygame.init()

    size = [SCREENWIDTH, SCREENHEIGHT]
    screen = pygame.display.set_mode(size)

    pygame.display.set_caption("Game")

    player = Player()

    level_list = []
    level_list.append(Level_01(player))

    current_levelno = 0
    current_level = level_list[current_level_no]

    active_sprite_list = pygame.sprite.Group()
    player.level = current_level

    player.rect.x = 340
    player.rect.y = SCREEN_HEIGHT - player.rect.height
    active_sprite_list.add(player)


    done = False

    clock = pygame.time.Clock()

    while not done:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_a:
                    player.go_left()
                if event.key == pygame.K_d:
                    player.go_right()
                if event.key == pygame.K_w:
                    player.jump()

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_a and player.change_x < 0:
                    player.stop()
                if event.key == pygame.K_d and player.change_x > 0:
                    player.stop()

        active_sprite_list.update()

        current_level.update()

        if player.rect.right >= 380:
            diff_x = player.rect.right - 380
            player.rect.right = 380
            current_level.shift_world(-diff_x)

        if player.rect.left <= 120:
            diff_x = 120 - player.rect.left
            player.rect.left = 120
            current_level.shift_world(diff_x)

        if player.rect.bottom <= 700:
            diff_y = player.rect.bottom - 700
            player.rect.bottom = 700
            current_level.shift_world(-diff_y)

        if player.rect.top >= 100:
            diff_y = 100 - player.rect.bottom
            player.rect.bottom = 100
            current_level.shift_world(diff_y)



        current_position = player.rect.x + current_level.world_shift
        if current_position < current_level.level_limit:
            if current_level_no < len(level_list)-1:
                player.rect.x = 120
                current_level_no += 1
                current_level = level_list[current_level_no]
                player.level = current_level
            else:
                done = True

        current_level.draw(screen)
        active_sprite_list.draw(screen)

        clock.tick(60)

        pygame.display.flip()
    pygame.quit()

if __name__ == "__main__":
    main()

此代码的最后阶段是制作一个功能性自上而下的游戏,其目标是成为一种心理恐怖。到目前为止,游戏中的机制是与墙壁的碰撞,以及通过扩展,门,水平和角色的移动。 总的来说,我可以告诉任何人的是,这个错误与代码中不是全局和导入的所有内容有关(除非我错了,这对我来说更有意义。),并且它有一些东西给做与 A)代码行140
B)在'sprite.py''self.add(*group) (which is line 142 in the 'sprite.py' file)'下的特定行下引发错误 我可以推测的一点是,可能代码抛出一个无限循环,因为看着控制台在IDLE Shell中显示代码,或者pyscripter的消息部分(我用来编程这个),在程序终止之前无限期地迭代。除了无限循环之外,没有创建视觉效果,似乎没有任何事情发生。代码消息是'文件'C:\ Python33 \ lib \ site-packages \ pygame \ sprite.py“,第142行,添加self.add(* group)我不能肯定地说,你可能更好自己运行代码以查看可以收集的内容。

0 个答案:

没有答案