Main Menu
  • Welcome to The RPG Maker Resource Kit.

Screenshot

Started by modern algebra, April 05, 2010, 11:08:51 PM

0 Members and 1 Guest are viewing this topic.

modern algebra

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.

Grafikal

this is badass and way more useful than you think. is there a way to take a screenshot of areas of the map that aren't within the window of VX? Specifically, can you make this puppy screenshot the entire map? If you dig through our guild game, you'll notice an XP version of what i'm talking about. We're using it to build our maps in XP, screenshot the whole map, use the image as a background image in VX and build the game on top of that from VX. Complex, but very cool effect. Curious if this could do the same, but for VX.

modern algebra

No, it can't take a screenshot of a whole map. Probably wouldn't be too hard to do though, if you want me to.

Zylos

Modern Algebra, I love you. This is, as grafikal stated, a badass script. :3




Grafikal

Quote from: modern algebra on April 06, 2010, 12:53:55 AM
No, it can't take a screenshot of a whole map. Probably wouldn't be too hard to do though, if you want me to.

That would be amazing. If you'd do that, i'd love you more. I don't know how i could do that though. Maybe i'll find a way to get roph to send you nudies.

modern algebra

Hm, looks like I won't have to: Omegas7 wrote a script to save the map as a picture, so you can send the nudies to him: http://www.rpgmakervx.net/index.php?showtopic=28578

I think he miscredits the PNG Saver script though, unless 66rpg.com is woratana.

Grafikal

Whoa awesome. Maybe he updated the credits? It looks like Wortana is credited for the PNC Saver Script. Very cool :D

modern algebra

Yeah, the author of the PNG Saver is 66rpg.com I think, not Woratana.

Grafikal

ooohhh ok, I thought you had meant the other way around. Well if I get around to use it, I'll have to delve in and check it out.

CodeMaster

I have a question could you this with a save screen script that shows a picture to show where you are and if I can how would i do it

[spoiler]


[/spoiler]
[spoiler]John 3:16: For God loved the world so much that he gave his one and only Son, so that everyone who believes in him will not perish but have eternal life[/spoiler]

Cengiz Han

I can't change destination folder, it saves images to in project folder but I want it save them in graphics\pictures\. :C (sorry for my bad English)

Cengiz Han

Wow, tried Graphics/Pictures/SS rather than Graphics\Pictures\SS and it is working. Great script, thank you very much... XD

CodeMaster

There is a edit button you are not supposed to double post.

[spoiler]


[/spoiler]
[spoiler]John 3:16: For God loved the world so much that he gave his one and only Son, so that everyone who believes in him will not perish but have eternal life[/spoiler]

brewmeister

There is a 'report' button too. You're not supposed to back-seat moderate!    ;D

<Scratches head> Hmmm, I always thought SephirothSpawn wrote the screenshot.dll ???