1

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

谢谢你的帮助!

4

1 回答 1

2

首先,你的课坏了。块类的所有实例都将共享相同的xy,因为您将它们创建为类变量,而不是实例变量

将您的课程更改为:

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)

这样,只有图像在实例之间共享。我还将x, y, boundingBox_X,替换boundingBox_YRectusing get_rect(),因为 aRect已经为您存储了所有这些信息并提供了许多附加功能。我在类的初始化程序中添加了两个参数,因此我们可以在创建对象时设置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

最后,您也可以简单地使用Spriteclasssprite groups,但这是另一个话题。

于 2013-07-12T08:32:20.873 回答