我在哪里为pygame中的精灵添加键盘控件?

0 投票
1 回答
1287 浏览
提问于 2025-04-17 10:18

当我尝试运行这个简单的游戏时,它显示:

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

可以看看 这个,举个例子

撰写回答