2012-01-15 38 views
0

当我尝试运行这个简单的游戏。它说:我在哪里添加键盘控件到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

这意味着你有两个问题。 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() 

检查this例如

+0

我想你的建议,我得到了错误:回溯(最近通话最后一个): 文件 “C:\用户\恩里克\ Dropbox的\ GAMEZ_PYGAME \ gamez.py”,行41,在 show_sprites(事件) 文件 “C:\用户\恩里克\收存箱\ GAMEZ_PYGAME \ gamez.py”,第28行,在show_sprites 如果event.key == pygame.K_UP: AttributeError的: '事件'对象有没有属性“键” @joaquin – enrique2334 2012-01-15 17:22:36

+0

这是什么意思是“事件对象有没有属性关键@joaquin – enrique2334 2012-01-15 17:29:43

+0

@ enrique2334看版它 – joaquin 2012-01-15 18:45:21