출처:rmrk
#==============================================================================
# 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 = "x49x44x41x54"
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
$scene.take_screenshot 을 스크립트로 이벤트추가 해주심 됩니다.(전체 단축키스크립트를 이용해 단축기로도 스샷 가능