0

だから私はpygameモジュールを使ってpythonでゲームを作ることを学ぼうとしていて、複数のスクリプトを使ってプログラムを構築できるようにしたいJavaScriptのバックグラウンドから来ています。そこで、別のスクリプトをロードして、その関数の 1 つと、そのスクリプトで宣言された変数を使用しようとしました。私ができるようにしたいのは、他のスクリプトから「更新」機能を呼び出すことですが、このスクリプトで宣言された変数を使用します。助言がありますか?

編集:わかりました、それで、私は明らかに私の質問をあまり明確にしていません。スクリプトのインポートは私の問題ではありません。問題なくインポートできます。私が抱えている問題は、それをインポートした後、このスクリプトの変数を使用するメイン スクリプトからこのスクリプトの関数を呼び出せるようにする必要があることです。

今起こっていることは、このスクリプトで更新関数を呼び出すと、変数「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 に答える