Python 在Pygame中检查精灵冲突列表时发生UnboundLocalError

Python 在Pygame中检查精灵冲突列表时发生UnboundLocalError,python,pygame,Python,Pygame,我试图在pygame中编写一个函数,用于处理基于分片的rpg中的冲突 def player_collisions(sprite, group, dir): hits_walls = pg.sprite.spritecollide(sprite, group[0], False, collide_hit_rect) hits_obj = pg.sprite.spritecollide(sprite, group[1], False, collide_hit_rect) in

我试图在pygame中编写一个函数,用于处理基于分片的rpg中的冲突

def player_collisions(sprite, group, dir):
    hits_walls = pg.sprite.spritecollide(sprite, group[0], False, collide_hit_rect)
    hits_obj = pg.sprite.spritecollide(sprite, group[1], False, collide_hit_rect)
    inrect = pg.sprite.spritecollide(sprite, group[2], False, collide_hit_rect)
    try:
        if inrect:
            hits_ang = pg.sprite.spritecollide(sprite, group[2], False, pg.sprite.collide_mask)
    except: pass

    if dir == "x":
        if hits_walls:
            sprite.vel.x = 0
            if hits_walls[0].rect.centerx > sprite.hit_rect.centerx:
                sprite.pos.x = hits_walls[0].rect.left - sprite.hit_rect.width / 2
            if hits_walls[0].rect.centerx < sprite.hit_rect.centerx:
                sprite.pos.x = hits_walls[0].rect.right + sprite.hit_rect.width / 2
            sprite.hit_rect.centerx = sprite.pos.x

        if hits_obj:
            sprite.vel.x = 0
            if hits_obj[0].rect.centerx > sprite.hit_rect.centerx:
                sprite.pos.x = hits_obj[0].rect.left - sprite.hit_rect.width / 2
            if hits_obj[0].rect.centerx < sprite.hit_rect.centerx:
                sprite.pos.x = hits_obj[0].rect.right + sprite.hit_rect.width / 2
            sprite.hit_rect.centerx = sprite.pos.x

                
    if dir == "y":
        if hits_walls:
            sprite.vel.y = 0
            if hits_walls[0].rect.centery > sprite.hit_rect.centery:
                sprite.pos.y = hits_walls[0].rect.top - sprite.hit_rect.height / 2
            if hits_walls[0].rect.centery < sprite.hit_rect.centery:
                sprite.pos.y = hits_walls[0].rect.bottom + sprite.hit_rect.height / 2
            sprite.hit_rect.centery = sprite.pos.y

        if hits_obj:
            sprite.vel.y = 0
            if hits_obj[0].rect.centery > sprite.hit_rect.centery:
                sprite.pos.y = hits_obj[0].rect.top - sprite.hit_rect.height / 2
            if hits_obj[0].rect.centery < sprite.hit_rect.centery:
                sprite.pos.y = hits_obj[0].rect.bottom + sprite.hit_rect.height / 2
            sprite.hit_rect.centery = sprite.pos.y

    if hits_ang:
        sprite.slide_allow = True
        if hits_walls or hits_obj:
            sprite.slide_allow = False
def player_冲突(精灵、组、目录):
hits_walls=pg.sprite.spritecollide(sprite,组[0],False,collide_hit_rect)
hits_obj=pg.sprite.spritecollide(sprite,组[1],False,collide_hit_rect)
inrect=pg.sprite.spritecollide(sprite,组[2],False,collide\u hit\u rect)
尝试:
如果不正确:
hits_ang=pg.sprite.spritecollide(sprite,组[2],False,pg.sprite.collide_掩码)
除了:通过
如果dir==“x”:
如果击中墙壁:
sprite.vel.x=0
如果击中墙壁[0]。rect.centerx>sprite.hit_rect.centerx:
sprite.pos.x=hits\u walls[0].rect.left-sprite.hit\u rect.width/2
如果击中墙壁[0]。rect.centerxsprite.hit\u rect.centerx:
sprite.pos.x=hits_obj[0].rect.left-sprite.hit_rect.width/2
如果命中对象[0]。rect.centerxsprite.hit_rect.centery:
sprite.pos.y=hits\u walls[0].rect.top-sprite.hit\u rect.height/2
如果击中墙壁[0]。rect.centerysprite.hit\u rect.centery:
sprite.pos.y=hits_obj[0].rect.top-sprite.hit_rect.height/2
如果命中对象[0]。rect.centery
点击墙壁
点击物体
存储玩家碰撞的墙壁和物体
hits_ang
存储与倾斜墙的像素完美碰撞,并且仅当播放器位于从一点到另一点包围墙的矩形内时才加载

但是,每当我的程序运行并到达
if hits\u ang:
行时,我都会不断地将此错误标记出来

UnboundLocalError:赋值前引用的局部变量“hits_ang”


我所需要的只是让程序检查列表是否存在,所以我不明白为什么当程序检查其他3个冲突组时,这一行被拒绝。

变量
hits\u ang
并不总是随着执行的进行而定义。它仅在顶部定义:

inrect = pg.sprite.spritecollide(sprite, group[2], False, collide_hit_rect)
try:
    if inrect:
        hits_ang = pg.sprite.spritecollide(sprite, group[2], False, pg.sprite.collide_mask)
except: 
    pass
因此,如果rect中的
inrect
为False、None或zero,
命中的对象将永远不存在

解决此问题的一个简单方法是将
hits\u ang
默认为
False

try:
    hits_ang = False
    if inrect:
        hits_ang = pg.sprite.spritecollide(sprite, group[2], False, pg.sprite.collide_mask)
except: 
    pass