10

私はPythonには少し慣れていませんが、OOPには精通しています。PyGame を使用してゲームを作成しようとしています。基本的に、私の目的は、数秒ごとに木をレンダリングし、木の四角形を画面上で移動することです。

だからここに私のコードがあります:

from collections import deque
import pygame,random,sys

pygame.init()
size = 800,600
screen = pygame.display.set_mode(size)

class tree:
    def __init__(self):
            self.img = pygame.image.load("tree.png")
            self.rect = self.img.get_rect()
    def render(self):
            screen.blit(self.img,self.rect)
    def move(self,x,y):
            self.rect = self.rect.move(x,y)

#creating a queue of trees
trees = deque()

#appending the first tree on to the queue 
trees.append(tree())


while 1:


    for event in pygame.event.get():
            if event.type == pygame.QUIT: sys.exit()

    #appending tree() to trees queue every 300 ms
    if pygame.time.get_ticks() % 300 == 0:
            trees.append(tree())

    #rendering and moving all the tree rects of trees in the queue
    for tree in trees:
            tree.render()
            tree.move(20,2)
    pygame.display.flip()

しかし、これを実行すると、最初のいくつかのツリーが正常に生成されますが、PyGame ウィンドウが閉じて、次のエラーが発生します。

Traceback (most recent call last):
File "error.py", line 25, in <module>
trees.append(tree())
AttributeError: tree instance has no __call__ method
4

3 に答える 3

22

クラス名と競合する変数名tree(で使用)があるためだと思います。tree.render()それを呼び出すTree方が良いでしょう(そしてよりpythonic ^^)。

于 2012-07-04T07:51:00.650 に答える
4

treeループ内の変数をfor以外の名前で呼び出したい場合がありますtree。クラス名を隠しています。

于 2012-07-04T07:50:40.880 に答える
1

あなたの文脈は汚染されています

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT: sys.exit()

    #appending tree() to trees queue every 300 ms
    if pygame.time.get_ticks() % 300 == 0:
        trees.append(tree()) <----------------------- second time, this tree is not your class, but the last instance of tree

    #rendering and moving all the tree rects of trees in the queue
    for tree in trees: <-------------------- here, the last tree will get name with tree
        tree.render()
        tree.move(20,2) 
    pygame.display.flip()

コンパイラは、あなたがクラスを初期化していないと考えるかもしれませんが、その呼び出し関数を呼び出します。

于 2012-07-04T07:52:18.737 に答える