window.blit(textR,name) UnboundLocalError:在赋值前引用'name'局部变量



所以我有一个错误,一直说name在赋值之前被引用,但我不知道赋值是什么,我试图让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

MY完整代码

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()

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

def redrawwindow():
global 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))
# [...]