私は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
クラス名と競合する変数名tree
(tree.render()
で使用)があるためだと思います。それをTree
と呼ぶ方が良いでしょう(そしてもっとPythonic ^^)。
tree
ループ内のfor
変数を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()) <----------------------- 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()
コンパイラは、あなたがクラスを初期化していないと考えるかもしれませんが、そのcall関数を呼び出します。