Python blit(textR,name)UnboundLocalError:局部变量';名称';分配前参考

Python blit(textR,name)UnboundLocalError:局部变量';名称';分配前参考,python,pygame,Python,Pygame,所以我有一个错误,一直说名称在赋值之前被引用,但我不知道赋值是什么,我试着让textR和name变位,我试着把它所属的代码放在上面和下面,但它仍然不起作用,我试着把它从主循环中去掉 我的问题所在以及它所属的代码 window.blit(textR,name) for power in powers: if player1.rect.colliderect(power.rect): power1.draw(player1.x,player1.y)

所以我有一个错误,一直说名称在赋值之前被引用,但我不知道赋值是什么,我试着让textR和name变位,我试着把它所属的代码放在上面和下面,但它仍然不起作用,我试着把它从主循环中去掉

我的问题所在以及它所属的代码

window.blit(textR,name)

    for power in powers:
        if player1.rect.colliderect(power.rect):
            power1.draw(player1.x,player1.y)
            if Time < 30:
                Time += 1

                name = font.render("Timer = "+str(Time),True,(255,255,255))
                textR.center = ((100,80))
                player1.speed += 2
            else:
                power1.x  =9999
window.blit(文本,名称)
权力中的权力:
如果player1.rect.collizerect(power.rect):
power1.draw(player1.x,player1.y)
如果时间<30:
时间+=1
name=font.render(“Timer=“+str(Time),True,(255255))
textR.center=((100,80))
player1.speed+=2
其他:
power1.x=9999
我的完整代码

import pygame
pygame.init()

#screen
window = pygame.display.set_mode((500,500))

#set name
pygame.display.set_caption("Noobs First Game")

