2016-12-13 3 views
1

Я хотел написать программу, которая, когда пользователь щелкает в любом месте на поверхности окна, показывает еще одну меньшую коробку, скрытую за ней. В настоящий момент код довольно далек от завершения. В настоящее время я хотел сделать анимацию, которая застревает, когда пользователь щелкает в любом месте экрана и останавливается, когда поле, которое закрывает маленькую коробку, исчезло. Вот мой код:Python 3.5.2 Pygame: Box show animation

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 я сказал, что программа должна сделать только большую коробку, если значение «охвата» больше нуля.

В функции showBoxesAnimation я использую функцию диапазона, чтобы снизить значение охвата от 40 до 0 на 8 за раз (40, 32, 24, 16, 8, 0, -8). Тем не менее, когда значение покрытия достигает нуля, анимация не останавливается. Он продолжается в бесконечном цикле.

Как это сделать?

+0

вы должны установить 'mouseClicked = false' после вы' revealBoxesAnimation' – furas

+0

@furas Я всегда ожидаю сложный ответ, и получается, он пропустил что-то простое ... Он работает сейчас. Большое спасибо ! – ROBlackSnail

+0

'mouse.get_pos()' никогда не возвращает 'None, None' - so' if mousex! = None и mousey! = None: 'всегда' True'. – furas

ответ

1

Проблема заключается в том, что после установки mouseClicked на True у вас никогда не будет возможности снова сделать это ложным. Самое простое исправление, на мой взгляд было бы заменить

 elif event.type == MOUSEBUTTONUP: 
      mouseClicked = True 

с

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

(Вне события для цикла, так как вам нужно только сделать это один раз в кадре.)

3

Хотя в другом ответе уже было исправлено, я рекомендую полностью переписать код.

Обратите внимание, что вся логика заключена в класс Box (особенно метод update) вместо трех различных функций; и теперь у нас есть единственный, неблокирующий основной цикл.

У нас есть один класс как для сокращения, так и для сокращения, но мы также можем создать другой класс для того, что не должно сокращаться и пропускать аргумент 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. Мне просто удалось понять, как изображение на самом деле «движется» на экране и как сделать небольшую анимацию. Даже не знал о модуле спрайтов. Сейчас я читаю об этом. Кажется очень полезным, но в то же время довольно сложным XD. Большое спасибо за вашу помощь и все время, когда вы положили! – ROBlackSnail

+0

@ROBlackSnail Нет проблем.На самом деле спрайты довольно просты: это в основном образ и прямоугольник, и вы ставите всю свою логику в метод обновления. Это упрощает и упрощает работу. [Здесь] (http://stackoverflow.com/a/41103994/142637) еще один пример. – sloth

 Смежные вопросы

  • Нет связанных вопросов^_^