0

所以我正在尝试学习使用 pygame 模块和来自 javascript 背景的 python 制作游戏,我希望能够使用多个脚本构建一个程序。所以我尝试加载另一个脚本并使用它的一个函数以及在该脚本中声明的变量。我想要做的是从另一个脚本调用“更新”功能,但使用在这个脚本中声明的变量。有什么建议么?

编辑:好的,所以我显然没有很好地澄清我的问题。导入脚本不是我的问题,我可以让它很好地导入。我遇到的麻烦是,在我导入它之后,我需要能够从使用此脚本中的变量的主脚本中调用此脚本中的一个函数。

现在发生的事情是我在这个脚本中调用了更新函数,它给了我一个错误,说变量“animTimer”在它被声明之前被调用了。这就是我需要解决的问题。

import pygame, sys, time, random
from pygame.locals import *

# Create animation class
class animation2D:
    "a class for creating animations"
    frames = []
    speed = 3
    cFrame = 0

player = pygame.Rect(300, 100, 40, 40)
playerImg1 = pygame.image.load('player1.png')
playerImgS = pygame.transform.scale(playerImg1, (40,40))
playerImg2 = pygame.image.load('player2.png')
playerImg3 = pygame.image.load('player3.png')
playerImg4 = pygame.image.load('player4.png')
playerImg5 = pygame.image.load('player5.png')
playerImg6 = pygame.image.load('player6.png')
playerAnim = animation2D
playerAnim.frames = [playerImg1, playerImg2, playerImg3, playerImg4, playerImg5, playerImg6]
animTimer = 0
print(animTimer)

def Update():
     # Draw Player
    if animTimer < playerAnim.speed:
        animTimer += 1
    else:
        animTimer = 0
        playerImgS = pygame.transform.scale((playerAnim.frames[playerAnim.cFrame]), (40,40))
        if playerAnim.cFrame < len(playerAnim.frames)-1:
            playerAnim.cFrame += 1
        else:
            playerAnim.cFrame = 0

    windowSurface.blit(playerImgS, player)

import pygame, sys, time, random
from pygame.locals import *
import animationScript

# Set up pygame
pygame.init()
mainClock = pygame.time.Clock()

# Set up window
screenW = 400
screenH = 400
windowSurface = pygame.display.set_mode((screenW, screenH), 0, 32)
pygame.display.set_caption('Sprites and sound')


# Set up the colors
black = (0,0,200)

# Set up music
pygame.mixer.music.load('testmidi.mid')
#pygame.mixer.music.play(-1,0.0)





# Run the game loop
while True:
    # Check for the QUIT event
    for event in pygame.event.get():
        if event.type == QUIT:
                pygame.quit()
                sys.exit()
        if event.type == KEYUP:
            if event.key == K_ESCAPE:
                pygame.quit()
                sys.exit()

    # Draw the background onto the surface
    windowSurface.fill(black)

    # Draw Player
    animationScript.Update()



    # Draw the window onto the screen
    pygame.display.update()
    mainClock.tick(40)
4

2 回答 2

2

编辑:在我看来,好像您正在尝试做这样的事情:

>>> a = 4
>>> def inca():
...     a += 1
... 
>>> inca()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in inca
UnboundLocalError: local variable 'a' referenced before assignment

当你应该传递参数时,像这样:

>>> def inc(n):
...     return n + 1
... 
>>> a = 4
>>> a = inc(a)
>>> a
5

Python 不喜欢弄乱全局命名空间。这是一件好事,我保证!确保将变量分配给函数的结果,就像我在行中所做的那样a = inc(a)。否则,您将不得不使用全局变量,这不是很好的做法。

在您的情况下,Update()应该采用它希望修改的参数,并返回它们的新值。


您可以import将此模块放入其他脚本中。这将允许您使用语法访问所有模块级函数、变量等

mymodulename.functionname()

或者

mymodulename.varname.

如果您想访问模块内的类中的某些内容,相同的语法仍然有效!

mymodulename.classname.classmember

例如:

####file_a.py####
import file_b
print file_b.message
c = file_b.myclass()
c.helloworld()


####file_b.py####
message = "This is from file b"
class myclass:
    def helloworld(self):
        print "hello, world!"
#################

$ python file_a.py
This is from file b
hello, world!

如果您的模块不在同一目录中,则需要将要从中导入的目录添加到路径中。但是,我建议暂时将它们留在同一目录中,因为您似乎正在学习 Python。

于 2013-09-09T19:03:46.603 回答
0

您可以使用导入,但需要将脚本的路径添加到您的 PYTHONPATH 环境变量或导入之前的一行代码,如下所示:

sys.path.insert(0, path_to_your_script_here)

然后,您可以使用以下方法导入整个模块:

import module name

并使用 module.function() 引用函数,或者您可以导入特定函数,直接调用函数名称即可:

from module import function
于 2013-09-09T19:08:52.393 回答