2013-07-12 81 views
1

我在使用pygame時遇到了一些問題。看到,我有一個名爲blockClass的類,但我不確定如何創建blockClass的多個實例,而不創建數十個對象。有沒有一種方法可以實例化這個類?在pygame中創建多個實例

這裏是我的代碼:

#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) 

感謝您的幫助!

回答

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) 

這樣,只有圖像的實例共享。我還用get_rect()替換了x,y,boundingBox_X,boundingBox_YRect,因爲Rect已經爲您存儲了所有信息並提供了許多附加功能。我爲類的初始化程序添加了兩個參數,因此我們可以在創建對象時設置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 classsprite groups,但這是另一個話題。

+0

很酷,這太好了。我基本上看到你在做什麼,但我對python有點新鮮。如何將列表中的塊更改爲我所希望的?基本上,語法是什麼? – lando111

+0

你究竟是什麼意思*如何將列表中的塊更改爲我希望的任何內容?*? – sloth

+0

那麼,你在200的y位置在屏幕上繪製了15個塊的線。我怎樣才能改變它以放置塊呢? – lando111