マップ全体を画像保存

 2010-11-22
マップ画像を出力してみたよ。
とある場所で話題に上がってたので、
スクリプトを使ってやってみようと思いました。


スクリプトの使えるツクールでは、
1画面ごとにスクショとって繋げる必要もないです。
便利だな~。

下のスクリプトをコピペして、マップ上でF6キーを押してください。
現在のマップをそのまま画像として出力します。

動作に必要となるスクリプトは、Bitmap Class EXcacao service pack です。
サービスパックのほうは、大きいマップでなければ必要ありません。

class Game_Map
#--------------------------------------------------------------------------
# ○ 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :display_x # 表示 X 座標 * 256
attr_accessor :display_y # 表示 Y 座標 * 256
end

class Scene_Map
#--------------------------------------------------------------------------
# ○ フレーム更新
#--------------------------------------------------------------------------
alias _cao_update_ss update
def update
_cao_update_ss
map_shot if Input.trigger?(Input::F6)
end
#--------------------------------------------------------------------------
# ● マップ画像の保存
#--------------------------------------------------------------------------
def map_shot
print "マップ画像を出力します。\n",
"処理の完了までには、数分かかることもあります。\n",
"その間、パソコンの操作は一切行わないでください。"

max_width = $game_map.width * 256
max_height = $game_map.height * 256
screen_width = Graphics.width * 8
screen_height = Graphics.height * 8

bitmap = Bitmap.new($game_map.width * 32, $game_map.height * 32)

last_display_x = $game_map.display_x
last_display_y = $game_map.display_y
$game_map.display_x = 0
$game_map.display_y = 0

time = Time.now
while $game_map.display_y < max_height
while $game_map.display_x < max_width
$scene.update_basic
Graphics.wait(5)

ss = Graphics.snap_to_bitmap
bitmap.blt($game_map.display_x/8, $game_map.display_y/8, ss, ss.rect)

$game_map.display_x += screen_width
end
$game_map.display_x = 0
$game_map.display_y += screen_height
end

$game_map.display_x = last_display_x
$game_map.display_y = last_display_y
$scene.update_basic

sp = Sprite.new
pg = Sprite.new
Thread.new do
sp.bitmap = Bitmap.new("Graphics/System/MessageBack")
sp.y = (Graphics.height - sp.bitmap.height) / 2
sp.bitmap.draw_text(0, 104, 544, 24,
"長時間固まりますが、そのままでお待ちください。", 1)
sp.bitmap.font.size = 48
sp.bitmap.draw_text(0, 32, 544, 72, "ファイルに書き出し中", 1)

pg.bitmap = Bitmap.new(64, 64)
pg.bitmap.font.size = 60
pg.y = Graphics.height - 96
pg.bitmap.draw_text(pg.bitmap.rect, "◎")

loop do
Graphics.update
pg.x = (pg.x + 5) % 480
sleep(0.1)
end
end

name = load_data("Data/MapInfos.rvdata")[$game_map.map_id].name
bitmap.save_png("#{name}.png")
bitmap.dispose

sp.bitmap.dispose
sp.dispose
pg.bitmap.dispose
pg.dispose

time = Time.now - time
print "すべての処理が完了しました。\n(#{time} s)"
end
end

マップってサイズがデカイじゃないですか。
それで出力にすごく時間がかかるんですよね。

画面をまったく更新しなかったら、数十秒固まったままで、
すごく不安になるんですよね。
だから、現在読み込んでいる部分を画面に表示するようにしました。
これで、今何をしているのか分かって、安心です。

ところが、画像の出力に時間がかかる。。。
こんなときのためのプログレスバーだ!ということで、
ただ横に移動するだけの画像を表示させてみました。
処理状況なんてわかるわけ無いですから。。。
それでも。画面上で何かが動いているというのは、
すごく安心できますね。今処理してんだなーって。
処理落ちで不安定な動作ですけど、それがまた良い感じです。


処理中は、パソコンを操作しないでくださいね。
ツクールは、アクティブなときにしか処理を実行しないので、
いつまで経っても処理が終わらないってことになります。

あ、出力時に固まるって表示されると思いますが、
プログレスバー実装前のやつなんで、実際は◎が動いているはずです。
しばらく経っても微動だにしない場合は、どこかおかしいかも。。。

うちの環境では、FSMさんのサンプルマップの
「名もなきほこら」(35x43)の出力に8秒ほどかかりました。

今回は、やっつけ仕事でしちゃいましたけど、
おまけスクリプトとかにするときは、設定項目とか
波などの更新を止めて確実に同じ状態になるようにしたいですね。
今のところ update_basic で、何でも彼でも更新してますから。。。

まず問題ないと思うけど、どうしても波の動きが一致しないってときは、
Spriteset_Map の 190行目 @tilemap.update をコメントアウトすれば、
マップのアニメーションが停止するので、試してみてください。

スクリプトは、スクショ撮ったらコメントアウトなり削除してください。


[追記]
こちらのスクリプトは、ゲーム画面の保存の記事の方法で高速化できます。
マップ画像を出力する際の処理時間が大幅に短縮されますので、良ければこちらもご覧ください。
コメント




 

 ※ コメント内にURLを含めるには、バッククォート(`)をURLの直前に付け加えてください。


管理人のみ閲覧許可 [?]

トラックバック
トラックバックURL:
http://cacaosoft.blog42.fc2.com/tb.php/481-3a687716
≪ トップページへこのページの先頭へ  ≫
カレンダー
01 << 2017/03 >> 02
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -

カテゴリー
最近の記事
02/28 お返事
02/14 お返事
01/21 お返事
01/12 更新情報
11/28 お返事

最近のコメント
03/16 お返事
01/21 お返事
11/30 z座標
11/20 z座標
08/03 お返事

タグクラウド

リンク