我在哪里为pygame中的精灵添加键盘控件?
当我尝试运行这个简单的游戏时,它显示:
screen.blit(plumbers,(50 + M ,337 + N))
UnboundLocalError: local variable 'M' referenced before assignment
这段信息来自下面的代码:
import pygame
import os, sys
import itertools
import pygame
from pygame.sprite import Sprite
cloud_background = pygame.image.load('clouds.bmp')
brick_tile = pygame.image.load('brick_tile.png')
plumbers = pygame.image.load('Mario_sideways_sprite_2xL.png')
pink = (255, 64, 64)
w = 640
h = 480
screen = pygame.display.set_mode((w, h))
running = 1
def setup_background():
screen.fill((pink))
screen.blit(cloud_background,(0,0))
brick_width, brick_height = brick_tile.get_width(), brick_tile.get_height()
for x,y in itertools.product(range(0,640,brick_width),
range(390,480,brick_height)):
# print(x,y)
screen.blit(brick_tile, (x,y))
def show_sprites():
screen.blit(plumbers,(50 + M ,337 + N))
if event.key == pygame.K_UP:
M = 1
N = 0
while running:
setup_background()
show_sprites()
move()
event = pygame.event.poll()
if event.type == pygame.QUIT: sys.exit()
但是当我在“screen.blit”上面添加一个变量后,它变成了这样:
def show_sprites():
if event.key == pygame.K_UP:
M = 1
N = 0
screen.blit(plumbers,(50 + M ,337 + N))
我得到了这个错误:
Traceback (most recent call last):
File "C:\Users\Enrique\Dropbox\GAMEZ_PYGAME\gamez.py", line 36, in <module>
show_sprites()
File "C:\Users\Enrique\Dropbox\GAMEZ_PYGAME\gamez.py", line 28, in show_sprites
if event.key == pygame.K_UP:
NameError: global name 'event' is not defined
我需要添加或更改什么才能让这些简单的控制功能正常工作?
1 个回答
1
这意味着你遇到了两个问题。Python 发现第一个问题后就停止了,并抛出了一个异常。
在:
def show_sprites():
screen.blit(plumbers,(50 + M ,337 + N))
.......
M 和 N 在被调用时仍然不存在。
比如你可以试试:
def show_sprites():
print M, N
screen.blit(plumbers,(50 + M ,337 + N))
.......
在
def show_sprites():
if event.key == pygame.K_UP:
这两个 event
都没有被定义。
你应该查一下关于函数参数和局部变量的教程。
你的函数应该像这样(举个例子):
def show_sprites(M, N, event):
或者更有可能是:
def show_sprites(event):
if event.key == pygame.K_UP:
M = 1
N = 0
else:
M = 0 # ? up to you
N = 0 # ?
screen.blit(plumbers,(50 + M ,337 + N))
用:
while running:
setup_background()
event = pygame.event.poll()
if event.type == pygame.QUIT: sys.exit()
show_sprites(event)
move()
最后,这段代码会把各种事件发送到你的函数,所以你需要对它们进行筛选:
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
show_sprites(event)
move()
可以看看 这个,举个例子