2016-12-13 42 views
1

我想編寫一個程序,當用戶點擊盒子表面的任何地方時,它會顯示隱藏在盒子後面的另一個小盒子。代碼目前還沒有完成。 目前我想做一個動畫,當用戶在屏幕上的任何地方點擊並在包裝小盒子的盒子消失時停止。 這裏是我的代碼:Python 3.5.2 Pygame:盒子揭示動畫

import random, pygame, sys 
from pygame.locals import * 

pygame.init() 
done = False 
clock = pygame.time.Clock() 
white = (255,255,255) # COLLORS 
black = (0,0,0) 
red = (255,0,0) 
green = (0,100,0) 
display_width = 800 # SCREEN DIMMENSION 
display_height = 600 
game_display = pygame.display.set_mode((display_width,display_height)) # SCREEN 
REVEALSPEED = 8 

def draw_icon(x,y): 
    icon = pygame.Rect(x+10,y+10,20,20) 
    pygame.draw.rect(game_display,red,icon) 

def draw_cover(x,y,coverage): 
    pygame.draw.rect(game_display,white,(x,y,40,40)) 
    draw_icon(x,y) 
    if coverage > 0: 
     pygame.draw.rect(game_display, green, (x, y, coverage, 40)) 
    pygame.display.update() 
    clock.tick(10) 

def revealBoxesAnimation(x,y): # Do the "box reveal" animation. 
    for coverage in range(40, (-REVEALSPEED) - 1, -REVEALSPEED): 
     draw_cover(x, y, coverage) 




def game_loop(): 
    done = False 
    mouseClicked = False 

    while done != True: 

     x = (display_width - 40)/2 
     y = (display_height - 40)/2 

     for event in pygame.event.get(): # PRESSED KEYS EFFECTS 
      if event.type == pygame.QUIT: 
       done = True 

      elif event.type == MOUSEBUTTONUP: 
       mouseClicked = True 

     mousex, mousey = pygame.mouse.get_pos() 
     if mousex != None and mousey != None : 
      if mouseClicked == True : 
       revealBoxesAnimation(x, y) 


     game_display.fill(white) 
     pygame.display.update() 
     clock.tick(60) 
game_loop() 

在draw_cover功能我說,該方案只畫出大框,如果「覆蓋」的值大於零。

在revealBoxesAnimation函數中,我使用範圍函數將覆蓋範圍的值從40一直降低到0,一次減少8(40,32,24,16,8,0,-8)。不過,當覆蓋率值爲零時,動畫不會停止。它在無限循環中繼續。

是怎麼回事?

+0

你必須設置'的mouseClicked = FALSE'之後,您就'revealBoxesAnimation' – furas

+0

@furas我總是期待一個複雜的答案,它證明它錯過了一些簡單的...它現在起作用了。非常感謝 ! – ROBlackSnail

+0

'mouse.get_pos()'永不返回'None,None' - 所以'如果mousex!= None和mousey!= None:'總是'True'。 – furas

回答

1

問題在於,將mouseClicked設置爲True後,您再也沒有辦法讓它再次變爲假。在我看來,最簡單的解決將是取代

 elif event.type == MOUSEBUTTONUP: 
      mouseClicked = True 

mouseClicked = pygame.mouse.get_pressed()[0] 

(for循環的事件之外,因爲你只需要每幀做一次。)

3

雖然在另一個答案中已經提出了修復建議,但我建議完全重寫您的代碼。

請注意所有邏輯如何封裝在Box類(特別是update方法)中,而不是3個不同的函數;現在我們只有一個單一的非阻塞主循環。

我們對於非縮小和縮小的盒子都有一個類,但是我們也可以爲不應該縮小的東西創建另一個類並跳過shrinking參數。

所以基本上,如果箱子收縮,我們縮小矩形,創建一個新的Surface與較小的尺寸,並將其用於繪圖。

當發生鼠標點擊時,我們只需創建兩個Box實例,一個不縮小,另一個縮小。

這裏是一個完整的,運行例如:

import random, pygame, sys 
from pygame.locals import * 

pygame.init() 

clock = pygame.time.Clock() 
display_width = 800 # SCREEN DIMMENSION 
display_height = 600 
game_display = pygame.display.set_mode((display_width,display_height)) # SCREEN 
colors = pygame.color.THECOLORS 

class Box(pygame.sprite.Sprite): 
    def __init__(self, group, center, size, color, shrinking=False): 
     pygame.sprite.Sprite.__init__(self, group) 
     self.image = pygame.surface.Surface((size, size)) 
     self.image.fill(color) 
     self.shrinking = shrinking 
     self.rect = self.image.get_rect(center=center) 

    def update(self): 
     if self.shrinking: 
      self.rect.inflate_ip(-1, 0) 
      new = pygame.surface.Surface((self.rect.w, self.rect.h)) 
      new.blit(self.image, (0, 0)) 
      self.image = new 
      if self.rect.width <= 0: 
       self.kill() 

sprites = pygame.sprite.OrderedUpdates() 

def game_loop(): 
    while True: 

     for event in pygame.event.get(): # PRESSED KEYS EFFECTS 
      if event.type == pygame.QUIT: 
       return 

      elif event.type == MOUSEBUTTONUP: 
       Box(sprites, event.pos, 20, colors['red']) 
       Box(sprites, event.pos, 40, colors['green'], True) 

     sprites.update()   
     game_display.fill(colors['white']) 
     sprites.draw(game_display) 
     pygame.display.update() 
     clock.tick(60) 

game_loop() 

enter image description here

+0

哇!這太神奇了!我仍然是pygame的初學者。我只是設法瞭解圖像在屏幕上如何「移動」以及如何做一些動畫......甚至不知道這個sprite模塊。我現在正在閱讀它。似乎真的很有用,但同時很複雜的XD。非常感謝您的幫助以及您一直投入的時間! – ROBlackSnail

+0

@ROBlack蝸牛沒問題。實際上,精靈是非常簡單的:它基本上是一個圖像和一個rect放在一起,你把所有的邏輯放到update方法中。這使得一切都變得簡單和容易。 [Here's](http://stackoverflow.com/a/41103994/142637)另一個例子。 – sloth