使用pygame时遇到了一些问题。看,我有一个名为blockClass的类,但我不太清楚如何创建blockClass的多个实例,而不创建几十个对象。有没有办法可以实例化这个类?
这是我的代码:
#imports
import pygame, sys
from pygame.locals import *
#init game
pygame.init()
screen = pygame.display.set_mode((640,480))
pygame.key.set_repeat(True)
clock = pygame.time.Clock()
#classes
class playerClass:
x = 100
y = 100
boundingBox_X = 32
boundingBox_Y = 32
sprite = pygame.image.load("Image2.png").convert_alpha()
class blockClass:
x = 0
y = 0
boundingBox_X = 32
boundingBox_y = 32
sprite = pygame.image.load("Image1.png").convert_alpha()
#objects
playerObject = playerClass()
block = blockClass()
#object variables
#colors
white = 255,255,255
#main loop
quitting = False
while quitting == False:
for event in pygame.event.get():
#event processing
if event.type == pygame.QUIT:
quitting = True
#drawing
screen.fill((white))
screen.blit(playerObject.sprite,(playerObject.x,playerObject.y))
screen.blit(blockObject.sprite,(blockObject.x,blockObject.y))
pygame.display.flip()
#ending
clock.tick(60)
感谢您的帮助!
答案 0 :(得分:2)
首先,你的课程被打破了。您的块类的所有实例都将共享相同的x
和y
值,因为您将其创建为class variable, not instance variables。
将您的班级更改为:
class Block(object):
sprite = None
def __init__(self, x, y):
if not Block.sprite:
Block.sprite = pygame.image.load("Image1.png").convert_alpha()
self.rect = Block.sprite.get_rect(top=y, left=x)
这样,只有实例之间共享图像。我还使用Rect
使用get_rect()
替换了x
,y
,boundingBox_X
,boundingBox_Y
,因为Rect
已经存储了所有Sprite
class该信息适合您,并提供了许多其他功能。我在类的初始值设定项中添加了两个参数,因此我们可以在创建对象时设置x
和y
值。
而不是创建单个实例:
block = blockClass()
让我们创建一个列表并用一堆块填充它:
blocks = []
for x in xrange(15):
blocks.append(Block(x*32, 200))
在绘图时,绘制此列表中的所有块:
while quitting == False:
...
for block in blocks:
screen.blit(block.sprite, block.rect)
如您所见,我们可以直接将Rect
传递给blit
函数。
最后,您还可以使用sprite groups和{{3}},但这是另一个主题。