导入类时未定义错误全局变量 [英] Error Global Variable not defined when importing class
问题描述
我正在尝试实现一个移动系统,让玩家向点击位置移动.但是我遇到了一些关于移动方法参数的问题.
I am trying to implement a movement system where the player move's towards the click position. But I have been running into some problems with the arguments of the movement method.
移动方法目前需要将所有变量作为参数:
The movement method currently needs to take all the variables as arguments:
此代码有效:
def move(self,event,mouse_pos, screen, background):
if event.type == MOUSEBUTTONDOWN:
if mouse_pos[1] > self.pos[1]:
screen.blit(background, self.pos, self.pos) #erases players by bliting bg
self.speed = 1
self.move_south() #moves player
if mouse_pos[0] > self.pos[0]:
screen.blit(background, self.pos, self.pos) #erases players by bliting bg
self.speed = 1
self.move_east() #moves player
screen.blit(self.image, self.pos) #draws player
此代码不起作用:
def move(self,event):
if event.type == MOUSEBUTTONDOWN:
if mouse_pos[1] > self.pos[1]:
screen.blit(background, self.pos, self.pos) #erases players by bliting bg
self.speed = 1
self.move_south() #moves player
if mouse_pos[0] > self.pos[0]:
screen.blit(background, self.pos, self.pos) #erases players by bliting bg
self.speed = 1
self.move_east() #moves player
screen.blit(self.image, self.pos) #draws player
全班代码:
import pygame, sys
from pygame.locals import *
class GameObject:
def __init__(self, image, height, speed):
self.speed = speed
self.image = image
self.pos = image.get_rect().move(0, height) #initial placement
def move_south(self):
self.pos = self.pos.move(0, self.speed)
if self.pos.right > 600:
self.pos.left = 0
def move_east(self):
self.pos = self.pos.move(self.speed , 0)
if self.pos.right > 600:
self.pos.left = 0
def move(self,event,mouse_pos, screen, background):
if event.type == MOUSEBUTTONDOWN:
if mouse_pos[1] > self.pos[1]:
screen.blit(background, self.pos, self.pos) #erases players by bliting bg
self.speed = 1
self.move_south() #moves player
if mouse_pos[0] > self.pos[0]:
screen.blit(background, self.pos, self.pos) #erases players by bliting bg
self.speed = 1
self.move_east() #moves player
screen.blit(self.image, self.pos) #draws player
主脚本代码:
import pygame, sys
from pygame.locals import *
from classes import *
screen = pygame.display.set_mode((640, 480))
#Importing Chars
player = pygame.image.load('green_hunter_small.png').convert()
#player.set_alpha(100) #makes whole player transparent
player.set_colorkey((0,0,0)) #sets background colour to transparent
ennemi = pygame.image.load('red_hunter_small.png').convert()
ennemi.set_colorkey((0,0,0))
background = pygame.image.load('grass_map_640x640.png').convert()
screen.blit(background, (0, 0))
objects = []
mouse_pos = (320, 240)
objects.append(GameObject(player, 80, 0))
for x in range(2): #create 2 objects
o = GameObject(ennemi, x*40, 0)
objects.append(o)
while True:
for event in pygame.event.get(): #setting up quit
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == MOUSEBUTTONDOWN :
mouse_pos = pygame.mouse.get_pos()
print mouse_pos
for o in objects:
screen.blit(background, o.pos, o.pos) #erases players by bliting bg
for o in objects:
o.move(event,mouse_pos,screen,background)
pygame.display.update()
pygame.time.delay(100)
我有两个问题:1) 如何减少我的方法的参数数量?2) 如何让我的播放器不断向点击位置移动,而不是每次点击一次?
I've got two questions : 1) how to reduce the number of arguments for my method ? 2) how to get my player to move continually towards the click position rather than once at every click ?
推荐答案
你的问题是 python 中的全局"变量实际上并不是全局的,而是定义它们的模块的局部变量.因此,你不能引用classes.py
文件中的 main.py
文件中的全局变量.
Your problem is that "global" variables in python are not actually global, but rather local to the module in which they were defined in. Thus, you cannot reference globals decalred in the main.py
file in the classes.py
file.
有三种可能的解决方案:
There are three possible solutions:
(不推荐)将
screen
和background
的声明移动到classes.py
文件中,这会使它们看起来像不合适.
(not recomended) Move the declarations of
screen
andbackground
to theclasses.py
file, which would put them seemingly out of place.
(也不推荐)在 classes.py
文件中添加一个 from main import screen, background
,这会产生循环导入问题,迫使 main.py
模块执行它的 from classes import *
after 定义 screen
和 background
(also not recommended) Add a from main import screen, background
to the classes.py
file, which creates circular import problems, forcing the main.py
module to do its from classes import *
after defining screen
and background
mouse_pos
变量是完全没有必要和误用的:
The mouse_pos
variable is totally unnecessary and misused:
- 您可以直接在
classes.py
文件中使用pygame.mouse.get_pos()
,但是 - 使用
pygame.mouse.get_pos()
本身是多余的,因为pygame.MOUSEBUTTONDOWN
事件有一个pos
属性指向触发事件时的鼠标.
- You could just use
pygame.mouse.get_pos()
directly in theclasses.py
file, but - Using
pygame.mouse.get_pos()
itself is extranious becausepygame.MOUSEBUTTONDOWN
events have apos
attribute pointing to the position of the mouse when the event was fired.
这篇关于导入类时未定义错误全局变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!