#******************************************************************************
#
# * PNG 保存
#
# --------------------------------------------------------------------------
# バージョン : 1.0.0
# 対 応 : RPGツクールVX Ace : RGSS3
# 制 作 者 : CACAO
# 配 布 元 : [url]http://cacaosoft.web.fc2.com/[/url]
# --------------------------------------------------------------------------
# == 概 要 ==
#
# : ピングファイルの出力機能を追加します。
#
# --------------------------------------------------------------------------
# == 使用方法 ==
#
# ★ Bitmap#save_png(filename, alpha = false)
# このビットマップをピングファイルで出力
# filename : 保存するファイル名
# alpha : αチャンネルの有無
#
#
#******************************************************************************
#/////////////////////////////////////////////////////////////////////////////#
# #
# このスクリプトに設定項目はありません。 #
# #
#/////////////////////////////////////////////////////////////////////////////#
class Bitmap
#--------------------------------------------------------------------------
# ● ピング画像として保存
# filename : ファイル名
# alpha : アルファチャンネルの有無
#--------------------------------------------------------------------------
def save_png(filename, alpha = false)
sgnt = "\x89PNG\r\n\x1a\n"
ihdr = _chunk('IHDR', [width,height,8,(alpha ? 6 : 2),0,0,0].pack('N2C5'))
data = []
height.times do |y|
data << 0
width.times do |x|
color = self.get_pixel(x, y)
data << color.red << color.green << color.blue
data << color.alpha if alpha
end
end
idat = _chunk('IDAT', Zlib::Deflate.deflate(data.pack('C*')))
iend = _chunk('IEND', "")
File.open(filename, 'wb') do |file|
file.write(sgnt)
file.write(ihdr)
file.write(idat)
file.write(iend)
end
end
private
#--------------------------------------------------------------------------
# ● チャンクの作成
# name : チャンク名
# data : チャンクデータ
#--------------------------------------------------------------------------
def _chunk(name, data)
return [data.size, name, data, Zlib.crc32(name + data)].pack('NA4A*N')
end
end
#******************************************************************************
#
# * マップ画像の保存
#
# --------------------------------------------------------------------------
# バージョン : 1.0.0
# 対 応 : RPGツクールVX Ace : RGSS3
# 制 作 者 : CACAO
# 配 布 元 : [url]http://cacaosoft.web.fc2.com/[/url]
# --------------------------------------------------------------------------
# == 概 要 ==
#
# : マップを1枚の画像にして保存します。
#
# --------------------------------------------------------------------------
# == 注意事項 ==
#
# ※ 画像保存に『PNG 保存』スクリプトが必要になります。
# ※ ゲーム配布時には、削除してください。
# ※ 撮影時にプレイヤーは非表示になります。
#
# --------------------------------------------------------------------------
# == 使用方法 ==
#
# ★ マップ画像を保存する
# マップ画面で F7 キーを押してください。
# 右下まで移動すると停止しますが、画像を保存しています。
# 画面が元に戻るまで、しばらくお持ちください。
# 画像は、ゲームフォルダに保存されます。
#
# ※ キーを変更するには、:F7 で検索してください。
# 1箇所のみ引っかかるので、そこを変更してください。
#
#
#******************************************************************************
#/////////////////////////////////////////////////////////////////////////////#
# #
# 下記のスクリプトを変更する必要はありません。 #
# #
#/////////////////////////////////////////////////////////////////////////////#
class Sprite_Character < Sprite_Base
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update_snap
self.x = @character.screen_x
self.y = @character.screen_y
self.z = @character.screen_z
self.visible = !@character.transparent
if @balloon_duration > 0
@balloon_sprite.x = x
@balloon_sprite.y = y - height
@balloon_sprite.z = z + 200
end
end
end
class Spriteset_Map
#--------------------------------------------------------------------------
# ●
#--------------------------------------------------------------------------
def update_snap
@tilemap.ox = $game_map.display_x * 32
@tilemap.oy = $game_map.display_y * 32
@parallax.ox = $game_map.parallax_ox(@parallax.bitmap)
@parallax.oy = $game_map.parallax_oy(@parallax.bitmap)
@character_sprites.each {|sprite| sprite.update_snap }
airship = $game_map.airship
@shadow_sprite.x = airship.screen_x
@shadow_sprite.y = airship.screen_y + airship.altitude
@shadow_sprite.opacity = airship.altitude * 8
Graphics.update
end
end
class Scene_Map < Scene_Base
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias _cao_mapshot_update update
def update
_cao_mapshot_update
map_shop if Input.press?(:F7)
end
#--------------------------------------------------------------------------
# ●
#--------------------------------------------------------------------------
def map_shop
# プレイヤーを非表示
last_player_transparent = $game_player.transparent
$game_player.transparent = true
# マップの撮影
bitmap = Bitmap.new($game_map.width * 32, $game_map.height * 32)
screen_width = $game_map.screen_tile_x
screen_height = $game_map.screen_tile_y
($game_map.width / screen_width.to_f).ceil.times do |x|
($game_map.height / screen_height.to_f).ceil.times do |y|
$game_map.set_display_pos(screen_width * x, screen_height * y)
@spriteset.update_snap
dx = $game_map.display_x * 32
dy = $game_map.display_y * 32
snap = Graphics.snap_to_bitmap
bitmap.blt(dx, dy, snap, snap.rect)
end
end
# マップ画像の保存
Graphics.update
filename = sprintf('ground%03d-1.png', $game_map.map_id,$game_map.display_name)
bitmap.save_png(filename)
puts "`#{filename}' 保存完了!"
# プレイヤーの状態を戻す
$game_player.transparent = last_player_transparent
$game_player.center($game_player.x, $game_player.y)
$game_player.update
end
end