[GameMaker] Mobileでのスクリーンショット取得

screen_save、screen_save_partではうまく取得できない。

GameMaker: Studio v1.4.1763

画面全体のキャプチャ用に、screen_saveと、screen_save_partが用意されていますが、AndroidとiOSではうまく動作しませんでした。

GameMakerでは、View、Port、Screenと、3つの解像度があって、ゲームロジック上ではViewの座標を利用します。

Viewがベースで、Portは拡大表示サイズ、Screenはデバイスの解像度サイズ。

Portサイズは、ゲーム画面サイズの意味合いですが、mobileではあまり大きな意味を持っていなく、Windows上で実行した際のウィンドウ時のサイズなどになってます。
それぞれあまり意識しなくてよいので、これは自分の把握している仕様です。

ゲーム内からSNSなどへ共有を考えると、画面キャプチャ画像が欲しくなってきますよね!

前述したscreen_saveという便利な関数が用意されていますが、Android、iOSで実行したところ、拡大されたScreen画像の、Portサイズ部分が切り取られて保存されるという挙動で、まったく使えません。
screen_save_partで、座標とサイズを指定しても、最大サイズがPortサイズとなって、どうやっても全画面の保存ができませんでした。

・実際のゲーム画面(Androidのボリューム+電源ボタンでキャプチャしたもの)

・screen_saveで保存した画像

切り取られてますね!ただGUIは含まれています。

screenは、ゲーム画面とGUIを含む、描画されているすべてが対象ですが、ゲーム画面となるsurfaceのsurface_saveを利用すると、画面全体は保存可能でした。ただGUI描画が含まれません。

・surface_saveで保存した画像

全画面が一応保存できた!

というわけで、surfaceを画像ベースに利用すると、うまくできそうです。

結果として、画面に描画しているsurfaceをコピーし、そこに直接GUIを描画してから保存するという方法でうまくキャプチャできました。
キャプチャしたというより、別途作ったと。

// surfaceはportサイズなので、GUI配置場所を合わせるためのスケールを取得
scale = view_wport/view_wview;
// portサイズで新しいsurfaceを作成
surf = surface_create(view_wport, view_hport);
surface_copy(surf, 0, 0, application_surface);
surface_set_target(surf);

// 画像に含めたいGUIなどを描画
// GUI部品を、scale倍して描画、位置もscaleで合わせます。
draw_sprite_ext(sp_title, 0, 88*scale, 24*scale, scale, scale, 0, c_white, 1); 

...

// 作ったsurfaceをsprite化
ss_sprite = sprite_create_from_surface(surf, 0, 0, view_wport,view_hport, false, false, 0, 0);
 
surface_reset_target();
surface_free(surf);

// 作ったspriteを保存
sprite_save(ss_sprite, 0, "screenshot.png");


こういった利用の場合は、Text描画する場合に面倒そうなので、ViewとPortは同じスケールにすべきですかね。。うーむ。

と、少し変更。ViewとPortを同じサイズにしました。Viewサイズが小さい場合は、Windowsで動かすとかなーり小さなウィンドウになります。(最大化はできますが。)
mobile専用となりますかね。

Viewが小さい場合は、作られる画像も小さくなります。
なので、作ったsurfaceを最後に倍化してから、保存しました。

//2倍サイズの別のsurfaceを作成
surf2 = surface_create(view_wport*2, view_hport*2);

//作成済みのsurfを、surf2へ2倍で描画
surface_set_target(surf2);
draw_surface_ext(surf, 0, 0, 2, 2, 0, c_white, 1);

//倍化したsurf2をsprite化
ss_sprite = sprite_create_from_surface(surf2, 0, 0, view_wport*2,view_hport*2, false, false, 0, 0);

surface_reset_target();
surface_free(surf2);
surface_free(surf);

sprite_save(ss_sprite, 0, "screenshot.png");

整数倍だとドットもおかしくならないかと。一応どうにか動きました。

そもそもsurface_saveをDraw GUI後に呼んでもUIが描かれていないのは、、、、

application_surface

the application surface is now drawn to the back buffer by default (although you can switch this off)

もしや、これか、、、!?
試してません。

まぁ、前向きに考えると、スクリーンショットに含めるものを選別できて、追加もできるという、実は理想的なキャプチャ方法でしたかね!!。。。

色付きの透明部分のキャプチャが、これだとちょっとおかしくなりますので注意。色なしの透過部分は問題ないですが。

シェアする

  • このエントリーをはてなブックマークに追加

フォロミー

コメントをどうぞ

メールアドレスが公開されることはありません。