一時スクリーンショット
一時スクリーンショット機能は、UI要素が表示される前にクリーンなゲームシーンを撮影することで、セーブサムネイルがメニューやダイアログではなく実際のゲームプレイ内容を表示することを保証します。
概要
プレイヤーがセーブメニューを開くとき、現在の画面にはセーブサムネイルに表示されるべきではないUI要素が含まれています。一時スクリーンショットシステムは以下によってこの問題を解決します:
- 事前撮影: UIが表示される前にスクリーンショットを撮影
- 一時保存: スクリーンショットを一時的にメモリに保持
- 優先使用: 利用可能な場合、セーブ時に一時スクリーンショットを使用
- 自動クリーンアップ: 使用後に一時スクリーンショットを自動削除
使用パターン
基本的な使用方法
# シナリオスクリプト内で
scene classroom
show yuko happy center
yuko "なんて美しい日でしょう!"
# メニューを開く前にクリーンなスクリーンショットを撮影
capture
# UI操作は保存されるスクリーンショットに影響しません
ui save_menu show
プログラムによる使用
# UIを表示する前に
func show_pause_menu():
# 現在のゲーム状態を撮影
ArgodeSystem.capture_temp_screenshot()
# UIを表示 - これは撮影されません
pause_menu.show()
# セーブ時にクリーンなスクリーンショットを使用
func save_to_slot(slot: int, name: String):
ArgodeSystem.save_game(slot, name) # 利用可能であれば一時スクショを使用
自動撮影ヘルパー
# UIシステム用の組み込みヘルパー
func show_menu_with_capture(menu_name: String):
var save_manager = ArgodeSystem.SaveLoadManager
save_manager.auto_capture_before_ui(menu_name)
# メニューUIを表示
show_menu(menu_name)
技術詳細
保存とライフサイクル
- メモリのみ: スクリーンショットはRAMに保存、ディスクには保存されません
- Base64形式: 圧縮されたJPEGがBase64文字列としてエンコード
- 固定サイズ: サムネイルは200x150ピクセルにリサイズ
- 自動期限切れ: 使用されない場合、5分後にスクリーンショットが期限切れ
動作ロジック
# セーブ時に、システムは以下をチェックします:
func _get_screenshot_for_save() -> String:
if has_valid_temp_screenshot():
return temp_screenshot_data # 一時スクリーンショットを使用
else:
return capture_current_screen() # リアルタイム撮影にフォールバック
クリーンアップイベント
一時スクリーンショットは以下の場合に自動的にクリアされます:
- セーブ完了: 任意のスロットへの正常なセーブ後
- ロード完了: 任意のスロットからのロード後
- 期限切れ: 5分間の非活動後
- 手動クリア: コードで明示的にクリアされた時
API リファレンス
コアメソッド
# SaveLoadManagerメソッド
capture_temp_screenshot() -> bool # 一時スクリーンショットを撮影
has_temp_screenshot() -> bool # 有効な一時スクショの存在チェック
get_temp_screenshot_age() -> float # 経過時間を秒で取得
auto_capture_before_ui(ui_name: String) -> bool # UI操作用ヘルパー
# ArgodeSystemラッパーメソッド
ArgodeSystem.capture_temp_screenshot() -> bool
ArgodeSystem.has_temp_screenshot() -> bool
ArgodeSystem.clear_temp_screenshot()
設定定数
# SaveLoadManager.gd内
const ENABLE_SCREENSHOTS = true # スクリーンショット機能の有効/無効
const SCREENSHOT_WIDTH = 200 # サムネイル幅(ピクセル)
const SCREENSHOT_HEIGHT = 150 # サムネイル高さ(ピクセル)
const SCREENSHOT_QUALITY = 0.7 # JPEG品質(0.0-1.0)
const TEMP_SCREENSHOT_LIFETIME = 300.0 # 期限切れ時間(秒)(5分)
ベストプラクティス
撮影するタイミング
良いタイミング:
メニューアクセス前:
撮影すべきではないもの
以下の間は撮影を避けてください: - ローディング画面 - トランジション効果 - テキストボックスやダイアログ(クリーンな背景が欲しい場合) - その他のUI要素
セーブシステムとの統合
# セーブメニュー統合の例
class SaveMenu:
func _ready():
# このメニューを表示する前に撮影は既に完了
populate_save_slots()
func save_to_slot(slot: int):
var save_name = save_name_input.text
# メニューを開く前に撮影された一時スクリーンショットを使用
ArgodeSystem.save_game(slot, save_name)
# 一時スクリーンショットはセーブ後に自動的にクリア
close_menu()
トラブルシューティング
よくある問題
スクリーンショットが撮影されない:
- ENABLE_SCREENSHOTS が true かチェック
- ビューポートアクセス権限を確認
- capture コマンドが正常に実行されたか確認
スクリーンショットにUIが写る:
- UIを表示する前に capture が呼ばれているか確認
- タイミングをチェック - 撮影中にUIが表示されている可能性
スクリーンショットが期限切れになる:
- デフォルト寿命は5分間
- 実際にセーブする時により近いタイミングで撮影
- タイミングを確認するため get_temp_screenshot_age() をチェック
デバッグ情報
var save_manager = ArgodeSystem.SaveLoadManager
print("一時スクショあり: ", save_manager.has_temp_screenshot())
print("スクショ経過時間: ", save_manager.get_temp_screenshot_age(), " 秒")
print("スクショ機能有効: ", save_manager.is_screenshot_enabled())