python - 为什么我的 pygame 代码因“RecursionError:调用 Python 对象时超出最大递归深度”而崩溃?
问题描述
我想在我的 pygame 的 rpg 上放置一个碰撞系统,我的代码因“RecursionError:调用 Python 对象时超出最大递归深度”而崩溃。我尝试了很多东西,但总是出现错误。
我的代码:
import pygame
from pygame.locals import *
from player import *
class Camera:
def __init__(self, widht, height):
self.rect = pygame.Rect(0, 0, widht, height)
self.widht = widht
self.height = height
self.center = list(self.rect.center)
self.x = self.center[0]
self.y = self.center[1]
def apply(self, entity):
return entity.move(self.rect.topleft)
def update(self, target):
y = -target.rect.y + int(769 / 2)
x = -target.rect.x + int(1024 / 2)
self.rect = pygame.Rect(x, y, self.widht, self.height)
class Level(pygame.sprite.Sprite):
def __init__(self):
self.structure = 0
self.all_blocks = pygame.sprite.Group()
def generer(self):
with open("niveau.txt", "r") as fichier:
structure_niveau = []
for ligne in fichier:
ligne_niveau = []
for sprite in ligne:
if sprite != '\n':
ligne_niveau.append(sprite)
structure_niveau.append(ligne_niveau)
self.structure = structure_niveau
def afficher(self, fenetre, x, y, camX, camY, playerX, playerY):
tailleSprite = 64
self.all_blocks.empty()
#Camera.__init__(self, x, y)
cam = Camera(1024, 768)
grass = pygame.image.load("assets/bloc/grass.png").convert_alpha()
tree = pygame.image.load("assets/bloc/tree_grass.png").convert_alpha()
no_texture = pygame.image.load("assets/bloc/no_texture.png").convert_alpha()
num_ligne = 0
for ligne in self.structure:
num_case = 0
for sprite in ligne:
x = num_case * tailleSprite + camX
y = num_ligne * tailleSprite + camY
sprite_rect = pygame.Rect(x, y, 64, 64)
screenRect = pygame.Rect(x, y, 1088, 836)
aroundPlayer = pygame.Rect(playerX, playerY, playerX + 128, playerY + 128)
if sprite == 'G':
if screenRect.contains(sprite_rect):
fenetre.blit(grass, (x, y))
if aroundPlayer.contains(sprite_rect):
self.all_blocks.add(sprite)
elif sprite == 'T':
if screenRect.contains(sprite_rect):
fenetre.blit(tree, (x, y))
#self.all_blocks.add(sprite)
#print(self.x, self.y)
else:
if screenRect.contains(sprite_rect):
fenetre.blit(no_texture, (x, y))
#print(x, y)
num_case += 1
num_ligne += 1
和 main.py:
import pygame
from game import Game
from level import *
pygame.init()
lvl = Level()
WIDHT = 768
HEIGHT = 1024
screen = pygame.display.set_mode((1024, 768))
screen_rect = pygame.Rect(0, 0, HEIGHT, WIDHT)
pygame.display.set_caption("RPG")
game = Game()
cam = Camera(1024, 768)
running = True
lvl.generer()
print(game.player.rect)
print(screen_rect)
clock = pygame.time.Clock()
lvl.afficher(screen, 0, 0, 0, 0, game.player.rect.x, game.player.rect.y)
camPos = 0
while running:
lvl.afficher(screen, 0, 0, camPos, 0, game.player.rect.x, game.player.rect.y)
cam.apply(game.player.rect)
cam.update(game.player)
#print(cam.rect.topleft)
if game.pressed.get(pygame.K_RIGHT):
game.player.move_right()
#print(game.player.rect.x)
if not screen_rect.contains(game.player.rect):
game.player.rect.x -= HEIGHT -60
camPos += -HEIGHT
elif game.pressed.get(pygame.K_LEFT):
game.player.move_left()
#print(game.player.rect.x)
if not screen_rect.contains(game.player.rect):
game.player.rect.x += HEIGHT - 60
camPos += HEIGHT
elif game.pressed.get(pygame.K_DOWN):
game.player.move_down()
#print(game.player.rect.y)
if not screen_rect.contains(game.player.rect):
game.player.rect.y -= WIDHT - 80
elif game.pressed.get(pygame.K_UP):
game.player.move_up()
#print(game.player.rect.y)
if not screen_rect.contains(game.player.rect):
game.player.rect.y += WIDHT - 80
#print(cam.rect.x, cam.rect.y)
#print(cam.rect)
screen.blit(game.player.image, game.player.rect)
pygame.display.flip()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
elif event.type == pygame.KEYDOWN:
game.pressed[event.key] = True
elif event.type == pygame.KEYUP:
game.pressed[event.key] = False
解决方案
尝试以下选项之一,这将帮助您摆脱错误
- 尝试将算法从递归更改为迭代
- 您可以使用
sys.setrecursionlimit(n)
- 在 python 中递归限制为 999 次调用来更改递归限制。
推荐阅读
- nginx - Nginx 支持带有回退的特定通配符 server_name (regex)
- angular - 在 html 中动态命名 div 并使用 @ViewChild('xyz') div: ElementRef; 在角度
- apache-kafka - 无法使用骆驼连接卡夫卡
- python-3.x - 在 Python 中迭代图像并转换为表 OCR 的 base64 格式
- r - blogdown::serve_site() 无法渲染 Rmd 文件
- vowpalwabbit - 当我们在 vw-hyperopt 中指定“--algorithms=sgd”时,它是否以自适应、标准化和不变的更新运行?
- reactjs - 在 ReactJs 中添加查询参数时返回按钮不起作用
- css - 删除带有对角线边缘的 CSS 边框
- c# - 如何在 C# 中处理两个 JSON 响应
- javascript - 使用 forwardRef 创建的 React 组件上的类型错误