2016-12-13 21 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