2016-10-14 2 views
1

Я пытаюсь создать программу, которая изменит каждый отдельный пиксель на поверхности Pygame на случайный цвет.Pygame не отвечает на переменные обновления

Для фиксированного и постоянного размера поверхности (например, 1300 x 700) это работает, и вся поверхность заполнена случайными цветами, однако я пытаюсь изменить размер поверхности с помощью pygame.RESIZABLE функция Pygame на лету (путем обновления вычисленных значений X и Y, из которых работает программа), однако каждый раз, когда поверхность изменяется, поверхность Pygame выводит случайно цветные пиксели для пикселей в пределах начальной ширины и высоты начальной программы (в данном случае 1300 x 700), а остальная часть поверхности оставлена ​​черной (цвет фонового цвета я устанавливаю), хотя при печати переменных, которые отвечают на высоту и ширину экрана (и используются для итерации по всему пикселю) в журнал программы , они обновляются, как ожидалось.

Я не понимаю, как поверхность не реагирует на обновленные переменные, и я не знаю, как исправить эту проблему.

Любая помощь очень ценится, и любые вопросы о моем коде приветствуются, спасибо!

import pygame 
import random 
pygame.init() #initiates pygame 

Comp_X = 1300 
Comp_Y = 700 

Window = pygame.display.set_mode((Comp_X, Comp_Y), pygame.RESIZABLE) #defines the window size (the varible doesnt have to be called window) 
pygame.display.set_caption("Random Colours") #sets the title of the window 
clock = pygame.time.Clock() #sets the refresh rate of the program 



def GameLoop():  
    global Comp_X #computed pixles for the X axis 
    global Comp_Y #computed pixles for the Y axis 
    Comp_Tot = Comp_X * Comp_Y #total pixles on the screen 
    print("initial computed total pixles = " + str(Comp_Tot)) 

    #setting x and y position 
    x = 0 
    y = 0 


    GameExit = False #sets the defult value of this varible to true 

    while not GameExit: #this is effectivly a "while true" loop, unless the varible "crashed" is set to false 

     for event in pygame.event.get(): #this for loop will listen for events 
      print(event.type) 
      print("X = " + str(Comp_X)) 
      print("Y = " + str(Comp_Y)) 

      if event.type == pygame.QUIT: # this if statement checks to see if the X in the top right of the window was pressed 
       GameExit = True # this will break the while loop if the condition is met 
       print("X = " + str(Comp_X)) 
       print("Y = " + str(Comp_Y)) 

      if event.type == 16: #event type 16 is the window resizing event 
       Comp_X = event.dict['size'][0] 
       Comp_Y = event.dict['size'][1] 
       Comp_Tot = Comp_X * Comp_Y 
       print("current computed total pixles = " + str(Comp_Tot)) 

      #Creating the colours 
      if event.type == pygame.KEYDOWN: 

       if event.key == pygame.K_RETURN: 

        for pixle in range (0, Comp_Tot): 
         if x == Comp_X: 
          print("Computed X = " + str(Comp_X)) 
          print("Computed Y = " + str(Comp_Y)) 
          x = 0 
          y += 1 
         pygame.draw.rect(Window, (random.randint(0,255), random.randint(0,255), random.randint(0,255)), [x, y, 2, 2])# draws a red square 
         x += 1 


     #Drawing the frame 
     pygame.display.update() #This updates the frame 
     clock.tick(60) # this defines the FPS 



GameLoop() 
pygame.quit() # this will close the window if the "while GameLoop" loop stops running 
quit() 

Using defult height and width of 1300 x 700

Resizing surface to 1457 x 992 - not all of the surface is filled!

+0

Не связанный с вашим исходным вопросом, но как только кто-то, кто сделал это раньше (для эффекта статического экрана телевизора), вы получите лучшую производительность, если вы создадите единовременный глобальный список Comp_Tot цвета, а затем просто вызовите random.shuffle один раз в списке. Я также улучшил производительность, применив эту технику к временной поверхности 200x200 и затем выложил это изображение на мой большой экран. –

+0

Круто спасибо! Эта программа занимает некоторое время, чтобы вывести эффект, поэтому я дам этот снимок :) – Jake

ответ

1

На самом деле есть две проблемы с кодом, вызывающим ошибку. Первый, не имеющий линию

Window = pygame.display.set_mode((Comp_X, Comp_Y), pygame.RESIZABLE)

внутренней части if event.type == 16:, как уже упоминалось.

Другая проблема очень незначительная, но она не работает должным образом, если изменить размер после заполнения экрана один раз, и это значит, что вы никогда не сбросите значения x или y обратно на 0 после заполнения экрана.

Неподвижная часть кода:

  if event.type == pygame.VIDEORESIZE: 
       Comp_X = event.w 
       Comp_Y = event.h 
       Comp_Tot = Comp_X * Comp_Y 
       print("current computed total pixles = " + str(Comp_Tot)) 
       Window = pygame.display.set_mode((Comp_X, Comp_Y), pygame.RESIZABLE) 

      #Creating the colours 
      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_RETURN: 
        for pixle in range (0, Comp_Tot): 
         if x == Comp_X: 
          #print("Computed X = " + str(Comp_X)) 
          #print("Computed Y = " + str(Comp_Y)) 
          x = 0 
          y += 1 
         pygame.draw.rect(Window, (random.randint(0,255), random.randint(0,255), random.randint(0,255)), [x, y, 2, 2])# draws a red square 
         x += 1 
        x = 0 
        y = 0 

Я также изменил event.type == 16 к event.type == pygame.VIDEORESIZE, как это более читаемым.

+0

Это работает! Большое спасибо :) – Jake

0

Когда окно изменения размера пожаров событий, вам нужно вызвать pygame.display.set_mode((w, h)) снова выделить новую поверхность такого размера. В противном случае вы все равно пишете исходный экземпляр Surface 1300x700.

+0

Это работает для первого запуска игры, но когда я нажимаю клавишу возврата, чтобы запустить ее снова, она занимает такое же количество времени для вычисления, однако, он просто отображает черную поверхность. это также происходит, если я изменил размер поверхности после вычисления цветов. Любые идеи? – Jake

+0

if event.type == 16: #event type 16 - событие изменения размера окна Comp_X = event.dict ['size'] [0] Comp_Y = event.dict ['size'] [1] pygame.display ,set_mode ((Comp_X, Comp_Y), pygame.RESIZABLE) Comp_Tot = Comp_X * Comp_Y print ("current computed total pixles =" + str (Comp_Tot)) – Jake

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