2015-03-24 71 views
0

只有一個蘭花精靈,它或多或少地按照我的意圖反彈屏幕。當我補充更多的時候,蘭花精靈會作爲一個整體一起移動,並且從邊界反彈,即使它們沒有接近接觸它。這裏是代碼:爲什麼我的pygame sprites不能獨立移動?我如何讓他們獨立移動?

#Import and Init 
import pygame 
import random 
from pygame.locals import * 
pygame.init() 

#Set Up the Window 
width = 1240 
height = 700 
screen = pygame.display.set_mode((width, height)) 
pygame.display.set_caption("Pollination!") 

background = pygame.Surface(screen.get_size()) 
background = pygame.image.load("Forrest.jpg") 
background = background.convert() 

#Load and Convert the wasp 
wasp = pygame.sprite.Sprite() 
wasp.image = pygame.image.load("wasp1.gif") 
wasp.rect = wasp.image.get_rect() 
wasp_group = pygame.sprite.GroupSingle(wasp) 

flowers = pygame.sprite.OrderedUpdates() 

for i in range(5): 
    orchid = pygame.sprite.Sprite() 
    orchid.image = pygame.image.load("orchid1.gif") 
    orchid.rect = orchid.image.get_rect() 
    orchid.rect.right = random.randint(0, 1240) 
    orchid.rect.top = random.randint(0, 700) 
    flowers.add(orchid) 

buzz = pygame.mixer.Sound("buzz.wav") 
#Clock and Loop Variables 
framerate = pygame.time.Clock() 
GameGo = True 

orchid_xinc = 2 
orchid_yinc = 2 

wasp_move = 5 
#The Main Loop 
while GameGo: 

    #Tick the Clock 
    framerate.tick(60) 

    #Keyborad Keypress Events, Movement 

    if pygame.key.get_pressed()[K_UP]: 
     wasp.rect.top -= wasp_move 
     if wasp.rect.top < -30: 
      wasp.rect.top = -30 
    if pygame.key.get_pressed()[K_DOWN]: 
     wasp.rect.top += wasp_move 
     if wasp.rect.top > 625: 
      wasp.rect.top = 625 
    if pygame.key.get_pressed()[K_LEFT]: 
     wasp.rect.right -= wasp_move 
     if wasp.rect.right < 110: 
      wasp.rect.right = 110 
    if pygame.key.get_pressed()[K_RIGHT]: 
     wasp.rect.right += wasp_move 
     if wasp.rect.right > 1255: 
      wasp.rect.right = 1255 

    for orchid in flowers: 
     if orchid.rect.top < -30: 
      orchid_yinc *= -1 
     if orchid.rect.top > 625: 
      orchid_yinc *= -1 
     if orchid.rect.right < 110: 
      orchid_xinc *= -1 
     if orchid.rect.right > 1255: 
      orchid_xinc *= -1 

     orchid.rect.right += orchid_xinc 
     orchid.rect.top -= orchid_yinc 

    for orchid in pygame.sprite.groupcollide(wasp_group, flowers, False, True): 
     buzz.play() 
## #Blit our Images 
    screen.blit(background, (0, 0)) 
    flowers.draw(screen) 
    wasp_group.draw(screen) 
    pygame.display.update() 


    #Handle a Close Event 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      GameGo = False 

pygame.quit() 
+0

我虛心地建議你調查類的使用,真正使得處理多個相同但獨立的對象非常容易。 – oxrock 2015-03-25 07:34:23

+0

我發現一般情況下不會使用類。在這種情況下是否有必要? – 2015-03-25 19:22:11

+0

你試圖用一組全局變量來控制一組相同的精靈。對我來說,這似乎相當明顯,他們也將採取相同的行動。您已經在使用pygame的sprite類,但是如果您開始製作自己的自定義sprite類,您可以輕鬆處理更多的事情,並且可以非常輕鬆地完全獨立於任何其他對象。擁抱OOP,這是一個很受歡迎的原因。 – oxrock 2015-03-26 00:50:50

回答

0

也許它的事實,你在for循環中鍵入「蘭花_ ####」,更新每個蘭花。如果在你的蘭花類中,init方法定義了一個self。####,因爲它應該用「Object。####」調用,而不是下劃線。如果我錯了,請檢查「flowers.draw」函數,確保它使用各自的座標繪製所有的蘭花。

+0

我按照您的建議將下劃線更改爲變量中的一段時間,但這似乎不能解決我的問題。實際上,當我嘗試多個蘭花時,我現在收到一條錯誤消息(AttributeError:'Sprite'對象沒有屬性'xinc')。 – 2015-03-25 19:20:51

+0

很抱歉,還原這些更改。我沒有看到你創建了變量名orchid_xinc,並且它是一個普通變量。無論如何,在恢復之後,你應該將xinc和yincs分配給單個蘭花,並讓它們成爲隨機的。現在xinc和yinc對所有人都是一樣的,所以他們當然會在一個小組中移動。 – 2015-03-27 02:05:03