Hi everyone, I was hoping someone could help me with the following. I have a button that saves a screenshot PNG to the Downloads folder when you press it.
What I want is for the button to disappear after it is pressed, so the screenshot does not include the two menu buttons called “%SaveReport” and “%BackMainMenu”.
The code for the save button is listed below:
`
func _on_SaveReport_pressed():
$"%SaveReport".visible = false
$"%BackMainMenu".visible = false
print("I've disabled the buttons")
print("That means the screenshot SHOULD be button free")
take_screenshot()
$"%SaveReport".visible = true
$"%BackMainMenu".visible = true
`
As you can see, it calls the take_screenshot() function which is listed above:
`
func take_screenshot(): image = get_viewport().get_texture().get_image()
if OS.get_name() == "Web" or OS.has_feature('JavaScript'):
print("We're on the web")
# We're on the web
image.clear_mipmaps()
var buffer = image.save_png_to_buffer()
JavaScriptBridge.download_buffer(buffer, fileName)
if OS.get_name() != "Web" or !OS.has_feature('JavaScript'):
# We're not on the web
print("We're not on the web")
var docs = OS.get_environment("HOME") + "/Documents"
var title = str(docs + "/results",global_ints.observed_person_name, global_ints.observation_minutes,".png")
print(title)
var _saveimage = image.save_png(title)
if OS.get_name() != "OSX":
print("We're not on MacOS")
var _openfolder = OS.shell_open(docs)
if OS.get_name() == "OSX":
print("We're on MacOS")
var _openfolder = OS.shell_open("file://" + docs)
`
The code works. The screenshot is taken and it’s saved to the Downloads folder and MacOS/Windows/Linux open up the Downloads folder straight after.
For the life of me, I can’t figure out why the Back & Screenshot buttons ( “%SaveReport” and “%BackMainMenu”) that I turn invisible BEFORE I call take_screenshot() end up being in the screenshot. Every single time.
Anyone have any ideas?
Thank you!
Managed to fix it by using
await get_tree().process_frame
instead. It seems thatidle_frame
appears to no longer exist in Godot 4.1?So my full code for triggering the screenshot function is:
func _on_SaveReport_pressed(): await get_tree().process_frame $"%SaveReport".visible = false $"%BackMainMenu".visible = false await get_tree().process_frame take_screenshot() $"%SaveReport".visible = true $"%BackMainMenu".visible = true
For some reason, I have to await before I turn the interface elements off, and after I’ve turned them off. It now works a treat for my app. Thank you for your assistance!
Oh nice, Godot changed something again. TIL about process_frame, thanks!