导入类时未定义错误全局变量

索拉德

我正在尝试建立一种运动系统,使玩家朝点击位置移动。但是我一直在遇到与移动方法的参数有关的问题。

目前,移动方法需要将所有变量用作参数:

此代码有效:

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)如何让播放器持续朝点击位置移动,而不是每次点击都一次?

ppppery

您的问题是python中的“全局”变量实际上不是全局变量,而是在定义它们的模块所在的局部变量。因此,您无法引用main.py文件中classes.py文件中标出的全局变量

有三种可能的解决方案:

  1. (不推荐)移动的声明screen,并backgroundclasses.py文件中,这将使他们似乎格格不入。

  2. (也不建议)将a添加from main import screen, backgroundclasses.py文件中,这会产生循环导入问题,从而迫使main.py模块from classes import * 定义screenbackground

  3. 添加第三个display.pyscreen.py文件,其中定义screenbackground变量,并从main.py导入classes.py

mouse_pos变量完全没有必要并且被滥用:

  1. 您可以pygame.mouse.get_pos()直接在classes.py文件中使用,但是
  2. 使用事件pygame.mouse.get_pos()本身是多余的,因为pygame.MOUSEBUTTONDOWN事件具有pos触发事件时鼠标位置的属性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章