Screenshot
Version: 1.0
Author: 66rpg.com & modern algebra
Date: April 5, 2010
Version History
- <Version 1.0> 04.05.2010 - Original Release
Description
This script allows the player to take a screenshot of any area in the game that he/she wants. Useful for sharing achievements I suppose. I made it for my own nefarious purposes and without thinking whether it would have any real purpose in an actual RM game.
Features
- Allows the player to take a screenshot at any time by pressing the button of your choice.
- You can set where the pictures are saved and what preface they have
- You can force take a screenshot at any time through a simple script line, $scene.take_screenshot
Instructions
Please see the header. It's very simple.
Script
#==============================================================================
# Screenshot
# Version: 1.0
# Author: modern algebra (rmrk.net)
# Date: April 5, 2010
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Description:
# This script allows the player to take a screenshot of any area in the game
# that he/she wants. Useful for sharing achievements I suppose.
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Instructions:
# All you need to do is set which button you want to use for taking
# screenshots with at line 31, and set the destination folder for screenshots
# at line 33.
# If you want to force a screenshot, you can put this code in a call script:
# $scene.take_screenshot
#==============================================================================
#==============================================================================
# ** Scene_Base
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# new constant - MA_SCREENSHOT_BUTTON, MA_SCREENSHOT_PATH
# aliased method - update
#==============================================================================
class Scene_Base
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * CONSTANTS
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# MA_SCREENSHOT_BUTTON - the button to press to take a Screenshot
MA_SCREENSHOT_BUTTON = Input::F5
# MA_SCREENSHOT_PATH - the path to save the file
MA_SCREENSHOT_PATH = "Screenshot "
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Frame Update
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias modag_screenshot_upd_9ik2 update
def update (*args)
modag_screenshot_upd_9ik2 (*args) # Run Original Method
if Input.trigger? (MA_SCREENSHOT_BUTTON)
take_screenshot
end
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Take Screenshot
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def take_screenshot
x = 1
while FileTest.exist? ("#{MA_SCREENSHOT_PATH}#{x}.png")
x += 1
end
Graphics.snap_to_bitmap.make_png (x.to_s, MA_SCREENSHOT_PATH, 1)
end
end
#==============================================================================
# Everything below this point is the PNG Saver script, written by 66rpg.com
#==============================================================================
# PNG Saver by 66rpg.com
module Zlib
class Png_File < GzipWriter
def make_png(bitmap, mode = 0)
@bitmap, @mode = bitmap, mode
self.write(make_header)
self.write(make_ihdr)
self.write(make_idat)
self.write(make_iend)
end
def make_header
return [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a].pack('C*')
end
def make_ihdr
ih_size = [13].pack('N')
ih_sign = 'IHDR'
ih_width = [@bitmap.width].pack('N')
ih_height = [@bitmap.height].pack('N')
ih_bit_depth = [8].pack('C')
ih_color_type = [6].pack('C')
ih_compression_method = [0].pack('C')
ih_filter_method = [0].pack('C')
ih_interlace_method = [0].pack('C')
string = ih_sign + ih_width + ih_height + ih_bit_depth + ih_color_type +
ih_compression_method + ih_filter_method + ih_interlace_method
ih_crc = [Zlib.crc32(string)].pack('N')
return ih_size + string + ih_crc
end
def make_idat
header = "\x49\x44\x41\x54"
data = @mode == 0 ? make_bitmap_data0 : make_bitmap_data1
data = Zlib::Deflate.deflate(data, 8)
crc = [Zlib.crc32(header + data)].pack('N')
size = [data.length].pack('N')
return size + header + data + crc
end
def make_bitmap_data0
gz = Zlib::GzipWriter.open('png2.tmp')
t_Fx = 0
w = @bitmap.width
h = @bitmap.height
data = []
for y in 0...h
data.push(0)
for x in 0...w
t_Fx += 1
if t_Fx % 10000 == 0
Graphics.update
if t_Fx % 100000 == 0
s = data.pack('C*')
gz.write(s)
data.clear
end
end
color = @bitmap.get_pixel(x, y)
data.push(color.red, color.green, color.blue, color.alpha)
end
end
s = data.pack('C*')
gz.write(s)
gz.close
data.clear
gz = Zlib::GzipReader.open('png2.tmp')
data = gz.read
gz.close
File.delete('png2.tmp')
return data
end
def make_bitmap_data1
w = @bitmap.width
h = @bitmap.height
data = []
for y in 0...h
data.push(0)
for x in 0...w
color = @bitmap.get_pixel(x, y)
data.push(color.red, color.green, color.blue, color.alpha)
end
end
return data.pack('C*')
end
def make_iend
ie_size = [0].pack('N')
ie_sign = 'IEND'
ie_crc = [Zlib.crc32(ie_sign)].pack('N')
return ie_size + ie_sign + ie_crc
end
end
end
#=============================================================================
# ** Bitmap
#=============================================================================
class Bitmap
def make_png(name = 'like', path = '', mode = 0)
Zlib::Png_File.open('png.tmp') { |gz| gz.make_png(self, mode) }
Zlib::GzipReader.open('png.tmp') { |gz| $read = gz.read }
f = File.open(path + name + '.png', 'wb')
f.write($read)
f.close
File.delete('png.tmp')
end
end
Credit
- 66rpg.com, for the PNG Saver which allowed me to export the screenshots into a PNG file
- modern algebra
Support
Please post in this topic at RMRK for support.
Known Compatibility Issues
No currently known compatibility issues. The script will be unable to take screenshots in any custom script that makes a scene that does not inherit the update method from Scene_Base however.