在pygame中创建多个实例

时间:2013-07-12 08:14:51

标签: python pygame

使用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)

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

首先,你的课程被打破了。您的块类的所有实例都将共享相同的xy值,因为您将其创建为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()替换了xyboundingBox_XboundingBox_Y,因为Rect已经存储了所有Sprite class该信息适合您,并提供了许多其他功能。我在类的初始值设定项中添加了两个参数,因此我们可以在创建对象时设置xy值。

而不是创建单个实例:

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}},但这是另一个主题。