Как получить кадры из игры на pygame

Я пытаюсь извлечь кадры из моего ранее закодированного модуля pygames, чтобы обучить на нем агента RL. Однако я не уверен, как извлекать кадры из игрового движка.

В частности, я просмотрел это и нашел это сообщение в блоге, однако я действительно не понимаю, как я могу получить доступ к pygame.display и обернуть его, не взламывая основной цикл моего игрового объекта.
https://danielslater.net/2015/12/29/how-to-run-learning-agents-against-pygame/

Это игра, из которой я пытаюсь извлечь кадры: https://github.com/Jh123x/Orbital/blob/master/Space%20Invaders/classes/game.py

Могу я получить совет, как это сделать?

edit: Точнее, как мне вызвать функцию для извлечения кадров из игрового цикла во время его работы?

код экстрактора кадров

import pygame  
import pygame.surfarray  

 # function that we can give two functions to and will return us a new function that calls both
 def function_combine(screen_update_func, our_intercepting_func):  
   def wrap(*args, **kwargs):  
     screen_update_func(*args,  
               **kwargs) # call the screen update func we intercepted so the screen buffer is updated  
     our_intercepting_func() # call our own function to get the screen buffer  
   return wrap  

 def on_screen_update():  
   surface_array = pygame.surfarray.array3d(pygame.display.get_surface())  
   print("We got the screen array")  
   print(surface_array)  

 # set our on_screen_update function to always get called whenever the screen updated  
 pygame.display.update = function_combine(pygame.display.update, on_screen_update)

person BlackOnyx    schedule 20.05.2020    source источник


Ответы (1)


https://www.pygame.org/docs/ref/image.html#pygame.image.save

Вы можете попробовать pygame.image.save (window, "frame.png")

Где окно - это активный оконный объект.

person Trevor Galivan    schedule 20.05.2020
comment
Привет, не могли бы вы привести пример, откуда я мог бы позвонить? Я больше спрашиваю, откуда я мог бы вызывать такие функции, а не из какой функции использовать, так как я не уверен, откуда я могу вызывать функции для извлечения массива изображений из игрового цикла. - person BlackOnyx; 20.05.2020
comment
Как часто вы хотите сохранять изображение? Каждый кадр? (Обратите внимание, что это будет довольно медленная операция). Если это так, вы можете поместить его в метод обновления игр класса gamewindow (используя self.screen вместо window), или же вы можете поместить его в основной цикл в любом месте под циклом во время выполнения. просто обязательно назовите это на экране объект - person Trevor Galivan; 20.05.2020
comment
Я хочу вызвать этот метод, не изменяя основной цикл игры, и вызывая этот метод: surface_array = pygame.surfarray.array3d (pyame.display.get_surface ()) для извлечения кадров и их обработки, в идеале не нужно будет записывать на диск и вызвать замедление, как вы указали. Есть ли способ получить отображение без изменения игрового цикла? - person BlackOnyx; 20.05.2020
comment
Я не могу придумать, как вы могли бы это сделать, не изменяя ни сам основной цикл, ни один из методов, вызываемых mainloop, поскольку похоже, что mainloop не теряет контроль до тех пор, пока игра не закончится. - person Trevor Galivan; 20.05.2020