class player:
    def __init__(self,x,y,width,height,color):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.color = color
        self.speed = 6
        self.isJump = False
        self.JumpCount = 10
        self.fall = 0
        self.rect = pygame.Rect(x,y,width,height)
        self.ss1 = pygame.image.load("Me1.png")
        self.ss1 = pygame.transform.scale(self.ss1,(self.ss1.get_width()//8,self.ss1.get_height()//8))
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window,self.color,self.rect)

        player_rect = self.ss1.get_rect(center = self.rect.center)  # the player_image << put your image like self.image
        player_rect.centerx += +2 # 10 is just an example
        player_rect.centery += -6# 15 is just an example
        window.blit(self.ss1, player_rect) # change the player_image to your image like self.image


class platform:
    def __init__(self,x,y,width,height,color):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.color = color
        self.rect = pygame.Rect(x,y,width,height)
        self.ss1 = pygame.image.load("Dirt.png")
        self.ss1 = pygame.transform.scale(self.ss1,(self.ss1.get_width()//7,self.ss1.get_height()//7))
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window,self.color,self.rect)

        platform_rect = self.ss1.get_rect(center = self.rect.center)  # the player_image << put your image like self.image
        platform_rect.centerx += +2 # 10 is just an example
        platform_rect.centery += -3# 15 is just an example
        window.blit(self.ss1, platform_rect)

class wall:
    def __init__(self,x,y,width,height,color):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.color = color
        self.rect = pygame.Rect(x,y,width,height)
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window,self.color,self.rect)

    


class spike:
    def __init__(self,x,y,width,height,color):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.color = color
        self.rect = pygame.Rect(x,y,width,height)
        self.ss1 = pygame.image.load("Spike.png")
        self.ss1 = pygame.transform.scale(self.ss1,(self.ss1.get_width()//2,self.ss1.get_height()//3))
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window,self.color,self.rect)

        spike_rect = self.ss1.get_rect(center = self.rect.center)  # the player_image << put your image like self.image
        spike_rect.centerx += +10 # 10 is just an example
        spike_rect.centery += -16# 15 is just an example
        window.blit(self.ss1, spike_rect)


class ice:
    def __init__(self,x,y,width,height,color):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.color = color
        self.speed = 7
        self.ss1 = pygame.image.load("ice.png")
        self.rect = pygame.Rect(x,y,width,height)
        self.ss1 = pygame.transform.scale(self.ss1,(self.ss1.get_width()//1,self.ss1.get_height()//1))
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window,self.color,self.rect)
       

        
        fall_rect = self.ss1.get_rect(center = self.rect.center)
        fall_rect.centery += 2
        fall_rect.centerx += 1
        window.blit(self.ss1, fall_rect)


class power:
    def __init__(self,x,y,width,height,color):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.color = color
        self.ss1 = pygame.image.load("power.png")
        self.rect = pygame.Rect(x,y,width,height)
        self.ss1 = pygame.transform.scale(self.ss1,(self.ss1.get_width()//10,self.ss1.get_height()//10))
    def draw(self,drawx,drawy):
        self.rect.topleft = (drawx,drawy)
        pygame.draw.rect(window,self.color,self.rect)

        power_rect = self.ss1.get_rect(center = self.rect.center)
        power_rect.centery -= 1
        power_rect.centerx -=1
        window.blit(self.ss1,power_rect)

        



class coin:
    def __init__(self,x,y,width,height,color):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.color = color
        self.ss1 = pygame.image.load("Coin2.png")
        self.rect = pygame.Rect(x,y,width,height)
        self.ss1 = pygame.transform.scale(self.ss1,(self.ss1.get_width()//10,self.ss1.get_height()//10))
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window,self.color,self.rect)

        coin_rect  = self.ss1.get_rect(center = self.rect.center)
        coin_rect.centery -= 1
        coin_rect.centerx -= 1
        window.blit(self.ss1,coin_rect)


class recta:
    def __init__(self,x,y,width,height,color):
        self.x = x
        self.y =y
        self.width = width
        self.height = height
        self.color = color
        self.rect = pygame.Rect(x,y,width,height)
    def draw(self):
        self.rect.topleft = (self.x, self.y)

class pike:
    def __init__(self,x,y,width,height,color):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.color = color
        self.rect = pygame.Rect(x,y,width,height)
        self.ss1 = pygame.image.load("Spike2.png")
        self.ss1 = pygame.transform.scale(self.ss1,(self.ss1.get_width()//2,self.ss1.get_height()//3))
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window,self.color,self.rect)

        pike_rect = self.ss1.get_rect(center = self.rect.center)  # the player_image << put your image lik self.image
        pike_rect.centerx += +10 # 10 is just an example
        pike_rect.centery += -12# 15 is just an example
        window.blit(self.ss1, pike_rect)
        




#draw player
white = (255,255,255)
green = (0,200,0) 
player1 = player(0,400,40,40,white)

#PLATFORM
platform1 = platform(0,0,40000,30,green)
platform2 = platform(0,470,40000,30,green)

#WALLS
wall1 = wall(0,0,40000,30,green)
wall2 = wall(0,470,40000,30,green)

#SPIKES
spike1 = spike(400,436,15,35,white)
spike2 = spike(200,436,15,35,white)

#ICE
ice1 = ice(270,70,25,95,white)
ice2 = ice(960,70,25,95,white)

#SPEED
power1 = power(560,200,35,50,white)

#COINS
coin1 = coin(100,200,35,50,white)
coin2 = coin(100,200,35,50,white)

#RECTA
recta1 = recta(0,0,400,600,white)
recta2 = recta(700,0,400,600,white)
recta3 = recta(13000,0,400,600,white)

#SECOND SPIKES
pike1 = pike(799,799,1,1,white)
pike2 = pike(799,799,1,1,white)

platforms = [platform1,platform2]
walls = [wall1,wall2]
spikes = [spike1,spike2]
ices = [ice1,ice2]
powers = [power1]
coins = [coin1,coin2]
rectas = [recta1,recta2,recta3]
pikes = [pike1,pike2]


platformGroup = pygame.sprite.Group
level = [
"                                                                                                                                                                                                             ",
"                                                                                                                                                                                                                                                                               ",
"                                                                                                                                                                                                                                                               ",
"                                                                                                                                                                                                                            ",
"                                                                                                                                                                cccc                                                                                                                 ",
"                                                                                                                                                                c                                                                                                                     ",
"                                                                                                               y   y       y   y                                c                                                                                                               ",
"                                                                                  cc                             c  c  c  c  c                                  cccc                                                                                                           ",                        
"                                                    c  c  c  c                      c                                                                           c                                     y  y  y                                                                    ",
"     y                       p        y           p  p  p  p  p                ccccccc                         p  p  p  p  p  p  p          p   y  y            c               p   y   y   y                                                                   p   p   p   p                ",
"               c  c       p      c    c        p                   yyyyyyy          c      yy   yyyy        p                            p                      cccc          p                                   yyyyyy    yyyyyyy                          p                 p                                ",
"             s  s  s  c p   ssss  c s  s     p    s s s s s s s      c c c        cc     s c  sc  c  s   p      s  s  s  s  s  s  s   p   s s    s   s   s  s  s  s  s  s  p           s   s    s     s  s  s             s          s                    p                       ps s s       ",] 

for iy, row in enumerate(level):
    for ix, col in enumerate(row):
        if col == "p":
            new_platforms = platform(ix*57, iy*41.2, 50,20,(255, 255, 255))
            platforms.append(new_platforms)
for iy, row in enumerate(level):
    for ix, col in enumerate(row):
        if col == "s":
            new_spikes = spike(ix*57, iy*39.7, 15, 35,(255, 255, 255))
            spikes.append(new_spikes)
for iy, row in enumerate(level):
    for ix, col in enumerate(row):
        if col == "c":
            new_coins = coin(ix*57, iy*39.7, 15, 35,(255, 255, 255))
            coins.append(new_coins)
for iy, row in enumerate(level):
    for ix, col in enumerate(row):            
        if col == "y":
            new_pikes = pike(ix*57, iy*39.7, 15, 30,(255, 255, 255))
            pikes.append(new_pikes)



    
            
#redraw
def redrawwindow():
    window.fill((0,0,0))
    

#draw olayer
    player1.draw()
    for platform in platforms:
        platform.draw()
    for wall in walls:
        wall.draw()
    for spike in spikes:
        spike.draw()
    for ice in ices:
        ice.draw()
    for power in powers:
        power.draw(560,200)
    for coin in coins:
        coin.draw()
    for recta in rectas:
        recta.draw()
    for pike in pikes:
        pike.draw()




    #TEXT
    window.blit(text,textRect)
            #TEXT
    window.blit(textR,name)

    for power in powers:
        if player1.rect.colliderect(power.rect):
            power1.draw(player1.x,player1.y)
            if Time < 30:
                Time += 1

                name = font.render("Timer = "+str(Time),True,(255,255,255))
                textR.center = ((100,80))
                player1.speed += 2
            else:
                power1.x  =9999


fps = (30)
clock = pygame.time.Clock()


#THE FONT AND NAMES
font  = pygame.font.Font("freesansbold.ttf",30)
score = 0
text = font.render("Coins = "+str(score),True,(255,255,255))
textRect = text.get_rect()
textRect.center = ((100,40))


#THE FONT AND NAMES
font  = pygame.font.Font("freesansbold.ttf",30)
Time = 0
name = font.render("Timer = "+str(Time),True,(255,255,255))
textR = name.get_rect()
textR.center = ((100,80))



#MAIN LOOP
run = True
while run:
    clock.tick(fps)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False









        
    #ADDING TO COIN +1
    for coin in coins:
        for one in range(len(coins)-1,-1,-1):
            if player1.rect.colliderect(coins[one].rect):
                del coins[one]
                score += 1
                text = font.render("Coins = "+str(score),True,(255,255,255))
                textRect.center = ((100,40))

    

    
    #moving keys
    keys = pygame.key.get_pressed()


    player1.x += player1.speed

    #WHAT MAKES ICEBURG FALL
    if player1.rect.colliderect(recta1.rect):
        ice1.y += 5

    if player1.rect.colliderect(recta2.rect):
        ice2.y += 6


        


    
    #WHAT MAKES EVEYTHING NOT FOLLOW THE PLAYER    
    if player1.x > 250:
        player1.x -= player1.speed
        for platform in platforms:
            platform.x -= player1.speed
        for spike in spikes:
            spike.x -= player1.speed
        for ice in ices:
            ice.x -= player1.speed
        for recta in rectas:
            recta.x -= player1.speed
        for pike in pikes:
            pike.x -= player1.speed
        for coin in coins:
            coin.x -= player1.speed
        for power in powers:
            power.x -= player1.speed





    for spike in spikes:
        if player1.rect.colliderect(spike.rect):
            print("COLLIDE")

    for pike in pikes:
        if player1.rect.colliderect(pike.rect):
            print("PIKEPIEK")


     #FALLING   
    if not player1.isJump:
        player1.y += player1.fall
        player1.fall += 1
        player1.isJump = False



            
        #COLLIDE WITH PLATFORM
        collide = False
        for platform in platforms:
            if player1.rect.colliderect(platform.rect):
                collide = True
                player1.isJump = False
                player1.y = platform.rect.top - player1.height + 1
                if player1.rect.right > platform.rect.left and player1.rect.left < platform.rect.left - player1.width:
                    player1.x = platform.rect.left - player1.width
                if player1.rect.left < platform.rect.right and player1.rect.right > platform.rect.right + player1.width:
                    player1.x = platform.rect.right
                              

            #COLLIDE
            if player1.rect.bottom >= 500:
                collide = True
                player1.isJump = False
                player1.JumpCount = 8
                player1.y = 500 - player1.height

                
        #KEY FOR SPACEBAR
        if collide:
            if keys[pygame.K_SPACE]:
                player1.isJump = True
            player1.fall = 0


    #JUMP COUNT
    else:
        if player1.JumpCount >= -10:
            player1.y -= (player1.JumpCount*abs(player1.JumpCount))*0.2
            player1.JumpCount -= 1
        else:
            player1.JumpCount = 10
            player1.isJump = False
        


#END OF GAME            
    redrawwindow()
    pygame.display.update()
pygame.quit()


导入pygame
pygame.init()
#屏风
window=pygame.display.set_模式((500500))
#设置名称
pygame.display.set_标题(“Noobs第一场游戏”)
职业球员:
定义初始值(自、x、y、宽度、高度、颜色):
self.x=x
self.y=y
self.width=宽度
自我高度=高度
self.color=颜色
自身速度=6
self.isJump=False
self.JumpCount=10
self.fall=0
self.rect=pygame.rect(x,y,宽度,高度)
self.ss1=pygame.image.load(“Me1.png”)
self.ss1=pygame.transform.scale(self.ss1,(self.ss1.get_-width()//8,self.ss1.get_-height()//8))
def牵引(自):
self.rect.topleft=(self.x,self.y)
pygame.draw.rect(窗口,self.color,self.rect)
player_rect=self.ss1.get_rect(center=self.rect.center)#player_image=500:
碰撞=真
player1.isJump=False
player1.JumpCount=8
player1.y=500-player1.0高度
#空格键
如果发生碰撞:
如果键[pygame.K_SPACE]:
player1.isJump=True
player1.fall=0
#跳转计数
其他:
如果player1.JumpCount>=-10:
player1.y-=(player1.JumpCount*abs(player1.JumpCount))*0.2
player1.JumpCount-=1
其他:
player1.JumpCount=10
player1.isJump=False
#游戏结束
重画窗口()
pygame.display.update()
pygame.quit()

您尝试读取函数
重画窗口中的全局变量
name
。由于变量在同一函数中被赋值,因此该变量被解释为局部变量。
使用将变量解释为全局变量:

def redrawwindow():
全局名称
[...]
window.blit(文本,名称)
权力中的权力:
如果player1.rect.collizerect(power.rect):
power1.draw(player1.x,player1.y)
如果时间<30:
时间+=1
name=font.render(“Timer=“+str(Time),True,(255255))
# [...]

您的
重画窗口
包含对
名称
的赋值,这使其成为整个函数中的局部变量(甚至在赋值点之前),而不是引用全局变量
名称
。在函数顶部放置一个
global name
语句,使对
name
的所有引用实际上都引用同一个变量。window.blit(textR,name)TypeError:参数1必须是pygame.Surface,而不是pygame。Rect@Windowman我刚从你的问题中复制了代码。