为什么它是本地的,因为我使用的是全局的?

问题描述

import pygame,os,random,time # Packages that I will use
from spritesheet import SpriteSheet

pygame.init() # Little pygame function to initiate all the modules

WHITE = (255,255,255)

# Window basic information
WIDTH,HEIGHT = 1280,720
win = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption("The zombies are COMING!!")

# Sprites
size = (70,70)

environment = pygame.transform.scale(pygame.image.load(os.path.join('Assets','Graveyard.png')),(WIDTH,HEIGHT))
heart = pygame.transform.scale(pygame.image.load(os.path.join('Assets','Heart.png')),(size))
bullet = pygame.transform.scale(pygame.image.load(os.path.join('Assets','Bullet.png')),(size))
sword = pygame.transform.scale(pygame.image.load(os.path.join('Assets','Sword.png')),(size))
rocketLauncher = pygame.transform.scale(pygame.image.load(os.path.join('Assets','Rocket Launcher.png')),(size))
shotgun = pygame.transform.scale(pygame.image.load(os.path.join('Assets','Shotgun.png')),(size))

# Sprite Sheet

spritesheet = SpriteSheet(r'Assets/Ninja Idle.png')
sprite1 = spritesheet.get_sprite(0,16,16)
sprite1 = pygame.transform.scale((sprite1),(100,100))
sprite2 = spritesheet.get_sprite(16,16)
sprite2 = pygame.transform.scale((sprite2),100))
spriteIdle = [sprite1,sprite2]

index = 0

class Player:
    def __init__(self,x,y,lives,ammunition):
        self.lives = lives
        self.ammunition = ammunition
        self.x = x
        self.y = y
    
    def drawPlayer(self,win):
        #pygame.draw.rect(win,(255,0),(self.x,self.y,50,50))
        win.blit(spriteIdle[index])

def main(): # Main loop
    run = True
    FPS = 60
    clock = pygame.time.Clock()
    wave = 1
    lives = 5
    ammunition = 1
    veLocity = 5
    player = Player(WIDTH/2,HEIGHT/2,ammunition)

    def windoWrenderer (): # Func to update the screen according the events
        win.blit(environment,(0,0))
        main_font = pygame.font.SysFont("comicsans",50)
        lives_label = main_font.render(f"{lives}",1,(WHITE))
        wave_label = main_font.render(f"Wave: {wave}",(WHITE))
        ammunition_label = main_font.render(f"{ammunition}",(WHITE))
        player.drawPlayer(win)
        win.blit(heart,(WIDTH - 150,0))
        win.blit(bullet,70))
        win.blit(lives_label,(WIDTH - 50,20))
        win.blit(wave_label,(WIDTH/2-70,20))
        win.blit(ammunition_label,95))
        pygame.display.update()

    while run:
        clock.tick(240)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
        
        key = pygame.key.get_pressed()

        if key[pygame.K_a] and player.x > 0:
            player.x -= veLocity
        if key[pygame.K_d] and player.x + veLocity < WIDTH - 49:
            player.x += veLocity
        if key[pygame.K_w] and player.y > 0:
            player.y -= veLocity
        if key[pygame.K_s] and player.y + veLocity < HEIGHT - 49:
            player.y += veLocity
        else:
            index = (index + 1) % len(spriteIdle)
        windoWrenderer()
        
main()

如果您尝试运行该代码,它会回答说在取消分配之前引用了一个局部变量。但是“索引”变量是全局形式的。

我也尝试过非本地形式,但是……也没有结果。

我还尝试将索引变量移动到“main()”函数。但如果我尝试这样做,我对角色本身就没有太多控制权。

如果我删除 global,也会发生同样的错误

具体来说,错误发生在第 86 行。索引变量在第 32 行。

错误信息是“UnboundLocalError: local variable 'index' referenced before assignment”

我正在使用 pygame,但您无需为此担心太多。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)