所以我有一个错误,一直说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))
# [...]